#undef DEBUGf
#if 1
-#define DEBUGf(a...) fprintf(stderr, ##a)
+#define DEBUGf(f, a...) fprintf(stderr, "%s:%d (%i): " f,__BASE_FILE__,__LINE__,PL_stack_sp-PL_stack_base ,##a )
#else
#define DEBUGf(a...)
#endif
int _PLfuse_getattr(const char *file, struct stat *result) {
dSP;
int rv, statcount;
+ DEBUGf("getattr begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
}
FREETMPS;
LEAVE;
+ PUTBACK;
+ DEBUGf("getattr end: %i\n",sp-PL_stack_base);
return rv;
}
int _PLfuse_readlink(const char *file,char *buf,size_t buflen) {
int rv;
char *rvstr;
- dXSARGS;
- DEBUGf("readlink begin\n");
+ dSP;
+ I32 ax;
+ DEBUGf("readlink begin: %i\n",sp-PL_stack_base);
if(buflen < 1)
return EINVAL;
ENTER;
SPAGAIN;
if(!rv)
rv = -ENOENT;
- else
- if(SvTYPE(ST(0)) == SVt_IV)
- rv = POPi;
+ else {
+ SV *mysv = POPs;
+ DEBUGf("type = %i\n",SvTYPE(mysv));
+ if(SvTYPE(mysv) == SVt_IV || SvTYPE(mysv) == SVt_NV)
+ rv = SvIV(mysv);
else {
- strncpy(buf,POPp,buflen);
+ strncpy(buf,SvPV_nolen(mysv),buflen);
rv = 0;
}
+ }
FREETMPS;
LEAVE;
+ DEBUGf("ribbit3: %i (%s)\n",rv,buf);
buf[buflen-1] = 0;
- DEBUGf("readlink end\n");
+ PUTBACK;
+ DEBUGf("readlink end: %i\n",sp-PL_stack_base);
return rv;
}
int _PLfuse_getdir(const char *file, fuse_dirh_t dirh, fuse_dirfil_t dirfil) {
int prv, rv;
- dXSARGS;
- DEBUGf("getdir begin\n");
+ dSP;
+ DEBUGf("getdir begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
prv = call_sv(_PLfuse_callbacks[2],G_ARRAY);
SPAGAIN;
if(prv) {
- SV *mysv = sv_2mortal(POPs);
- if(!SvIOK(mysv)) {
- fprintf(stderr,"last getdir retval needs to be numeric (e.g. 0 or -ENOENT) (%s)\n",SvPV_nolen(mysv));
- rv = -ENOSYS;
- } else {
- rv = SvIV(mysv);
- while(--prv)
- dirfil(dirh,POPp,0);
- }
+ rv = POPi;
+ while(--prv)
+ dirfil(dirh,POPp,0);
} else {
fprintf(stderr,"getdir() handler returned nothing!\n");
rv = -ENOSYS;
}
FREETMPS;
LEAVE;
- DEBUGf("getdir end\n");
+ PUTBACK;
+ DEBUGf("getdir end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("mknod begin\n");
+ DEBUGf("mknod begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("mknod end: %i\n",rv);
+ PUTBACK;
+ DEBUGf("mknod end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("mkdir begin\n");
+ DEBUGf("mkdir begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("mkdir end\n");
+ PUTBACK;
+ DEBUGf("mkdir end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("unlink begin\n");
+ DEBUGf("unlink begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("unlink end\n");
+ PUTBACK;
+ DEBUGf("unlink end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("rmdir begin\n");
+ DEBUGf("rmdir begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("rmdir end\n");
+ PUTBACK;
+ DEBUGf("rmdir end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("symlink begin\n");
+ DEBUGf("symlink begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("symlink end\n");
+ PUTBACK;
+ DEBUGf("symlink end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("rename begin\n");
+ DEBUGf("rename begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("rename end\n");
+ PUTBACK;
+ DEBUGf("rename end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("link begin\n");
+ DEBUGf("link begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("link end\n");
+ PUTBACK;
+ DEBUGf("link end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("chmod begin\n");
+ DEBUGf("chmod begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("chmod end\n");
+ PUTBACK;
+ DEBUGf("chmod end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("chown begin\n");
+ DEBUGf("chown begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("chown end\n");
+ PUTBACK;
+ DEBUGf("chown end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("truncate begin\n");
+ DEBUGf("truncate begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("truncate end\n");
+ PUTBACK;
+ DEBUGf("truncate end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("utime begin\n");
+ DEBUGf("utime begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("utime end\n");
+ PUTBACK;
+ DEBUGf("utime end: %i\n",sp-PL_stack_base);
return rv;
}
SV *rvsv;
char *rvstr;
dSP;
- DEBUGf("open begin\n");
+ DEBUGf("open begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("open end: %i\n",rv);
+ PUTBACK;
+ DEBUGf("open end: %i %i\n",sp-PL_stack_base,rv);
return rv;
}
int rv;
char *rvstr;
dXSARGS;
- DEBUGf("read begin\n");
+ DEBUGf("read begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(off)));
PUTBACK;
rv = call_sv(_PLfuse_callbacks[15],G_SCALAR);
+ DEBUGf("k\n");
SPAGAIN;
if(!rv)
rv = -ENOENT;
else {
- SV *mysv = sv_2mortal(POPs);
- if(SvTYPE(mysv) == SVt_IV)
+ SV *mysv = POPs;
+ if(SvTYPE(mysv) == SVt_NV || SvTYPE(mysv) == SVt_IV)
rv = SvIV(mysv);
else {
- rv = SvCUR(mysv);
- if(rv > buflen)
+ if(buflen < (rv = SvCUR(mysv)))
croak("read() handler returned more than buflen! (%i > %i)",rv,buflen);
if(rv)
memcpy(buf,SvPV_nolen(mysv),rv);
}
}
- DEBUGf("read end\n");
+ FREETMPS;
+ LEAVE;
+ PUTBACK;
+ DEBUGf("read end: %i %i\n",sp-PL_stack_base,rv);
return rv;
}
int rv;
char *rvstr;
dSP;
- DEBUGf("write begin\n");
+ DEBUGf("write begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = 0;
FREETMPS;
LEAVE;
- DEBUGf("write end\n");
+ PUTBACK;
+ DEBUGf("write end: %i\n",sp-PL_stack_base);
return rv;
}
int rv;
char *rvstr;
dSP;
- DEBUGf("statfs begin\n");
+ DEBUGf("statfs begin: %i\n",sp-PL_stack_base);
ENTER;
SAVETMPS;
PUSHMARK(SP);
rv = -ENOSYS;
FREETMPS;
LEAVE;
- DEBUGf("statfs end\n");
+ PUTBACK;
+ DEBUGf("statfs end: %i\n",sp-PL_stack_base);
return rv;
}
croak("arg is not a code reference!");
}
}
+ printf("pre-main\n");
fuse_main(argc,argv,&fops);
+ printf("post-main\n");
use strict;
use Fuse;
+use IO::File;
use POSIX qw(ENOENT ENOSYS EEXIST EPERM O_RDONLY O_RDWR O_APPEND O_CREAT);
use Fcntl qw(S_ISBLK S_ISCHR S_ISFIFO);
my ($file) = fixup(shift);
debug("getattr $file");
return -ENOENT() unless -e $file;
- debug(stat($file));
- return (stat($file));
+ debug(lstat($file));
+ return (lstat($file));
}
sub x_getdir {
debug("open $file = $fd");
return $fd if $fd < 0;
POSIX::close($fd);
- debug("good: $fd");
return 0;
}
my ($file,$bufsize,$off) = @_;
debug("read",@_);
my ($rv) = -ENOSYS();
+ my ($handle) = new IO::File;
return -ENOENT() unless -e ($file = fixup($file));
- return -ENOSYS() unless sysopen(FILE,$file,O_RDONLY());
- if(sysseek(FILE,$off,0)) { sysread(FILE,$rv,$bufsize); }
- close(FILE);
+ return -ENOSYS() unless open($handle,$file);
+ if(seek($handle,$off,0)) {
+ read($handle,$rv,$bufsize);
+ }
debug("good");
return $rv;
}
sub err { return (-shift || -$!) }
-sub x_readlink { return err(readlink(fixup(shift)) ); }
+sub x_readlink { return readlink(fixup(shift) ); }
sub x_unlink { return unlink(fixup(shift)) ? 0 : -$!; }
sub x_rmdir { return err(rmdir(fixup(shift)) ); }
sub x_symlink { return err(symlink(fixup(shift),fixup(shift))); }
sub x_chmod { return err(chmod(fixup(shift),shift) ); }
sub x_chown { return err(chown(fixup(shift),shift,shift) ); }
sub x_chmod { return err(chmod(fixup(shift),shift) ); }
-sub x_truncate { return err(truncate(fixup(shift),shift) ); }
+sub x_truncate { return truncate(fixup(shift),shift) ? 0 : -$! ; }
sub x_utime { return utime($_[1],$_[2],fixup($_[0])) ? 0:-$!; }
sub x_mknod {
my ($mountpoint) = "";
$mountpoint = shift(@ARGV) if @ARGV;
-Fuse::main(mountpoint=>$mountpoint, getattr=>\&x_getattr, readlink=>\&readlink, getdir=>\&x_getdir, mknod=>\&x_mknod,
+Fuse::main(mountpoint=>$mountpoint, getattr=>\&x_getattr, readlink=>\&x_readlink, getdir=>\&x_getdir, mknod=>\&x_mknod,
mkdir=>\&x_mkdir, unlink=>\&x_unlink, rmdir=>\&x_rmdir, symlink=>\&x_symlink, rename=>\&x_rename, link=>\&x_link,
chmod=>\&x_chmod, chown=>\&x_chown, truncate=>\&x_truncate, utime=>\&x_utime, open=>\&x_open, read=>\&x_read, write=>\&x_write
);