-
Notifications
You must be signed in to change notification settings - Fork 0
/
fileobjects.py
102 lines (77 loc) · 2.46 KB
/
fileobjects.py
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# coding: utf-8
import os
import stat
import time
import fuse
class DefaultStat(fuse.Stat):
def __init__(self, *args, **kwargs):
super(DefaultStat, self).__init__(*args, **kwargs)
# These fields are purely cosmetic
self.st_uid = os.getuid()
self.st_gid = os.getgid()
self.st_atime = int(time.time())
self.st_mtime = self.st_atime
self.st_ctime = self.st_atime
def touch(self):
self.st_atime = int(time.time())
self.st_mtime = self.st_atime
class DirStat(DefaultStat):
def __init__(self, *args, **kwargs):
super(DirStat, self).__init__(*args, **kwargs)
# Those two fields are require
self.st_mode = stat.S_IFDIR | 0555
self.st_nlink = 2
class FileStat(DefaultStat):
def __init__(self, *args, **kwargs):
super(FileStat, self).__init__(*args, **kwargs)
# Those two fields are require
self.st_mode = stat.S_IFREG | 0444
self.st_nlink = 1
class File(object):
def __init__(self, name, isWritable = False, content = b''):
self.stat = FileStat()
if isWritable:
self.stat.st_mode |= 0220
self.name = name
self._content = content
self.stat.st_size = len(content)
# This is what truncate should do to the content
@staticmethod
def cutextend(s, size):
s = s[:size]
s += b'\0' * (size - len(s))
return s
@property
def content(self):
self.stat.st_atime = int(time.time())
return self._content
@content.setter
def content(self, content):
self._content = content
self.stat.st_size = len(content)
self.stat.touch()
def read(self, size, offset):
return self.content[offset:offset+size]
def write(self, buf, offset):
c = self.content
c = c[:offset] + bytes(buf) + c[offset+len(buf):]
self.content = c
return len(buf)
def truncate(self, size):
self.content = self.cutextend(self.content, size)
class Directory(object):
def __init__(self, name, isWritable = False):
self.stat = DirStat()
if isWritable:
self.stat.st_mode |= 0220
self.name = name
self._files = {}
@property
def files(self):
self.stat.st_atime = int(time.time())
return self._files
@files.setter
def files(self, files):
self._files = files
self.stat.st_size = len(files)
self.stat.touch()