Esempio n. 1
0
 def add_partition(self, drv_name, cyl_range, dev_flags=0, flags=0, dos_type=DosType.DOS0, boot_pri=0):
   # cyl range is not free anymore or invalid
   if not self.check_cyl_range(*cyl_range):
     return False
   # no space left for partition block
   if not self._has_free_rdb_blocks(1):
     return False
   # allocate block for partition
   blk_num = self._alloc_rdb_blocks(1)[0]
   self.used_blks.append(blk_num)
   self._update_hi_blk()
   # crete a new parttion block
   pb = PartitionBlock(self.rawblk, blk_num)
   heads = self.rdb.phy_drv.heads
   blk_per_trk = self.rdb.phy_drv.secs
   dos_env = PartitionDosEnv(low_cyl=cyl_range[0], high_cyl=cyl_range[1], surfaces=heads, \
                             blk_per_trk=blk_per_trk, dos_type=dos_type, boot_pri=boot_pri)
   pb.create(drv_name, dos_env, flags=flags)
   pb.write()
   # link block
   if len(self.parts) == 0:
     # write into RDB
     self.rdb.part_list = blk_num
   else:
     # write into last partition block
     last_pb = self.parts[-1]
     last_pb.part_blk.next = blk_num
     last_pb.write()
   # always write RDB as allocated block is stored there, too  
   self.rdb.write()
   # create partition object and add to partition list
   p = Partition(self.rawblk, blk_num, len(self.parts), blk_per_trk, self)
   p.read()
   self.parts.append(p)
   return True
Esempio n. 2
0
 def add_partition(self, drv_name, cyl_range, dev_flags=0, flags=0,
                   dos_type=DosType.DOS0, boot_pri=0, more_dos_env=None,
                   fs_block_size=None):
   # cyl range is not free anymore or invalid
   if not self.check_cyl_range(*cyl_range):
     return False
   # no space left for partition block
   if not self._has_free_rdb_blocks(1):
     return False
   # allocate block for partition
   blk_num = self._alloc_rdb_blocks(1)[0]
   self.used_blks.append(blk_num)
   self._update_hi_blk()
   # crete a new parttion block
   pb = PartitionBlock(self.rawblk, blk_num)
   # setup fs block size (may be multiple sectors)
   if not fs_block_size:
     fs_block_size = self.block_bytes
   sec_per_blk = int(fs_block_size / self.block_bytes)
   if sec_per_blk < 1 or sec_per_blk > 16:
     raise IOError("Invalid sec_per_blk: " + sec_per_blk)
   # block size in longs
   bsl = self.block_bytes >> 2
   # setup dos env
   heads = self.rdb.phy_drv.heads
   blk_per_trk = self.rdb.phy_drv.secs
   dos_env = PartitionDosEnv(low_cyl=cyl_range[0], high_cyl=cyl_range[1], surfaces=heads,
                             blk_per_trk=blk_per_trk, dos_type=dos_type, boot_pri=boot_pri,
                             block_size=bsl, sec_per_blk=sec_per_blk)
   self._adjust_dos_env(dos_env, more_dos_env)
   pb.create(drv_name, dos_env, flags=flags)
   pb.write()
   # link block
   if len(self.parts) == 0:
     # write into RDB
     self.rdb.part_list = blk_num
   else:
     # write into last partition block
     last_pb = self.parts[-1]
     last_pb.part_blk.next = blk_num
     last_pb.write()
   # always write RDB as allocated block is stored there, too
   self.rdb.write()
   # flush out all changes before we read again
   self.rawblk.flush()
   # create partition object and add to partition list
   blk_per_cyl = blk_per_trk * heads
   p = Partition(self.rawblk, blk_num, len(self.parts), blk_per_cyl, self)
   p.read()
   self.parts.append(p)
   return True
Esempio n. 3
0
 def add_partition(self,
                   drv_name,
                   cyl_range,
                   dev_flags=0,
                   flags=0,
                   dos_type=DosType.DOS0,
                   boot_pri=0):
     # cyl range is not free anymore or invalid
     if not self.check_cyl_range(*cyl_range):
         return False
     # no space left for partition block
     if not self._has_free_rdb_blocks(1):
         return False
     # allocate block for partition
     blk_num = self._alloc_rdb_blocks(1)[0]
     self.used_blks.append(blk_num)
     self._update_hi_blk()
     # crete a new parttion block
     pb = PartitionBlock(self.rawblk, blk_num)
     heads = self.rdb.phy_drv.heads
     blk_per_trk = self.rdb.phy_drv.secs
     dos_env = PartitionDosEnv(low_cyl=cyl_range[0], high_cyl=cyl_range[1], surfaces=heads, \
                               blk_per_trk=blk_per_trk, dos_type=dos_type, boot_pri=boot_pri)
     pb.create(drv_name, dos_env, flags=flags)
     pb.write()
     # link block
     if len(self.parts) == 0:
         # write into RDB
         self.rdb.part_list = blk_num
     else:
         # write into last partition block
         last_pb = self.parts[-1]
         last_pb.part_blk.next = blk_num
         last_pb.write()
     # always write RDB as allocated block is stored there, too
     self.rdb.write()
     # create partition object and add to partition list
     p = Partition(self.rawblk, blk_num, len(self.parts), blk_per_trk, self)
     p.read()
     self.parts.append(p)
     return True