aboutsummaryrefslogtreecommitdiffstats
path: root/base.py
blob: faadc6bb1975e1d83e5a453365d8d239d5b819c9 (plain)
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
# Copyright (c) 2018, George Tokmaji

# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.

# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

import os, errno, stat
import llfuse

class LCOperations(llfuse.Operations):
    _inode_list = None
    
    def __init__(self):
        super().__init__()
        self._inode_list = [None, None]
    
    def _add_entry(self, parent_inode, entry, is_dir=False):
        entry["parent_inode"] = parent_inode
        entry["inode"] = len(self._inode_list)
        entry["stat"] = stat.S_IFDIR if is_dir else stat.S_IFREG
        entry["title"] = entry["title"].replace("/", chr(8260)) #⁄
        self._inode_list.append(entry)
    
    def _get_inode_by_parent(self, inode_p):
        return [i["inode"] for i in self._inode_list if i and i["parent_inode"] == inode_p][0]
    
    def _is_dir(self, inode):
        return inode == llfuse.ROOT_INODE
    
    def lookup(self, inode_p, name, ctx=None):
        if name == ".":
            inode = inode_p
        elif name == "..":
            inode = [i["inode"] for i in self._inode_list if i and i["inode"] == inode_p][0]
        else:
            for i in filter(None, self._inode_list):
                if i["title"] == os.fsdecode(name) and i["parent_inode"] == inode_p:
                    inode = i["inode"]
                    break
            else:
                raise llfuse.FUSEError(errno.ENOENT)
        return self.getattr(inode, ctx)
    
    def getattr(self, inode, ctx=None):
        attr = llfuse.EntryAttributes()
        attr.st_ino = inode
        attr.st_mode = stat.S_IFDIR if self._is_dir(inode) else stat.S_IFREG
        attr.st_nlink = 1
        attr.st_uid = os.getuid()
        attr.st_gid = os.getgid()
        attr.st_rdev = 0
        attr.st_size = 0
        attr.st_blksize = 1
        attr.st_blocks = 1
        attr.generation = 0
        attr.attr_timeout = 1
        attr.entry_timeout = 1
        attr.st_atime_ns = 0
        attr.st_ctime_ns = 0
        attr.st_mtime_ns = 0
        return attr
    
    def readdir(self, inode, off):
        entries = [i for i in self._inode_list if i and i["parent_inode"] == inode]
        for i in range(off, len(entries)):
            yield (os.fsencode(entries[i]["title"]), self.getattr(entries[i]["inode"]), i + 1)
    
    def opendir(self, inode, ctx=None):
        return inode