--- perl-llin/Fuse.xs 2006/01/17 17:00:12 85 +++ perl-llin/Fuse.xs 2007/01/20 12:21:12 108 @@ -17,14 +17,14 @@ } } } -# define FUSE_CONTEXT_PRE create_perl_context(); { +# define FUSE_CONTEXT_PRE create_perl_context(); { dSP # define FUSE_CONTEXT_POST } # define FUSE_USE_ITHREADS # else # error "Sorry, I don't know how to handle ithreads on this architecture." # endif #else -# define FUSE_CONTEXT_PRE +# define FUSE_CONTEXT_PRE dSP # define FUSE_CONTEXT_POST #endif #include @@ -40,9 +40,8 @@ SV *_PLfuse_callbacks[N_CALLBACKS]; int _PLfuse_getattr(const char *file, struct stat *result) { - int rv, statcount; + int rv; FUSE_CONTEXT_PRE; - dSP; DEBUGf("getattr begin: %s\n",file); ENTER; SAVETMPS; @@ -71,7 +70,7 @@ result->st_uid = POPi; result->st_nlink = POPi; result->st_mode = POPi; - /*result->st_ino =*/ POPi; + result->st_ino = POPi; result->st_dev = POPi; rv = 0; } @@ -85,10 +84,7 @@ int _PLfuse_readlink(const char *file,char *buf,size_t buflen) { int rv; - char *rvstr; - I32 ax; FUSE_CONTEXT_PRE; - dSP; if(buflen < 1) return EINVAL; DEBUGf("readlink begin\n"); @@ -129,7 +125,6 @@ int _PLfuse_getdir(const char *file, fuse_dirh_t dirh, fuse_dirfil_t dirfil) { int prv, rv; FUSE_CONTEXT_PRE; - dSP; DEBUGf("getdir begin\n"); ENTER; SAVETMPS; @@ -156,10 +151,7 @@ int _PLfuse_mknod (const char *file, mode_t mode, dev_t dev) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("mknod begin\n"); ENTER; SAVETMPS; @@ -184,10 +176,7 @@ int _PLfuse_mkdir (const char *file, mode_t mode) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("mkdir begin\n"); ENTER; SAVETMPS; @@ -212,10 +201,7 @@ int _PLfuse_unlink (const char *file) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("unlink begin\n"); ENTER; SAVETMPS; @@ -238,10 +224,7 @@ int _PLfuse_rmdir (const char *file) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("rmdir begin\n"); ENTER; SAVETMPS; @@ -264,10 +247,7 @@ int _PLfuse_symlink (const char *file, const char *new) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("symlink begin\n"); ENTER; SAVETMPS; @@ -291,10 +271,7 @@ int _PLfuse_rename (const char *file, const char *new) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("rename begin\n"); ENTER; SAVETMPS; @@ -318,10 +295,7 @@ int _PLfuse_link (const char *file, const char *new) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("link begin\n"); ENTER; SAVETMPS; @@ -345,10 +319,7 @@ int _PLfuse_chmod (const char *file, mode_t mode) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("chmod begin\n"); ENTER; SAVETMPS; @@ -372,10 +343,7 @@ int _PLfuse_chown (const char *file, uid_t uid, gid_t gid) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("chown begin\n"); ENTER; SAVETMPS; @@ -400,10 +368,7 @@ int _PLfuse_truncate (const char *file, off_t off) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("truncate begin\n"); ENTER; SAVETMPS; @@ -427,10 +392,7 @@ int _PLfuse_utime (const char *file, struct utimbuf *uti) { int rv; - SV *rvsv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("utime begin\n"); ENTER; SAVETMPS; @@ -455,11 +417,8 @@ int _PLfuse_open (const char *file, struct fuse_file_info *fi) { int rv; - SV *rvsv; - char *rvstr; int flags = fi->flags; FUSE_CONTEXT_PRE; - dSP; DEBUGf("open begin\n"); ENTER; SAVETMPS; @@ -483,9 +442,7 @@ int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off, struct fuse_file_info *fi) { int rv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("read begin\n"); ENTER; SAVETMPS; @@ -524,9 +481,7 @@ int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off, struct fuse_file_info *fi) { int rv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("write begin\n"); ENTER; SAVETMPS; @@ -551,9 +506,7 @@ int _PLfuse_statfs (const char *file, struct statvfs *st) { int rv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("statfs begin\n"); ENTER; SAVETMPS; @@ -598,9 +551,7 @@ int _PLfuse_flush (const char *file, struct fuse_file_info *fi) { int rv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("flush begin\n"); ENTER; SAVETMPS; @@ -623,10 +574,8 @@ int _PLfuse_release (const char *file, struct fuse_file_info *fi) { int rv; - char *rvstr; int flags = fi->flags; FUSE_CONTEXT_PRE; - dSP; DEBUGf("release begin\n"); ENTER; SAVETMPS; @@ -650,10 +599,8 @@ int _PLfuse_fsync (const char *file, int datasync, struct fuse_file_info *fi) { int rv; - char *rvstr; int flags = fi->flags; FUSE_CONTEXT_PRE; - dSP; DEBUGf("fsync begin\n"); ENTER; SAVETMPS; @@ -677,9 +624,7 @@ int _PLfuse_setxattr (const char *file, const char *name, const char *buf, size_t buflen, int flags) { int rv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("setxattr begin\n"); ENTER; SAVETMPS; @@ -705,9 +650,7 @@ int _PLfuse_getxattr (const char *file, const char *name, char *buf, size_t buflen) { int rv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("getxattr begin\n"); ENTER; SAVETMPS; @@ -750,9 +693,7 @@ int _PLfuse_listxattr (const char *file, char *list, size_t size) { int prv, rv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("listxattr begin\n"); ENTER; SAVETMPS; @@ -768,7 +709,6 @@ char *p = list; int spc = size; int total_len = 0; - int i; rv = POPi; prv--; @@ -817,9 +757,7 @@ int _PLfuse_removexattr (const char *file, const char *name) { int rv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("removexattr begin\n"); ENTER; SAVETMPS; @@ -875,19 +813,35 @@ MODULE = Fuse PACKAGE = Fuse PROTOTYPES: DISABLE +SV* +fuse_get_context() + PREINIT: + struct fuse_context *fc; + CODE: + fc = fuse_get_context(); + if(fc) { + HV *hash = newHV(); + hv_store(hash, "uid", 3, newSViv(fc->uid), 0); + hv_store(hash, "gid", 3, newSViv(fc->gid), 0); + hv_store(hash, "pid", 3, newSViv(fc->pid), 0); + RETVAL = newRV_noinc((SV*)hash); + } else { + XSRETURN_UNDEF; + } + OUTPUT: + RETVAL + void perl_fuse_main(...) PREINIT: struct fuse_operations fops = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; - int i, fd, varnum = 0, debug, threaded, have_mnt; + int i, fd, debug, threaded; char *mountpoint; char *mountopts; struct fuse_args margs = FUSE_ARGS_INIT(0, NULL); struct fuse_args fargs = FUSE_ARGS_INIT(0, NULL); - STRLEN n_a; - STRLEN l; INIT: if(items != 29) { fprintf(stderr,"Perl<->C inconsistency or internal error\n"); @@ -898,7 +852,7 @@ threaded = SvIV(ST(1)); if(threaded) { #ifdef FUSE_USE_ITHREADS - master_interp = PERL_GET_INTERP; + master_interp = PERL_GET_CONTEXT; #else fprintf(stderr,"FUSE warning: Your script has requested multithreaded " "mode, but your perl was not built with -Dusethreads. " @@ -942,15 +896,20 @@ fd = fuse_mount(mountpoint,&margs); fuse_opt_free_args(&margs); if(fd < 0) - croak("could not mount fuse filesystem!"); - if (debug && - (fuse_opt_add_arg(&fargs, "") == -1 || - fuse_opt_add_arg(&fargs, "-d") == -1)) { - fuse_opt_free_args(&fargs); - croak("out of memory\n"); + croak("could not mount fuse filesystem!\n"); + if (debug) { + if ( fuse_opt_add_arg(&fargs, "") == -1 || + fuse_opt_add_arg(&fargs, "-d") == -1) { + fuse_opt_free_args(&fargs); + croak("out of memory\n"); + } + } else { + if (fuse_opt_add_arg(&fargs, "") == -1) + croak("out of memory\n"); } + if(threaded) { - fuse_loop_mt(fuse_new(fd,&fargs,&fops,sizeof(fops)/sizeof(void*))); + fuse_loop_mt(fuse_new(fd,&fargs,&fops,sizeof(fops))); } else - fuse_loop(fuse_new(fd,&fargs,&fops,sizeof(fops)/sizeof(void*))); + fuse_loop(fuse_new(fd,&fargs,&fops,sizeof(fops))); fuse_opt_free_args(&fargs);