X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=Fuse.xs;h=4e1ab7ddc58ef4577c8ed5876a669bd399793d1e;hb=b9a7de5914e41bd3fa361f2e369690e6eb84ab1d;hp=4021f7d95ad222b42ccfe9a2b1aaf1fb19a960d1;hpb=68b94a8b8eda99bd54082864cd396e748c20eb77;p=perl-fuse.git diff --git a/Fuse.xs b/Fuse.xs index 4021f7d..4e1ab7d 100755 --- a/Fuse.xs +++ b/Fuse.xs @@ -3,6 +3,7 @@ #include "perl.h" #include "XSUB.h" +#include #include /* Determine if threads support should be included */ @@ -238,10 +239,7 @@ int _PLfuse_mknod (const char *file, mode_t mode, dev_t dev) { PUTBACK; rv = call_sv(MY_CXT.callback[3],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -262,10 +260,7 @@ int _PLfuse_mkdir (const char *file, mode_t mode) { PUTBACK; rv = call_sv(MY_CXT.callback[4],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -286,10 +281,7 @@ int _PLfuse_unlink (const char *file) { PUTBACK; rv = call_sv(MY_CXT.callback[5],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -309,10 +301,7 @@ int _PLfuse_rmdir (const char *file) { PUTBACK; rv = call_sv(MY_CXT.callback[6],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -333,10 +322,7 @@ int _PLfuse_symlink (const char *file, const char *new) { PUTBACK; rv = call_sv(MY_CXT.callback[7],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -357,10 +343,7 @@ int _PLfuse_rename (const char *file, const char *new) { PUTBACK; rv = call_sv(MY_CXT.callback[8],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -381,10 +364,7 @@ int _PLfuse_link (const char *file, const char *new) { PUTBACK; rv = call_sv(MY_CXT.callback[9],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -405,10 +385,7 @@ int _PLfuse_chmod (const char *file, mode_t mode) { PUTBACK; rv = call_sv(MY_CXT.callback[10],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -430,10 +407,7 @@ int _PLfuse_chown (const char *file, uid_t uid, gid_t gid) { PUTBACK; rv = call_sv(MY_CXT.callback[11],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -456,17 +430,15 @@ int _PLfuse_truncate (const char *file, off_t off) { #ifdef PERL_HAS_64BITINT XPUSHs(sv_2mortal(newSViv(off))); #else - asprintf(&temp, "%llu", off); + if (asprintf(&temp, "%llu", off) == -1) + croak("Memory allocation failure!"); XPUSHs(sv_2mortal(newSVpv(temp, 0))); free(temp); #endif PUTBACK; rv = call_sv(MY_CXT.callback[12],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -488,10 +460,7 @@ int _PLfuse_utime (const char *file, struct utimbuf *uti) { PUTBACK; rv = call_sv(MY_CXT.callback[13],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -517,11 +486,11 @@ int _PLfuse_open (const char *file, struct fuse_file_info *fi) { fi->fh = 0; /* Ensure it starts with 0 - important if they don't set it */ fihash = newHV(); #if FUSE_VERSION >= 24 - hv_store(fihash, "direct_io", 9, newSViv(fi->direct_io), 0); - hv_store(fihash, "keep_cache", 10, newSViv(fi->keep_cache), 0); + (void) hv_store(fihash, "direct_io", 9, newSViv(fi->direct_io), 0); + (void) hv_store(fihash, "keep_cache", 10, newSViv(fi->keep_cache), 0); #endif #if FUSE_VERSION >= 29 - hv_store(fihash, "nonseekable", 11, newSViv(fi->nonseekable), 0); + (void) hv_store(fihash, "nonseekable", 11, newSViv(fi->nonseekable), 0); #endif XPUSHs(sv_2mortal(newRV_noinc((SV*) fihash))); /* All hashref things done */ @@ -543,23 +512,14 @@ int _PLfuse_open (const char *file, struct fuse_file_info *fi) { /* Success, so copy the file handle which they returned */ #if FUSE_VERSION >= 24 SV **svp; - svp = hv_fetch(fihash, "direct_io", 9, 0); - if (svp != NULL) - { - fi->direct_io = SvIV(*svp); - } - svp = hv_fetch(fihash, "keep_cache", 10, 0); - if (svp != NULL) - { - fi->keep_cache = SvIV(*svp); - } + if ((svp = hv_fetch(fihash, "direct_io", 9, 0)) != NULL) + fi->direct_io = SvIV(*svp); + if ((svp = hv_fetch(fihash, "keep_cache", 10, 0)) != NULL) + fi->keep_cache = SvIV(*svp); #endif #if FUSE_VERSION >= 29 - svp = hv_fetch(fihash, "nonseekable", 11, 0); - if (svp != NULL) - { - fi->nonseekable = SvIV(*svp); - } + if ((svp = hv_fetch(fihash, "nonseekable", 11, 0)) != NULL) + fi->nonseekable = SvIV(*svp); #endif } FREETMPS; @@ -570,7 +530,8 @@ int _PLfuse_open (const char *file, struct fuse_file_info *fi) { return rv; } -int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off, struct fuse_file_info *fi) { +int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off, + struct fuse_file_info *fi) { int rv; #ifndef PERL_HAS_64BITINT char *temp; @@ -580,12 +541,13 @@ int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off, struct ENTER; SAVETMPS; PUSHMARK(SP); - XPUSHs(sv_2mortal(newSVpv(file,0))); + XPUSHs(file ? sv_2mortal(newSVpv(file,0)) : &PL_sv_undef); XPUSHs(sv_2mortal(newSViv(buflen))); #ifdef PERL_HAS_64BITINT XPUSHs(sv_2mortal(newSViv(off))); #else - asprintf(&temp, "%llu", off); + if (asprintf(&temp, "%llu", off) == -1) + croak("Memory allocation failure!"); XPUSHs(sv_2mortal(newSVpv(temp, 0))); free(temp); #endif @@ -629,12 +591,13 @@ int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off, ENTER; SAVETMPS; PUSHMARK(SP); - XPUSHs(sv_2mortal(newSVpv(file,0))); + XPUSHs(file ? sv_2mortal(newSVpv(file,0)) : &PL_sv_undef); XPUSHs(sv_2mortal(newSVpvn(buf,buflen))); #ifdef PERL_HAS_64BITINT XPUSHs(sv_2mortal(newSViv(off))); #else - asprintf(&temp, "%llu", off); + if (asprintf(&temp, "%llu", off) == -1) + croak("Memory allocation failure!"); XPUSHs(sv_2mortal(newSVpv(temp, 0))); free(temp); #endif @@ -642,10 +605,7 @@ int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off, PUTBACK; rv = call_sv(MY_CXT.callback[16],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -706,15 +666,12 @@ int _PLfuse_flush (const char *file, struct fuse_file_info *fi) { ENTER; SAVETMPS; PUSHMARK(SP); - XPUSHs(sv_2mortal(newSVpv(file,0))); + XPUSHs(file ? sv_2mortal(newSVpv(file,0)) : &PL_sv_undef); XPUSHs(FH_GETHANDLE(fi)); PUTBACK; rv = call_sv(MY_CXT.callback[18],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -731,16 +688,13 @@ int _PLfuse_release (const char *file, struct fuse_file_info *fi) { ENTER; SAVETMPS; PUSHMARK(SP); - XPUSHs(sv_2mortal(newSVpv(file,0))); + XPUSHs(file ? sv_2mortal(newSVpv(file,0)) : &PL_sv_undef); XPUSHs(sv_2mortal(newSViv(flags))); XPUSHs(FH_GETHANDLE(fi)); PUTBACK; rv = call_sv(MY_CXT.callback[19],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FH_RELEASEHANDLE(fi); FREETMPS; LEAVE; @@ -758,16 +712,13 @@ int _PLfuse_fsync (const char *file, int datasync, struct fuse_file_info *fi) { ENTER; SAVETMPS; PUSHMARK(SP); - XPUSHs(sv_2mortal(newSVpv(file,0))); + XPUSHs(file ? sv_2mortal(newSVpv(file,0)) : &PL_sv_undef); XPUSHs(sv_2mortal(newSViv(flags))); XPUSHs(FH_GETHANDLE(fi)); PUTBACK; rv = call_sv(MY_CXT.callback[20],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -790,10 +741,7 @@ int _PLfuse_setxattr (const char *file, const char *name, const char *buf, size_ PUTBACK; rv = call_sv(MY_CXT.callback[21],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -921,10 +869,7 @@ int _PLfuse_removexattr (const char *file, const char *name) { PUTBACK; rv = call_sv(MY_CXT.callback[24],G_SCALAR); SPAGAIN; - if(rv) - rv = POPi; - else - rv = 0; + rv = (rv ? POPi : 0); FREETMPS; LEAVE; PUTBACK; @@ -948,7 +893,7 @@ int _PLfuse_opendir(const char *file, struct fuse_file_info *fi) { SPAGAIN; if (rv) { if (rv > 1) { - FH_STOREHANDLE(fi, POPs); + FH_STOREHANDLE(fi, POPs); } rv = POPi; } else @@ -1192,10 +1137,8 @@ int _PLfuse_create(const char *file, mode_t mode, struct fuse_file_info *fi) { * which we can look at or modify. */ fihash = newHV(); -#if FUSE_VERSION >= 24 - (void) hv_store(fihash, "direct_io", 9, newSViv(fi->direct_io), 0); - (void) hv_store(fihash, "keep_cache", 10, newSViv(fi->keep_cache), 0); -#endif + (void) hv_store(fihash, "direct_io", 9, newSViv(fi->direct_io), 0); + (void) hv_store(fihash, "keep_cache", 10, newSViv(fi->keep_cache), 0); #if FUSE_VERSION >= 29 (void) hv_store(fihash, "nonseekable", 11, newSViv(fi->nonseekable), 0); #endif @@ -1217,18 +1160,13 @@ int _PLfuse_create(const char *file, mode_t mode, struct fuse_file_info *fi) { } if (rv == 0) { /* Success, so copy the file handle which they returned */ -#if FUSE_VERSION >= 24 SV **svp; - svp = hv_fetch(fihash, "direct_io", 9, 0); - if (svp != NULL) - fi->direct_io = SvIV(*svp); - svp = hv_fetch(fihash, "keep_cache", 10, 0); - if (svp != NULL) - fi->keep_cache = SvIV(*svp); -#endif + if ((svp = hv_fetch(fihash, "direct_io", 9, 0)) != NULL) + fi->direct_io = SvIV(*svp); + if ((svp = hv_fetch(fihash, "keep_cache", 10, 0)) != NULL) + fi->keep_cache = SvIV(*svp); #if FUSE_VERSION >= 29 - svp = hv_fetch(fihash, "nonseekable", 11, 0); - if (svp != NULL) + if ((svp = hv_fetch(fihash, "nonseekable", 11, 0)) != NULL) fi->nonseekable = SvIV(*svp); #endif } @@ -1369,15 +1307,15 @@ int _PLfuse_lock(const char *file, struct fuse_file_info *fi, int cmd, /* Need to copy back any altered values from the hash into * the struct... */ SV **svp; - if ((svp = hv_fetch(lihash, "l_type", 6, 0))) + if ((svp = hv_fetch(lihash, "l_type", 6, 0)) != NULL) lockinfo->l_type = SvIV(*svp); - if ((svp = hv_fetch(lihash, "l_whence", 8, 0))) + if ((svp = hv_fetch(lihash, "l_whence", 8, 0)) != NULL) lockinfo->l_whence = SvIV(*svp); - if ((svp = hv_fetch(lihash, "l_start", 7, 0))) + if ((svp = hv_fetch(lihash, "l_start", 7, 0)) != NULL) lockinfo->l_start = SvNV(*svp); - if ((svp = hv_fetch(lihash, "l_len", 5, 0))) + if ((svp = hv_fetch(lihash, "l_len", 5, 0)) != NULL) lockinfo->l_len = SvNV(*svp); - if ((svp = hv_fetch(lihash, "l_pid", 5, 0))) + if ((svp = hv_fetch(lihash, "l_pid", 5, 0)) != NULL) lockinfo->l_pid = SvIV(*svp); } FREETMPS; @@ -1518,6 +1456,7 @@ mknod: _PLfuse_mknod, mkdir: _PLfuse_mkdir, unlink: _PLfuse_unlink, rmdir: _PLfuse_rmdir, +symlink: _PLfuse_symlink, rename: _PLfuse_rename, link: _PLfuse_link, chmod: _PLfuse_chmod, @@ -1615,9 +1554,14 @@ fuse_get_context() 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); + (void) hv_store(hash, "uid", 3, newSViv(fc->uid), 0); + (void) hv_store(hash, "gid", 3, newSViv(fc->gid), 0); + (void) hv_store(hash, "pid", 3, newSViv(fc->pid), 0); + if (fc->private_data) + (void) hv_store(hash, "private", 7, fc->private_data, 0); +#if FUSE_VERSION >= 28 + (void) hv_store(hash, "umask", 5, newSViv(fc->umask), 0); +#endif /* FUSE_VERSION >= 28 */ RETVAL = newRV_noinc((SV*)hash); } else { XSRETURN_UNDEF; @@ -1632,6 +1576,20 @@ fuse_version() OUTPUT: RETVAL +SV * +XATTR_CREATE() + CODE: + RETVAL = newSViv(XATTR_CREATE); + OUTPUT: + RETVAL + +SV * +XATTR_REPLACE() + CODE: + RETVAL = newSViv(XATTR_REPLACE); + OUTPUT: + RETVAL + void perl_fuse_main(...) PREINIT: @@ -1685,7 +1643,7 @@ perl_fuse_main(...) } else if(SvOK(var)) { croak("invalid callback (%i) passed to perl_fuse_main " "(%s is not a string, code ref, or undef).\n", - i+4,SvPVbyte_nolen(var)); + i+5,SvPVbyte_nolen(var)); } else { MY_CXT.callback[i] = NULL; } @@ -1695,9 +1653,12 @@ perl_fuse_main(...) * to hack on compatibility with other parts of the new API. First and * foremost, real C argc/argv would be good to get at... */ - if (mountopts && - (fuse_opt_add_arg(&args, "") == -1 || - fuse_opt_add_arg(&args, "-o") == -1 || + if ((mountopts || debug) && fuse_opt_add_arg(&args, "") == -1) { + fuse_opt_free_args(&args); + croak("out of memory\n"); + } + if (mountopts && strcmp("", mountopts) && + (fuse_opt_add_arg(&args, "-o") == -1 || fuse_opt_add_arg(&args, mountopts) == -1)) { fuse_opt_free_args(&args); croak("out of memory\n");