aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Glines <mark@glines.org>2002-02-15 06:18:29 +0000
committerMark Glines <mark@glines.org>2002-02-15 06:18:29 +0000
commit9b6b44cdf08b59551ce06a97859d7beb4bb578c8 (patch)
tree56f06d0bbf65b517cd48b779362aa8eb9c9316fe
parent8ed09245417578c923df998bdc6a95412ad833c7 (diff)
downloadlibfuse-9b6b44cdf08b59551ce06a97859d7beb4bb578c8.tar.gz
fixed read(), finally!
-rw-r--r--perl/Fuse.xs10
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);