Mercurial > lcfOS
diff python/utils/iso9660.py @ 290:7b38782ed496
File moves
author | Windel Bouwman |
---|---|
date | Sun, 24 Nov 2013 11:24:15 +0100 |
parents | python/iso9660.py@1c7c1e619be8 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/utils/iso9660.py Sun Nov 24 11:24:15 2013 +0100 @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +import argparse + +__doc__ = """ + ISO 9660 filesystem utility. +""" + + +class VolumeDescriptor: + @classmethod + def FromData(cls, d): + ty = d[0] + Id = d[1:6] + assert Id == 'CD001'.encode('ascii') + ver = d[6] + assert ver == 1 + cls = vol_desc_types[ty] + return cls(d) + + +vol_desc_types = {} +def vol_type(t): + def reg_func(cls): + vol_desc_types[t] = cls + return cls + return reg_func + + +@vol_type(0) +class BootRecordVolumeDescriptor(VolumeDescriptor): + def __init__(self, d): + boot_sys_id = d[7:39] + boot_id = d[39:71] + print(boot_sys_id) + print(boot_id) + + +@vol_type(1) +class PrimaryVolumeDescriptor(VolumeDescriptor): + def __init__(self, d): + sys_id = d[8:40] + vol_id = d[40:72] + print(sys_id) + print(vol_id) + + +@vol_type(255) +class VolumeDescriptorTerminator(VolumeDescriptor): + def __init__(self, d): + pass + + +class ISOfs: + def __init__(self): + self.vol_descriptors = [] + + def read(self, f): + # System area: + self.system_area = f.read(16 * 2048) + while True: + d = f.read(2048) + desc = VolumeDescriptor.FromData(d) + self.vol_descriptors.append(desc) + if type(desc) is VolumeDescriptorTerminator: + break + + def dump(self): + for vd in self.vol_descriptors: + print(vd) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('filename') + args = parser.parse_args() + fs = ISOfs() + with open(args.filename, 'rb') as f: + fs.read(f) + fs.dump() + +