def open(self): # read boot block self.boot = BootBlock(self.blkdev) self.boot.read() # valid root block? if self.boot.valid: # get fs flags dos_type = self.boot.dos_type self.is_ffs = DosType.is_ffs(dos_type) self.is_intl = DosType.is_intl(dos_type) self.is_dircache = DosType.is_dircache(dos_type) # read root self.root = RootBlock(self.blkdev, self.boot.calc_root_blk) self.root.read() if self.root.valid: self.name = FSString(self.root.name) # build meta info self.meta_info = RootMetaInfo(self.root.create_ts, self.root.disk_ts, self.root.mod_ts) # create root dir self.root_dir = ADFSVolDir(self, self.root) self.root_dir.read() # create bitmap self.bitmap = ADFSBitmap(self.root) self.bitmap.read() self.valid = True else: raise FSError(INVALID_ROOT_BLOCK, block=self.root) else: raise FSError(INVALID_BOOT_BLOCK, block=self.boot)
def create(self, name, meta_info=None, dos_type=None, boot_code=None, is_ffs=False, is_intl=False, is_dircache=False): # determine dos_type if dos_type == None: dos_type = DosType.DOS0 if is_ffs: dos_type |= DosType.DOS_MASK_FFS if is_dircache: dos_type |= DosType.DOS_MASK_DIRCACHE elif is_intl: dos_type |= DosType.DOS_MASK_INTL # update flags self.is_ffs = DosType.is_ffs(dos_type) self.is_intl = DosType.is_intl(dos_type) self.is_dircache = DosType.is_dircache(dos_type) # convert and check volume name if not isinstance(name, FSString): raise ValueError("create's name must be a FSString") fn = FileName(name, is_intl=self.is_intl) if not fn.is_valid(): raise FSError(INVALID_VOLUME_NAME, file_name=name, node=self) # create a boot block self.boot = BootBlock(self.blkdev) self.boot.create(dos_type=dos_type, boot_code=boot_code) self.boot.write() # create a root block self.root = RootBlock(self.blkdev, self.boot.calc_root_blk) if meta_info == None: meta_info = RootMetaInfo() meta_info.set_current_as_create_time() meta_info.set_current_as_mod_time() meta_info.set_current_as_disk_time() create_ts = meta_info.get_create_ts() disk_ts = meta_info.get_disk_ts() mod_ts = meta_info.get_mod_ts() self.meta_info = meta_info self.root.create(name.get_ami_str(), create_ts, disk_ts, mod_ts) self.name = name # create bitmap self.bitmap = ADFSBitmap(self.root) self.bitmap.create() self.bitmap.write() # writes root block, too # create empty root dir self.root_dir = ADFSVolDir(self, self.root) self.root_dir.read() # all ok self.valid = True
def create(self, name, create_time=None, dos_type=BootBlock.DOS0, boot_code=None): # create a boot block self.boot = BootBlock(self.blkdev) self.boot.create() self.boot.write() # create a root block self.root = RootBlock(self.blkdev, self.boot.calc_root_blk) self.root.create(name, create_time) self.name = name # create bitmap self.bitmap = ADFSBitmap(self.root) self.bitmap.create() self.bitmap.write() # writes root block, too # create empty root dir self.root_dir = ADFSVolDir(self, self.root) self.root_dir.read() # all ok self.valid = True
def open(self): # read boot block self.boot = BootBlock(self.blkdev) self.boot.read() # valid root block? if self.boot.valid: self.is_ffs = self.boot.dos_type > BootBlock.DOS0 # read root self.root = RootBlock(self.blkdev, self.boot.calc_root_blk) self.root.read() if self.root.valid: self.name = self.root.name # create root dir self.root_dir = ADFSVolDir(self, self.root) self.root_dir.read() # create bitmap self.bitmap = ADFSBitmap(self.root) self.bitmap.read() self.valid = True else: raise FSError(INVALID_ROOT_BLOCK, block=self.root) else: raise FSError(INVALID_BOOT_BLOCK, block=self.boot)