diff options
author | Terence Daniel Honles <terence@honles.com> | 2012-07-15 13:44:21 -0700 |
---|---|---|
committer | Terence Daniel Honles <terence@honles.com> | 2012-07-15 13:45:45 -0700 |
commit | 3c639594cb3489d8eedae6ac9c2ecdcbe1da9da6 (patch) | |
tree | b6144405c3ebb429105c116c0f6a10f2f7bf0eda | |
parent | 2fbfe661a605b0878443558d4a080a10cf53ba20 (diff) | |
download | fusepy-3c639594cb3489d8eedae6ac9c2ecdcbe1da9da6.tar.gz |
fixing read method to properly return the actual amount read
-rw-r--r-- | fuse.py | 39 |
1 files changed, 26 insertions, 13 deletions
@@ -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), |