def create(self, name, meta_info=None, dos_type=None, boot_code=None, is_ffs=False, is_intl=False, is_dircache=False, is_longname=False): # determine dos_type if dos_type == None: dos_type = DosType.DOS0 if is_longname: dos_type = DosType.DOS6 elif is_dircache: dos_type |= DosType.DOS_MASK_DIRCACHE elif is_intl: dos_type |= DosType.DOS_MASK_INTL if is_ffs: dos_type |= DosType.DOS_MASK_FFS # 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) self.is_longname = DosType.is_longname(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, is_longname=False) # Volumes don't support long names 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, fstype=dos_type) 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 load_header(self, line): pos = line.find(':') if pos == -1: raise IOError("Invalid xdfmeta header! (no colon in line)") # first extract volume name vol_name = line[:pos] self.vol_name = vol_name.decode("UTF-8") line = line[pos + 1:] # now get parameters comp = line.split(',') if len(comp) != 4: raise IOError( "Invalid xdfmeta header! (wrong number of parameters found)") # first dos type dos_type_str = comp[0] if len(dos_type_str) != 4: raise IOError("Invalid xdfmeta dostype string") num = ord(dos_type_str[3]) - ord('0') if num < 0 or num > 5: raise IOError("Invalid xdfmeta dostype number") self.dos_type = DosType.DOS0 + num # then time stamps create_ts = TimeStamp() ok1 = create_ts.parse(comp[1]) disk_ts = TimeStamp() ok2 = disk_ts.parse(comp[2]) mod_ts = TimeStamp() ok3 = mod_ts.parse(comp[3]) if not ok1 or not ok2 or not ok3: raise IOError("Invalid xdfmeta header! (invalid timestamp found)") self.vol_meta = RootMetaInfo(create_ts, disk_ts, mod_ts)
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 change_meta_info(self, meta_info): if self.root != None and self.root.valid: dirty = False # update create_ts create_ts = meta_info.get_create_ts() if create_ts != None: self.root.create_ts = meta_info.get_create_ts() dirty = True # update disk_ts disk_ts = meta_info.get_disk_ts() if disk_ts != None: self.root.disk_ts = disk_ts dirty = True # update mod_ts mod_ts = meta_info.get_mod_ts() if mod_ts != None: self.root.mod_ts = mod_ts dirty = True # update if something changed if dirty: self.root.write() self.meta_info = RootMetaInfo(self.root.create_ts, self.root.disk_ts, self.root.mod_ts) return True else: return False
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 # create a boot block self.boot = BootBlock(self.blkdev, ) self.boot.create(dos_type=dos_type, boot_code=boot_code) self.is_ffs = DosType.is_ffs(dos_type) self.is_intl = DosType.is_intl(dos_type) self.is_dircache = DosType.is_dircache(dos_type) 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, 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 update_disk_time(self): mi = RootMetaInfo() mi.set_current_as_disk_time() self.change_meta_info(mi)
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 change_mod_ts_by_string(self, mod_ts_str): t = TimeStamp() t.parse(mod_ts_str) return self.change_meta_info(RootMetaInfo(mod_ts=t))
def change_create_ts_by_string(self, create_ts_str): t = TimeStamp() t.parse(create_ts_str) return self.change_meta_info(RootMetaInfo(create_ts=t))
def change_mod_ts(self, mod_ts): return self.change_meta_info(RootMetaInfo(mod_ts=mod_ts))
def change_disk_ts(self, disk_ts): return self.change_meta_info(RootMetaInfo(disk_ts=disk_ts))
def change_create_ts(self, create_ts): return self.change_meta_info(RootMetaInfo(create_ts=create_ts))