diff options
author | Mark Glines <mark@glines.org> | 2002-02-15 06:18:29 +0000 |
---|---|---|
committer | Mark Glines <mark@glines.org> | 2002-02-15 06:18:29 +0000 |
commit | 9b6b44cdf08b59551ce06a97859d7beb4bb578c8 (patch) | |
tree | 56f06d0bbf65b517cd48b779362aa8eb9c9316fe | |
parent | 8ed09245417578c923df998bdc6a95412ad833c7 (diff) | |
download | libfuse-9b6b44cdf08b59551ce06a97859d7beb4bb578c8.tar.gz |
fixed read(), finally!
-rw-r--r-- | perl/Fuse.xs | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/perl/Fuse.xs b/perl/Fuse.xs index 9d0fa9b..23f87ae 100644 --- a/perl/Fuse.xs +++ b/perl/Fuse.xs @@ -435,7 +435,7 @@ int _PLfuse_open (const char *file, int flags) { int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off) { int rv; char *rvstr; - dXSARGS; + dSP; DEBUGf("read begin: %i\n",sp-PL_stack_base); ENTER; SAVETMPS; @@ -445,7 +445,6 @@ int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off) { XPUSHs(sv_2mortal(newSViv(off))); PUTBACK; rv = call_sv(_PLfuse_callbacks[15],G_SCALAR); - DEBUGf("k\n"); SPAGAIN; if(!rv) rv = -ENOENT; @@ -454,7 +453,12 @@ int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off) { if(SvTYPE(mysv) == SVt_NV || SvTYPE(mysv) == SVt_IV) rv = SvIV(mysv); else { - if(buflen < (rv = SvCUR(mysv))) + if(SvPOK(mysv)) { + rv = SvCUR(mysv); + } else { + rv = 0; + } + if(rv > buflen) croak("read() handler returned more than buflen! (%i > %i)",rv,buflen); if(rv) memcpy(buf,SvPV_nolen(mysv),rv); |