1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
# Example by github @vignedev from https://github.com/libfuse/python-fuse/issues/77
import fuse
import stat, errno
from fuse import Fuse, Stat, Direntry
fuse.fuse_python_api = (0, 2)
BROKEN_FILE = '/utf8_attr'
FATTR_NAME = 'user.xdg.comment'
FATTR_VALUE = 'ああ、メッセージは切り取られていない'
class EmptyStat(Stat):
def __init__(self):
self.st_mode = 0
self.st_ino = 0
self.st_dev = 0
self.st_nlink = 0
self.st_uid = 0
self.st_gid = 0
self.st_size = 0
self.st_atime = 0
self.st_mtime = 0
self.st_ctime = 0
class GetAttrBug(Fuse):
def getattr(self, path):
ret_stat = EmptyStat()
if path == '/':
ret_stat.st_mode = stat.S_IFDIR | int(0e755)
return ret_stat
if path == BROKEN_FILE:
ret_stat.st_mode = stat.S_IFREG | int(0e000)
return ret_stat
return -errno.ENOENT
def readdir(self, path, offset):
yield Direntry('.')
yield Direntry('..')
yield Direntry(BROKEN_FILE[1:])
def open(self, path, flags):
return -errno.EACCES
def read(self, path, size, offset):
return
def listxattr(self, path, size):
if size == 0: return 1
else: return [ FATTR_NAME ]
def getxattr(self, path, attr, size):
if size == 0: return len(FATTR_VALUE.encode('utf8'))
else: return FATTR_VALUE
if __name__ == '__main__':
server = GetAttrBug(dash_s_do='setsingle')
server.parse(errex=1)
server.main()
|