Esempio n. 1
0
File: Root.py Progetto: Djaler/PyOS
    def add(self, file_name, inode):
        superblock = self._superblock
        fat = self._fat
        file = self._file

        file_name = bytes(file_name, "utf-8")

        clusters = fat.get_clusters_chain(0)
        empty_space = None

        for cluster in clusters:
            file.seek(self._cluster_offset(cluster))
            for _ in range(superblock.cluster_size // 64):
                data = unpack("59sci", file.read(64))
                if ord(data[1]) == 0:
                    empty_space = file.tell() - 64
                    break

            if empty_space:
                break
        else:
            cluster_index = fat.get_free_cluster()

            fat.set(clusters[-1], cluster_index)
            fat.set(cluster_index, -1)
            empty_space = self._cluster_offset(cluster_index)

            root_inode = Inode.get_inode(superblock.inode_array_offset, file, 0)
            root_inode.size = (len(clusters) + 1) * superblock.cluster_size
            Inode.set_inode(superblock.inode_array_offset, file, root_inode)

        file.seek(empty_space)
        file.write(pack("59sci", file_name, bytes([len(file_name)]), inode.id))

        self._list[file_name.decode()] = inode
        Inode.set_inode(superblock.inode_array_offset, file, inode)
Esempio n. 2
0
File: Root.py Progetto: Djaler/PyOS
 def write(superblock, fat, inode_map, file):
     now = int(time())
     inode = Inode(id=0, size=superblock.cluster_size, ctime=now, mtime=now, first_cluster=0)
     Inode.set_inode(superblock.inode_array_offset, file, inode)
     inode_map.set(inode.id, False)
     fat.set(0, -1)
Esempio n. 3
0
File: Root.py Progetto: Djaler/PyOS
 def update_inode(self, file_name, inode):
     self._list[file_name] = inode
     Inode.set_inode(self._superblock.inode_array_offset, self._file, inode)