summaryrefslogtreecommitdiff
path: root/fuse.py
diff options
context:
space:
mode:
authorTerence Daniel Honles <terence@honles.com>2012-07-15 13:44:21 -0700
committerTerence Daniel Honles <terence@honles.com>2012-07-15 13:45:45 -0700
commit3c639594cb3489d8eedae6ac9c2ecdcbe1da9da6 (patch)
treeb6144405c3ebb429105c116c0f6a10f2f7bf0eda /fuse.py
parent2fbfe661a605b0878443558d4a080a10cf53ba20 (diff)
downloadfusepy-3c639594cb3489d8eedae6ac9c2ecdcbe1da9da6.tar.gz
fixing read method to properly return the actual amount read
Diffstat (limited to 'fuse.py')
-rw-r--r--fuse.py39
1 files changed, 26 insertions, 13 deletions
diff --git a/fuse.py b/fuse.py
index 3b91740..84868bb 100644
--- a/fuse.py
+++ b/fuse.py
@@ -411,6 +411,9 @@ class FUSE(object):
def readlink(self, path, buf, bufsize):
ret = self.operations('readlink', path).encode(self.encoding)
+
+ # copies a string into the given buffer
+ # (null terminated and truncated if necessary)
data = create_string_buffer(ret[:bufsize - 1])
memmove(buf, data, len(data))
return 0
@@ -475,9 +478,13 @@ class FUSE(object):
if not ret: return 0
- data = create_string_buffer(ret[:size], size)
- memmove(buf, data, size)
- return size
+ retsize = len(ret)
+ assert retsize <= size, \
+ 'actual amount read %d greater than expected %d' % (retsize, size)
+
+ data = create_string_buffer(ret, retsize)
+ memmove(buf, ret, retsize)
+ return retsize
def write(self, path, buf, size, offset, fip):
data = string_at(buf, size)
@@ -536,26 +543,32 @@ class FUSE(object):
.encode(self.encoding)
retsize = len(ret)
- buf = create_string_buffer(ret, retsize) # Does not add trailing 0
+ # allow size queries
+ if not value: return retsize
- if value:
- if retsize > size: return -ERANGE
+ # do not truncate
+ if retsize > size: return -ERANGE
- memmove(value, buf, retsize)
+ buf = create_string_buffer(ret, retsize) # Does not add trailing 0
+ memmove(value, buf, retsize)
return retsize
def listxattr(self, path, namebuf, size):
attrs = self.operations('listxattr', path.decode(self.encoding)) or ''
+ ret = '\x00'.join(attrs).encode(self.encoding) + '\x00'
+
+ retsize = len(ret)
+ # allow size queries
+ if not namebuf: return retsize
- buf = create_string_buffer('\x00'.join(attrs).encode(self.encoding))
- bufsize = len(buf)
- if namebuf:
- if bufsize > size: return -ERANGE
+ # do not truncate
+ if retsize > size: return -ERANGE
- memmove(namebuf, buf, bufsize)
+ buf = create_string_buffer(ret, retsize)
+ memmove(namebuf, buf, retsize)
- return bufsize
+ return retsize
def removexattr(self, path, name):
return self.operations('removexattr', path.decode(self.encoding),