Exemple #1
0
 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
Exemple #2
0
 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)
Exemple #3
0
 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)
Exemple #4
0
 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
Exemple #5
0
 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
Exemple #6
0
 def update_disk_time(self):
   mi = RootMetaInfo()
   mi.set_current_as_disk_time()
   self.change_meta_info(mi)
Exemple #7
0
 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
Exemple #8
0
 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))
Exemple #9
0
 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))
Exemple #10
0
 def change_mod_ts(self, mod_ts):
     return self.change_meta_info(RootMetaInfo(mod_ts=mod_ts))
Exemple #11
0
 def change_disk_ts(self, disk_ts):
     return self.change_meta_info(RootMetaInfo(disk_ts=disk_ts))
Exemple #12
0
 def change_create_ts(self, create_ts):
     return self.change_meta_info(RootMetaInfo(create_ts=create_ts))
Exemple #13
0
 def update_disk_time(self):
     mi = RootMetaInfo()
     mi.set_current_as_disk_time()
     self.change_meta_info(mi)