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;
}