#!/usr/bin/env python2 import struct import binascii TYPES = { (0x1ff, 0x001): 'reg', (0x1ff, 0x002): 'dir', (0x1ff, 0x011): 'superblock', (0x1ff, 0x012): 'root', (0x1ff, 0x030): 'delete', (0x1f0, 0x080): 'globals', (0x1ff, 0x0c0): 'tail soft', (0x1ff, 0x0c1): 'tail hard', (0x1ff, 0x0f0): 'crc', (0x1ff, 0x040): 'struct dir', (0x1ff, 0x041): 'struct inline', (0x1ff, 0x042): 'struct ctz', (0x100, 0x100): 'attr', } def typeof(type): for prefix in range(9): mask = 0x1ff & ~((1 << prefix)-1) if (mask, type & mask) in TYPES: return TYPES[mask, type & mask] + ( ' [%0*x]' % (prefix/4, type & ((1 << prefix)-1)) if prefix else '') else: return '[%02x]' % type def main(*blocks): # find most recent block file = None rev = None crc = None versions = [] for block in blocks: try: nfile = open(block, 'rb') ndata = nfile.read(4) ncrc = binascii.crc32(ndata) nrev, = struct.unpack('> 22 id = (tag & 0x003ff000) >> 12 size = (tag & 0x00000fff) >> 0 data = file.read(size) if type == 0x0f0: crc = binascii.crc32(data[:4], crc) else: crc = binascii.crc32(data, crc) print '%04x: %08x %-14s %3s %3d %-23s %-8s' % ( off, tag, typeof(type) + (' bad!' if type == 0x0f0 and ~crc else ''), id if id != 0x3ff else '.', size, ' '.join('%02x' % ord(c) for c in data[:8]), ''.join(c if c >= ' ' and c <= '~' else '.' for c in data[:8])) off += tag & 0xfff if type == 0x0f0: crc = 0 if __name__ == "__main__": import sys main(*sys.argv[1:])