]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - contrib/fuse/impl_b/pyfuse/test.py
b0b07b27d5e1f25325cd447e2bda9f24f677d3c3
[tahoe-lafs/tahoe-lafs.git] / contrib / fuse / impl_b / pyfuse / test.py
1 from handler import Handler
2 import stat, errno, os, time
3 from cStringIO import StringIO
4 from kernel import *
5
6
7 UID = os.getuid()
8 GID = os.getgid()
9 UMASK = os.umask(0); os.umask(UMASK)
10 INFINITE = 86400.0
11
12
13 class Node(object):
14     __slots__ = ['attr', 'data']
15
16     def __init__(self, attr, data=None):
17         self.attr = attr
18         self.data = data
19
20     def type(self):
21         return mode2type(self.attr.mode)
22
23     def modified(self):
24         self.attr.mtime = self.attr.atime = time.time()
25         t = self.type()
26         if t == TYPE_REG:
27             f = self.data
28             pos = f.tell()
29             f.seek(0, 2)
30             self.attr.size = f.tell()
31             f.seek(pos)
32         elif t == TYPE_DIR:
33             nsubdirs = 0
34             for nodeid in self.data.values():
35                 nsubdirs += nodeid & 1
36             self.attr.nlink = 2 + nsubdirs
37
38
39 def newattr(s, mode=0666):
40     now = time.time()
41     return fuse_attr(ino   = INVALID_INO,
42                      size  = 0,
43                      mode  = s | (mode & ~UMASK),
44                      nlink = 1 + (s == stat.S_IFDIR),
45                      atime = now,
46                      mtime = now,
47                      ctime = now,
48                      uid   = UID,
49                      gid   = GID)
50
51 # ____________________________________________________________
52
53 class Filesystem:
54
55     def __init__(self, rootnode):
56         self.nodes = {FUSE_ROOT_ID: rootnode}
57         self.nextid = 2
58         assert self.nextid > FUSE_ROOT_ID
59
60     def getnode(self, nodeid):
61         try:
62             return self.nodes[nodeid]
63         except KeyError:
64             raise IOError(errno.ESTALE, nodeid)
65
66     def forget(self, nodeid):
67         pass
68
69     def cachenode(self, node):
70         id = self.nextid
71         self.nextid += 2
72         if node.type() == TYPE_DIR:
73             id += 1
74         self.nodes[id] = node
75         return id
76
77     def getattr(self, node):
78         return node.attr, INFINITE
79
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:
88             node.data.seek(size)
89             node.data.truncate()
90
91     def listdir(self, node):
92         for name, subnodeid in node.data.items():
93             subnode = self.nodes[subnodeid]
94             yield name, subnode.type()
95
96     def lookup(self, node, name):
97         try:
98             return node.data[name], INFINITE
99         except KeyError:
100             pass
101         if hasattr(node, 'findnode'):
102             try:
103                 subnode = node.findnode(name)
104             except KeyError:
105                 pass
106             else:
107                 id = self.cachenode(subnode)
108                 node.data[name] = id
109                 return  id, INFINITE
110         raise IOError(errno.ENOENT, name)
111
112     def open(self, node, mode):
113         return node.data
114
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()
119         else:
120             raise NotImplementedError
121         id = self.cachenode(subnode)
122         node.data[name] = id
123         node.modified()
124         return id, INFINITE
125
126     def mkdir(self, node, name, mode):
127         subnode = Node(newattr(stat.S_IFDIR, mode & 0777), {})
128         id = self.cachenode(subnode)
129         node.data[name] = id
130         node.modified()
131         return id, INFINITE
132
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
137         node.modified()
138         return id, INFINITE
139
140     def readlink(self, node):
141         assert node.type() == TYPE_LNK
142         return node.data
143
144     def unlink(self, node, name):
145         try:
146             del node.data[name]
147         except KeyError:
148             raise IOError(errno.ENOENT, name)
149         node.modified()
150
151     rmdir = unlink
152
153     def rename(self, oldnode, oldname, newnode, newname):
154         if newnode.type() != TYPE_DIR:
155             raise IOError(errno.ENOTDIR, newnode)
156         try:
157             nodeid = oldnode.data.pop(oldname)
158         except KeyError:
159             raise IOError(errno.ENOENT, oldname)
160         oldnode.modified()
161         newnode.data[newname] = nodeid
162         newnode.modified()
163
164     def modified(self, node):
165         node.modified()
166
167 # ____________________________________________________________
168
169 if __name__ == '__main__':
170     root = Node(newattr(stat.S_IFDIR), {})
171     handler = Handler('/home/arigo/mnt', Filesystem(root))
172     handler.loop_forever()