1 from handler import Handler
2 import stat, errno, os, time
3 from cStringIO import StringIO
9 UMASK = os.umask(0); os.umask(UMASK)
14 __slots__ = ['attr', 'data']
16 def __init__(self, attr, data=None):
21 return mode2type(self.attr.mode)
24 self.attr.mtime = self.attr.atime = time.time()
30 self.attr.size = f.tell()
34 for nodeid in self.data.values():
35 nsubdirs += nodeid & 1
36 self.attr.nlink = 2 + nsubdirs
39 def newattr(s, mode=0666):
41 return fuse_attr(ino = INVALID_INO,
43 mode = s | (mode & ~UMASK),
44 nlink = 1 + (s == stat.S_IFDIR),
51 # ____________________________________________________________
55 def __init__(self, rootnode):
56 self.nodes = {FUSE_ROOT_ID: rootnode}
58 assert self.nextid > FUSE_ROOT_ID
60 def getnode(self, nodeid):
62 return self.nodes[nodeid]
64 raise IOError(errno.ESTALE, nodeid)
66 def forget(self, nodeid):
69 def cachenode(self, node):
72 if node.type() == TYPE_DIR:
77 def getattr(self, node):
78 return node.attr, INFINITE
80 def setattr(self, node, mode=None, uid=None, gid=None,
81 size=None, atime=None, mtime=None):
82 if mode is not None: node.attr.mode = (node.attr.mode&~0777) | mode
83 if uid is not None: node.attr.uid = uid
84 if gid is not None: node.attr.gid = gid
85 if atime is not None: node.attr.atime = atime
86 if mtime is not None: node.attr.mtime = mtime
87 if size is not None and node.type() == TYPE_REG:
91 def listdir(self, node):
92 for name, subnodeid in node.data.items():
93 subnode = self.nodes[subnodeid]
94 yield name, subnode.type()
96 def lookup(self, node, name):
98 return node.data[name], INFINITE
101 if hasattr(node, 'findnode'):
103 subnode = node.findnode(name)
107 id = self.cachenode(subnode)
110 raise IOError(errno.ENOENT, name)
112 def open(self, node, mode):
115 def mknod(self, node, name, mode):
116 subnode = Node(newattr(mode & 0170000, mode & 0777))
117 if subnode.type() == TYPE_REG:
118 subnode.data = StringIO()
120 raise NotImplementedError
121 id = self.cachenode(subnode)
126 def mkdir(self, node, name, mode):
127 subnode = Node(newattr(stat.S_IFDIR, mode & 0777), {})
128 id = self.cachenode(subnode)
133 def symlink(self, node, linkname, target):
134 subnode = Node(newattr(stat.S_IFLNK, 0777), target)
135 id = self.cachenode(subnode)
136 node.data[linkname] = id
140 def readlink(self, node):
141 assert node.type() == TYPE_LNK
144 def unlink(self, node, name):
148 raise IOError(errno.ENOENT, name)
153 def rename(self, oldnode, oldname, newnode, newname):
154 if newnode.type() != TYPE_DIR:
155 raise IOError(errno.ENOTDIR, newnode)
157 nodeid = oldnode.data.pop(oldname)
159 raise IOError(errno.ENOENT, oldname)
161 newnode.data[newname] = nodeid
164 def modified(self, node):
167 # ____________________________________________________________
169 if __name__ == '__main__':
170 root = Node(newattr(stat.S_IFDIR), {})
171 handler = Handler('/home/arigo/mnt', Filesystem(root))
172 handler.loop_forever()