--- perl/trunk/Fuse.xs 2005/12/21 15:33:37 18 +++ perl-llin/Fuse.xs 2008/03/16 13:34:34 119 @@ -17,17 +17,17 @@ } } } -# 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 +#include #undef DEBUGf #if 0 @@ -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; @@ -65,13 +64,13 @@ result->st_ctime = POPi; result->st_mtime = POPi; result->st_atime = POPi; - result->st_size = POPi; + result->st_size = (size_t)POPi; result->st_rdev = POPi; result->st_gid = POPi; 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"); @@ -119,10 +115,16 @@ return rv; } +#if 0 +/* + * This doesn't yet work... we alwas get ENOSYS when trying to use readdir(). + * Well, of course, getdir() is fine as well. + */ + int _PLfuse_readdir(const char *file, void *dirh, fuse_fill_dir_t dirfil, off_t off, struct fuse_file_info *fi) { +#endif 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; @@ -134,7 +136,7 @@ if(prv) { rv = POPi; while(--prv) - dirfil(dirh,POPp,0); + dirfil(dirh,POPp,0,0); } else { fprintf(stderr,"getdir() handler returned nothing!\n"); rv = -ENOSYS; @@ -149,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; @@ -177,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; @@ -205,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; @@ -231,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; @@ -257,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; @@ -284,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; @@ -311,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; @@ -338,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; @@ -365,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; @@ -393,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; @@ -420,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; @@ -446,12 +415,10 @@ return rv; } -int _PLfuse_open (const char *file, int flags) { +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; @@ -473,11 +440,9 @@ return rv; } -int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off) { +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; @@ -501,7 +466,7 @@ rv = 0; } if(rv > buflen) - croak("%i: read() handler returned more than buflen! (%i > %i)",getpid(),rv,buflen); + croak("read() handler returned more than buflen! (%i > %i)",rv,buflen); if(rv) memcpy(buf,SvPV_nolen(mysv),rv); } @@ -514,11 +479,9 @@ return rv; } -int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off) { +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; @@ -541,11 +504,9 @@ return rv; } -int _PLfuse_statfs (const char *file, struct statfs *st) { +int _PLfuse_statfs (const char *file, struct statvfs *st) { int rv; - char *rvstr; FUSE_CONTEXT_PRE; - dSP; DEBUGf("statfs begin\n"); ENTER; SAVETMPS; @@ -553,14 +514,22 @@ PUTBACK; rv = call_sv(_PLfuse_callbacks[17],G_ARRAY); SPAGAIN; - if(rv > 5) { - st->f_bsize = POPi; - st->f_bfree = POPi; - st->f_blocks = POPi; - st->f_ffree = POPi; - st->f_files = POPi; - st->f_namelen = POPi; - if(rv > 6) + DEBUGf("statfs got %i params\n",rv); + if(rv == 6 || rv == 7) { + st->f_bsize = POPi; + st->f_bfree = POPi; + st->f_blocks = POPi; + st->f_ffree = POPi; + st->f_files = POPi; + st->f_namemax = POPi; + /* zero and fill-in other */ + st->f_fsid = 0; + st->f_frsize = 4096; + st->f_flag = 0; + st->f_bavail = st->f_bfree; + st->f_favail = st->f_ffree; + + if(rv == 7) rv = POPi; else rv = 0; @@ -580,11 +549,9 @@ return rv; } -int _PLfuse_flush (const char *file) { +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; @@ -605,11 +572,10 @@ return rv; } -int _PLfuse_release (const char *file, int flags) { +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; @@ -631,11 +597,10 @@ return rv; } -int _PLfuse_fsync (const char *file, int flags) { +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; @@ -659,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; @@ -687,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; @@ -732,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; @@ -750,7 +709,6 @@ char *p = list; int spc = size; int total_len = 0; - int i; rv = POPi; prv--; @@ -799,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; @@ -827,6 +783,9 @@ getattr: _PLfuse_getattr, readlink: _PLfuse_readlink, getdir: _PLfuse_getdir, +#if 0 +readdir: _PLfuse_readdir, +#endif mknod: _PLfuse_mknod, mkdir: _PLfuse_mkdir, unlink: _PLfuse_unlink, @@ -854,15 +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; + 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, debug, threaded; char *mountpoint; char *mountopts; - STRLEN n_a; - STRLEN l; + struct fuse_args margs = FUSE_ARGS_INIT(0, NULL); + struct fuse_args fargs = FUSE_ARGS_INIT(0, NULL); INIT: if(items != 29) { fprintf(stderr,"Perl<->C inconsistency or internal error\n"); @@ -873,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. " @@ -885,21 +864,52 @@ mountopts = SvPV_nolen(ST(3)); for(i=0;i