Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

//#include <u.h>
//#include <libc.h>
//#include <fcall.h>
//#include <thread.h>

//#include "9pclient.h"


#include <stdint.h>
#include "c9.h"

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

/*#include <fcall.h>

#include <sys/stat.h>
#include <sys/uio.h>
#include <sys/socket.h>
#include <sys/select.h>
*/

#define FUSE_USE_VERSION 27
#define PROGRAM "f9p"
#define VERSION "0.1.0"

#include <fuse.h>
#include <fuse_opt.h>

#include <pthread.h>

#include "sock.h"

//CFsys *fsys;
//CFid *fsysroot;
char *aname = "";

/*

void
watchfd(void *v)
{
        int fd = (int)(uintptr)v;

        // wait for exception (file closed) 
        fd_set set;
        FD_ZERO(&set);
        FD_SET(fd, &set);
        if(select(fd+1, NULL, NULL, &set, NULL) >= 0)
                threadexitsall(nil);
        return;
}
*/


C9ctx gctx;

uint8_t *(*read)(C9ctx *ctx, uint32_t size, int *err);

int (*end)(C9ctx *ctx) __attribute__((nonnull(1)));







void *f9p_init(struct fuse_conn_info *conn) {
/*    (void) conn;
    FuseZipData *data = (FuseZipData*)fuse_get_context()->private_data;
    syslog(LOG_INFO, "Mounting file system on %s (cwd=%s)", data->m_archiveName, data->m_cwd.c_str());
    return data;
*/

//      C9ctx * ctx = &gctx;
//      memset (ctx,0,sizeof(C9ctx));

        //ctx->end = 



//      printf ("Hey freaks! I am Init ! %d\n", pthread_self());

//      printf("FUSE f9p_init\n");
//      int fd;
//      chatty9pclient++;
//      char * addrstr = "172.16.66.250:900";
//      char * addrstr = "192.168.0.25:900";
//      struct sockaddr_storage sa;
//      if ( sock_strtoaddr(addrstr,&sa) != 1){
//              printf ("Error converting adress: %s\n",addrstr);
//              exit(0);
//      };

//      printf("Converted\n");


//      char *maddr = netmkaddr(addr,"tcp","564");

//      fd = dial(maddr, nil, nil, nil);
//      fprint(2,"FUSE init fd = %d\n",fd);
//      proccreate(watchfd, (void*)(uintptr)fd, 8192);

//      fsys = fsmount(fd, aname);
//      fprint(2,"FUSE oops\n");
//      fprint(2,"FUSE init p = %p\n",fsys);
//      fsysroot = fsroot(fsys);
//      print("FSYSROOT: %p\n",fsysroot);


//                      sysfatal("dial %s: %r", addr);
        return 0;       
}


int 
f9p_opendir(const char * dir, struct fuse_file_info * inf) {
        printf("FUSE f9p_opendir\n");

        return 0;
}


static int
f9p_getattr(const char *path, struct stat *st)
{
        printf("FUSE f9p_getattr for: %s\n",path);
/*
        if (strcmp(path, "/") == 0) {
                st->st_blksize = 512;
                st->st_mode = 0755;
                st->st_nlink = 2;
        } else if (strcmp(path, "/file") == 0) {
                st->st_mode = 0644;
                st->st_blksize = 512;
                st->st_nlink = 1;
                st->st_size = 5;
        } else {
                CFid *newfid;
                char mpath[500];
                strcpy(mpath,path);

                print ("Start fswalk %s\n",mpath);
//              newfid = fswalk(fsysroot, mpath);

                print ("FSWALK new fid = %p\n",newfid);




                return -ENOENT;
        }
*/
        return 0;
}



struct fuse_operations f9p_oper = {
        .init = f9p_init,
        .opendir = f9p_opendir,
        .getattr = f9p_getattr
        
};
/*    fusezip_oper.init       =   fusezip_init;
    fusezip_oper.destroy    =   fusezip_destroy;
    fusezip_oper.readdir    =   fusezip_readdir;
    fusezip_oper.getattr    =   fusezip_getattr;
    fusezip_oper.statfs     =   fusezip_statfs;
    fusezip_oper.open       =   fusezip_open;
    fusezip_oper.read       =   fusezip_read;
    fusezip_oper.write      =   fusezip_write;
    fusezip_oper.release    =   fusezip_release;
    fusezip_oper.unlink     =   fusezip_unlink;
    fusezip_oper.rmdir      =   fusezip_rmdir;
    fusezip_oper.mkdir      =   fusezip_mkdir;
    fusezip_oper.rename     =   fusezip_rename;
    fusezip_oper.create     =   fusezip_create;
    fusezip_oper.mknod      =   fusezip_mknod;
    fusezip_oper.chmod      =   fusezip_chmod;
    fusezip_oper.chown      =   fusezip_chown;
    fusezip_oper.flush      =   fusezip_flush;
    fusezip_oper.fsync      =   fusezip_fsync;
    fusezip_oper.fsyncdir   =   fusezip_fsyncdir;
    fusezip_oper.opendir    =   fusezip_opendir;
    fusezip_oper.releasedir =   fusezip_releasedir;
    fusezip_oper.access     =   fusezip_access;
    fusezip_oper.utimens    =   fusezip_utimens;
    fusezip_oper.ftruncate  =   fusezip_ftruncate;
    fusezip_oper.truncate   =   fusezip_truncate;
    fusezip_oper.setxattr   =   fusezip_setxattr;
    fusezip_oper.getxattr   =   fusezip_getxattr;
    fusezip_oper.listxattr  =   fusezip_listxattr;
    fusezip_oper.removexattr=   fusezip_removexattr;
    fusezip_oper.readlink   =   fusezip_readlink;
    fusezip_oper.symlink    =   fusezip_symlink;

#if FUSE_VERSION >= 28
    // don't allow NULL path
    fusezip_oper.flag_nullpath_ok = 0;
#endif

    struct fuse *fuse;
    char *mountpoint;
    // this flag ignored because libzip does not supports multithreading
    int multithreaded;
    int res;

    fuse = fuse_setup(args.argc, args.argv, &fusezip_oper, sizeof(fusezip_oper), &mountpoint, &multithreaded, data);
    fuse_opt_free_args(&args);
    if (fuse == NULL) {
        delete data;
        return EXIT_FAILURE;
    }
    res = fuse_loop(fuse);
    fuse_teardown(fuse, mountpoint);
    return (res == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
*/    


        
void
usage(void)
{
        printf( "usage: 9pfuse [-D] [-A attrtimeout] [-a aname] address mtpt\n");
        exit(1);
}

extern C9error c9version(C9ctx *c, C9tag *tag, uint32_t msize) __attribute__((nonnull(1, 2)));


int
main(int argc, char **argv)
{




        printf ("Hallo, I am %p\n",pthread_self());





        C9ctx * ctx;


        printf("FUSE f9p_init\n");
//      chatty9pclient++;
//      char * addrstr = "172.16.66.250:900";
//      char * addrstr = "192.168.0.25:900";



        ctx = sock_connect("192.168.0.25:900");
        if (ctx==NULL){
                perror("Can't connect");
        }

        C9tag tag;
        C9error e = c9version(ctx,&tag,8192);
        printf ("Return c9version %d\n",e);


        printf("Converted\n");
        exit(0);
















/*      ARGBEGIN{
        case 'D':
                chatty9pclient++;
                debug++;
                break;
        case 'A':
                attrtimeout = atof(EARGF(usage()));
                break;
        case 'a':
                aname = EARGF(usage());
                break;
        default:
                usage();
        }ARGEND

        if(argc != 2)
                usage();

        quotefmtinstall();
        fmtinstall('F', fcallfmt);
        fmtinstall('M', dirmodefmt);
        fmtinstall('G', fusefmt);

        setsid();       // won't be able to use console, but can't be interrupted 

        init9p(argv[0], aname);
        initfuse(argv[1]);

        fusechan = chancreate(sizeof(void*), 0);
        proccreate(fusedispatch, nil, STACK);
        sendp(fusechan, nil);   // sync 

        proccreate(fusereader, nil, STACK);
        // * Now that we're serving FUSE, we can wait
        // * for the mount to finish and exit back to the user.
        waitfuse();
*/      




        




        //struct fuse_args args = FUSE_ARGS_INIT(argc, argv);

//      struct fuse *fuse;
//      char *mountpoint = "/mnt";
//      int multithreaded=0;
  //    void *data = NULL;
        printf("start\n");
        
/*      if (fuse_opt_parse(&args, &data, NULL, NULL)) {
                fuse_opt_free_args(&args);
                return EXIT_FAILURE;
        }

*/

         fuse_main(argc,argv,&f9p_oper,NULL);

        printf("end\n");
        
/* 
        fuse = fuse_setup(argc, argv, &f9p_oper, sizeof(f9p_oper), &mountpoint, &multithreaded, data);
        if (fuse == NULL) {
                fprint(2,"Mist\n");
                return EXIT_FAILURE;
        }
        res = fuse_loop(fuse);
*/      
//      threadexits(0);
        return 0;
}