tessl install tessl/pypi-pyfuse3@3.4.0Python 3 bindings for libfuse 3 with async I/O support
Handling unusual scenarios and edge conditions.
async def rmdir(self, parent_inode, name, ctx):
"""Remove directory - must check if empty."""
inode = self._find_entry(parent_inode, name)
# Check if empty
if self.inodes[inode]['entries']:
raise pyfuse3.FUSEError(errno.ENOTEMPTY)
# Remove directory
del self.inodes[parent_inode]['entries'][name]
self.inodes[inode]['nlink'] -= 1async def unlink(self, parent_inode, name, ctx):
"""Remove file - may still be open."""
inode = self._find_entry(parent_inode, name)
# Remove from directory
del self.inodes[parent_inode]['entries'][name]
# Decrement nlink
self.inodes[inode]['nlink'] -= 1
# Don't delete yet - may be open or have kernel referencesasync def read(self, fh, offset, size):
"""Handle reads beyond EOF."""
data = self.inodes[fh]['data']
# Reading beyond EOF
if offset >= len(data):
return b''
# Partial read
return data[offset:offset + size]async def rename(self, parent_old, name_old, parent_new, name_new, flags, ctx):
"""Handle RENAME_NOREPLACE and RENAME_EXCHANGE."""
inode_old = self._find_entry(parent_old, name_old)
inode_new = self._find_entry(parent_new, name_new) if name_new in self.inodes[parent_new]['entries'] else None
# RENAME_NOREPLACE
if flags & pyfuse3.RENAME_NOREPLACE:
if inode_new is not None:
raise pyfuse3.FUSEError(errno.EEXIST)
# RENAME_EXCHANGE
if flags & pyfuse3.RENAME_EXCHANGE:
if inode_new is None:
raise pyfuse3.FUSEError(errno.ENOENT)
# Exchange both entries
self.inodes[parent_old]['entries'][name_old] = inode_new
self.inodes[parent_new]['entries'][name_new] = inode_old
return
# Standard rename
# ...