From 8b2004910e07380e254645821ec3db75fa255f95 Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 22 Feb 2024 23:04:50 +0100 Subject: [PATCH] Make hello example work --- eufs/main.py | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/eufs/main.py b/eufs/main.py index 46b4ca5..e079e36 100644 --- a/eufs/main.py +++ b/eufs/main.py @@ -1,2 +1,88 @@ +import errno +import os +import stat + +import fuse + +fuse.fuse_python_api = (0, 2) + + +# For debugging + +f = open("log.txt", "w") + + +def log(str): + f.write(f"{str}\n") + f.flush() + + +hello_path = "/hello" +hello_str = b"Hello World!\n" + + +class MyStat(fuse.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 HelloFS(fuse.Fuse): + def getattr(self, path): + log(f"getattr: {path!r}") + st = MyStat() + if path == "/": + st.st_mode = stat.S_IFDIR | 0o755 + st.st_nlink = 2 + elif path == hello_path: + st.st_mode = stat.S_IFREG | 0o444 + st.st_nlink = 1 + st.st_size = len(hello_str) + else: + return -errno.ENOENT + return st + + def readdir(self, path, offset): + log(f"readdir: {path!r} {offset!r}") + for r in ".", "..", hello_path[1:]: + yield fuse.Direntry(r) + + def open(self, path, flags): + log(f"open: {path!r} {flags!r}") + if path != hello_path: + return -errno.ENOENT + accmode = os.O_RDONLY | os.O_WRONLY | os.O_RDWR + if (flags & accmode) != os.O_RDONLY: + return -errno.EACCES + + def read(self, path, size, offset): + log(f"read: {path!r} {size!r} {offset!r}") + if path != hello_path: + return -errno.ENOENT + slen = len(hello_str) + if offset < slen: + if offset + size > slen: + size = slen - offset + buf = hello_str[offset : offset + size] + else: + buf = b"" + return buf + + def main(): - print("Hello world!") + server = HelloFS(version="%prog " + fuse.__version__, dash_s_do="setsingle") + + server.parse(errex=1) + server.main() + + +if __name__ == "__main__": + main()