2 from handler import Handler
3 import stat, time, os, weakref, errno
4 from cStringIO import StringIO
7 class MemoryFS(object):
13 def __init__(self, attr):
15 self.contents = {} # { 'filename': Dir()/File()/SymLink() }
19 def __init__(self, attr):
21 self.data = StringIO()
23 class SymLink(object):
25 def __init__(self, attr, target):
30 def __init__(self, root=None):
31 self.uid = os.getuid()
32 self.gid = os.getgid()
33 self.umask = os.umask(0); os.umask(self.umask)
34 self.root = root or self.Dir(self.newattr(stat.S_IFDIR))
35 self.root.id = FUSE_ROOT_ID
36 self.nodes = weakref.WeakValueDictionary()
37 self.nodes[FUSE_ROOT_ID] = self.root
38 self.nextid = FUSE_ROOT_ID + 1
40 def newattr(self, s, ino=None, mode=0666):
42 attr = fuse_attr(size = 0,
43 mode = s | (mode & ~self.umask),
44 nlink = 1, # even on dirs! this confuses 'find' in
58 def getnode(self, id):
61 def modified(self, node):
62 node.attr.mtime = node.attr.atime = time.time()
63 if isinstance(node, self.File):
65 node.attr.size = node.data.tell()
67 def getattr(self, node):
68 return node.attr, self.INFINITE
70 def setattr(self, node, mode, uid, gid, size, atime, mtime):
72 node.attr.mode = (node.attr.mode & ~0777) | (mode & 0777)
78 assert isinstance(node, self.File)
80 oldsize = node.data.tell()
86 node.data.write('\x00' * (size - oldsize))
89 node.attr.atime = atime
91 node.attr.mtime = mtime
93 def listdir(self, node):
94 assert isinstance(node, self.Dir)
95 for name, subobj in node.contents.items():
96 yield name, subobj.type
98 def lookup(self, dirnode, filename):
100 return dirnode.contents[filename].id, self.INFINITE
102 raise IOError(errno.ENOENT, filename)
104 def open(self, filenode, flags):
107 def newnodeid(self, newnode):
111 self.nodes[id] = newnode
114 def mknod(self, dirnode, filename, mode):
115 node = self.File(self.newattr(stat.S_IFREG, mode=mode))
116 dirnode.contents[filename] = node
117 return self.newnodeid(node), self.INFINITE
119 def mkdir(self, dirnode, subdirname, mode):
120 node = self.Dir(self.newattr(stat.S_IFDIR, mode=mode))
121 dirnode.contents[subdirname] = node
122 return self.newnodeid(node), self.INFINITE
124 def symlink(self, dirnode, linkname, target):
125 node = self.SymLink(self.newattr(stat.S_IFLNK), target)
126 dirnode.contents[linkname] = node
127 return self.newnodeid(node), self.INFINITE
129 def unlink(self, dirnode, filename):
130 del dirnode.contents[filename]
134 def readlink(self, symlinknode):
135 return symlinknode.target
137 def rename(self, olddirnode, oldname, newdirnode, newname):
138 node = olddirnode.contents[oldname]
139 newdirnode.contents[newname] = node
140 del olddirnode.contents[oldname]
142 def getxattrs(self, node):
145 except AttributeError:
150 if __name__ == '__main__':
152 mountpoint = sys.argv[1]
153 memoryfs = MemoryFS()
154 handler = Handler(mountpoint, memoryfs)
155 handler.loop_forever()