aboutsummaryrefslogtreecommitdiffstats
path: root/perl/Fuse.xs
diff options
context:
space:
mode:
Diffstat (limited to 'perl/Fuse.xs')
-rw-r--r--perl/Fuse.xs89
1 files changed, 63 insertions, 26 deletions
diff --git a/perl/Fuse.xs b/perl/Fuse.xs
index 9770c3a..ca0459d 100644
--- a/perl/Fuse.xs
+++ b/perl/Fuse.xs
@@ -4,6 +4,12 @@
#include <fuse.h>
+#undef DEBUGf
+#if 1
+#define DEBUGf(a...) fprintf(stderr, ##a)
+#else
+#define DEBUGf(a...)
+#endif
static int
not_here(char *s)
{
@@ -30,33 +36,29 @@ int _PLfuse_getattr(const char *file, struct stat *result) {
PUTBACK;
rv = call_sv(_PLfuse_callbacks[0],G_ARRAY);
SPAGAIN;
- if(rv < 7) {
- if(rv > 1)
- croak("inappropriate number of returned values from getattr");
- if(rv)
+ if(rv != 13) {
+ if(rv > 1) {
+ fprintf(stderr,"inappropriate number of returned values from getattr\n");
+ rv = -ENOSYS;
+ } else if(rv)
rv = POPi;
else
- rv = -EINVAL;
+ rv = -ENOENT;
} else {
- if(rv > 9)
- croak("inappropriate number of returned values from getattr");
- result->st_ctime = result->st_mtime = result->st_atime = POPi;
- result->st_mode = POPi;
- result->st_nlink = POPi;
- result->st_uid = POPi;
- result->st_gid = POPi;
- result->st_size = POPi;
result->st_blocks = POPi;
- if(rv > 7) {
- if(rv > 8)
- result->st_blksize = POPi;
- else
- result->st_blksize = 1024;
- rv = POPi;
- } else {
- result->st_blksize = 1024;
- rv = 0;
- }
+ result->st_blksize = POPi;
+ result->st_ctime = POPi;
+ result->st_mtime = POPi;
+ result->st_atime = POPi;
+ result->st_size = 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_dev = POPi;
+ rv = 0;
}
FREETMPS;
LEAVE;
@@ -67,6 +69,9 @@ int _PLfuse_readlink(const char *file,char *buf,size_t buflen) {
int rv;
char *rvstr;
dXSARGS;
+ DEBUGf("readlink begin\n");
+ if(buflen < 1)
+ return EINVAL;
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -85,12 +90,15 @@ int _PLfuse_readlink(const char *file,char *buf,size_t buflen) {
}
FREETMPS;
LEAVE;
+ buf[buflen-1] = 0;
+ DEBUGf("readlink end\n");
return rv;
}
int _PLfuse_getdir(const char *file, fuse_dirh_t dirh, fuse_dirfil_t dirfil) {
int prv, rv;
dXSARGS;
+ DEBUGf("getdir begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -99,7 +107,7 @@ int _PLfuse_getdir(const char *file, fuse_dirh_t dirh, fuse_dirfil_t dirfil) {
prv = call_sv(_PLfuse_callbacks[2],G_ARRAY);
SPAGAIN;
if(prv) {
- SV *mysv = POPs;
+ 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;
@@ -114,6 +122,7 @@ int _PLfuse_getdir(const char *file, fuse_dirh_t dirh, fuse_dirfil_t dirfil) {
}
FREETMPS;
LEAVE;
+ DEBUGf("getdir end\n");
return rv;
}
@@ -122,6 +131,7 @@ int _PLfuse_mknod (const char *file, mode_t mode, dev_t dev) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("mknod begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -137,6 +147,7 @@ int _PLfuse_mknod (const char *file, mode_t mode, dev_t dev) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("mknod end: %i\n",rv);
return rv;
}
@@ -145,6 +156,7 @@ int _PLfuse_mkdir (const char *file, mode_t mode) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("mkdir begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -159,6 +171,7 @@ int _PLfuse_mkdir (const char *file, mode_t mode) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("mkdir end\n");
return rv;
}
@@ -168,6 +181,7 @@ int _PLfuse_unlink (const char *file) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("unlink begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -181,6 +195,7 @@ int _PLfuse_unlink (const char *file) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("unlink end\n");
return rv;
}
@@ -189,6 +204,7 @@ int _PLfuse_rmdir (const char *file) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("rmdir begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -202,6 +218,7 @@ int _PLfuse_rmdir (const char *file) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("rmdir end\n");
return rv;
}
@@ -210,6 +227,7 @@ int _PLfuse_symlink (const char *file, const char *new) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("symlink begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -224,6 +242,7 @@ int _PLfuse_symlink (const char *file, const char *new) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("symlink end\n");
return rv;
}
@@ -232,6 +251,7 @@ int _PLfuse_rename (const char *file, const char *new) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("rename begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -246,6 +266,7 @@ int _PLfuse_rename (const char *file, const char *new) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("rename end\n");
return rv;
}
@@ -254,6 +275,7 @@ int _PLfuse_link (const char *file, const char *new) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("link begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -268,6 +290,7 @@ int _PLfuse_link (const char *file, const char *new) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("link end\n");
return rv;
}
@@ -276,6 +299,7 @@ int _PLfuse_chmod (const char *file, mode_t mode) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("chmod begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -290,6 +314,7 @@ int _PLfuse_chmod (const char *file, mode_t mode) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("chmod end\n");
return rv;
}
@@ -298,6 +323,7 @@ int _PLfuse_chown (const char *file, uid_t uid, gid_t gid) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("chown begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -313,6 +339,7 @@ int _PLfuse_chown (const char *file, uid_t uid, gid_t gid) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("chown end\n");
return rv;
}
@@ -321,6 +348,7 @@ int _PLfuse_truncate (const char *file, off_t off) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("truncate begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -335,6 +363,7 @@ int _PLfuse_truncate (const char *file, off_t off) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("truncate end\n");
return rv;
}
@@ -343,6 +372,7 @@ int _PLfuse_utime (const char *file, struct utimbuf *uti) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("utime begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -358,6 +388,7 @@ int _PLfuse_utime (const char *file, struct utimbuf *uti) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("utime end\n");
return rv;
}
@@ -366,6 +397,7 @@ int _PLfuse_open (const char *file, int flags) {
SV *rvsv;
char *rvstr;
dSP;
+ DEBUGf("open begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -380,6 +412,7 @@ int _PLfuse_open (const char *file, int flags) {
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("open end: %i\n",rv);
return rv;
}
@@ -387,6 +420,7 @@ int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off) {
int rv;
char *rvstr;
dXSARGS;
+ DEBUGf("read begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -403,13 +437,14 @@ int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off) {
if(SvTYPE(mysv) == SVt_IV)
rv = SvIV(mysv);
else {
- rv = SvLEN(mysv);
+ rv = SvCUR(mysv);
if(rv > buflen)
- croak("read() handler returned more than buflen!");
+ croak("read() handler returned more than buflen! (%i > %i)",rv,buflen);
if(rv)
memcpy(buf,SvPV_nolen(mysv),rv);
}
}
+ DEBUGf("read end\n");
return rv;
}
@@ -417,6 +452,7 @@ int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off)
int rv;
char *rvstr;
dSP;
+ DEBUGf("write begin\n");
ENTER;
SAVETMPS;
PUSHMARK(SP);
@@ -432,6 +468,7 @@ int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off)
rv = 0;
FREETMPS;
LEAVE;
+ DEBUGf("write end\n");
return rv;
}