mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 08:42:40 +01:00 
			
		
		
		
	Modified readmdir/readtree to make reading non-truncated data easier
This commit is contained in:
		| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| import struct | ||||
| import binascii | ||||
| import sys | ||||
| import itertools as it | ||||
|  | ||||
| TAG_TYPES = { | ||||
| @@ -271,37 +272,39 @@ class MetadataPair: | ||||
|  | ||||
|         raise KeyError(gmask, gtag) | ||||
|  | ||||
|     def _dump_tags(self, tags, truncate=True): | ||||
|         sys.stdout.write("%-8s  %-8s  %-13s %4s %4s  %s\n" % ( | ||||
|             'off', 'tag', 'type', 'id', 'len', | ||||
|             'data (truncated)' if truncate else 12*' '+'data')) | ||||
|     def _dump_tags(self, tags, f=sys.stdout, truncate=True): | ||||
|         f.write("%-8s  %-8s  %-13s %4s %4s" % ( | ||||
|             'off', 'tag', 'type', 'id', 'len')) | ||||
|         if truncate: | ||||
|             f.write('  data (truncated)') | ||||
|         f.write('\n') | ||||
|  | ||||
|         for tag in tags: | ||||
|             sys.stdout.write("%08x: %08x  %-13s %4s %4s" % ( | ||||
|             f.write("%08x: %08x  %-13s %4s %4s" % ( | ||||
|                 tag.off, tag, | ||||
|                 tag.typerepr(), tag.idrepr(), tag.sizerepr())) | ||||
|             if truncate: | ||||
|                 sys.stdout.write("  %-23s  %-8s\n" % ( | ||||
|                 f.write("  %-23s  %-8s\n" % ( | ||||
|                     ' '.join('%02x' % c for c in tag.data[:8]), | ||||
|                     ''.join(c if c >= ' ' and c <= '~' else '.' | ||||
|                         for c in map(chr, tag.data[:8])))) | ||||
|             else: | ||||
|                 sys.stdout.write("\n") | ||||
|                 f.write("\n") | ||||
|                 for i in range(0, len(tag.data), 16): | ||||
|                     sys.stdout.write("%08x: %-47s  %-16s\n" % ( | ||||
|                     f.write("  %08x: %-47s  %-16s\n" % ( | ||||
|                         tag.off+i, | ||||
|                         ' '.join('%02x' % c for c in tag.data[i:i+16]), | ||||
|                         ''.join(c if c >= ' ' and c <= '~' else '.' | ||||
|                             for c in map(chr, tag.data[i:i+16])))) | ||||
|  | ||||
|     def dump_tags(self, truncate=True): | ||||
|         self._dump_tags(self.tags, truncate=truncate) | ||||
|     def dump_tags(self, f=sys.stdout, truncate=True): | ||||
|         self._dump_tags(self.tags, f=f, truncate=truncate) | ||||
|  | ||||
|     def dump_log(self, truncate=True): | ||||
|         self._dump_tags(self.log, truncate=truncate) | ||||
|     def dump_log(self, f=sys.stdout, truncate=True): | ||||
|         self._dump_tags(self.log, f=f, truncate=truncate) | ||||
|  | ||||
|     def dump_all(self, truncate=True): | ||||
|         self._dump_tags(self.all_, truncate=truncate) | ||||
|     def dump_all(self, f=sys.stdout, truncate=True): | ||||
|         self._dump_tags(self.all_, f=f, truncate=truncate) | ||||
|  | ||||
| def main(args): | ||||
|     blocks = [] | ||||
| @@ -337,10 +340,10 @@ if __name__ == "__main__": | ||||
|         help="First block address for finding the metadata pair.") | ||||
|     parser.add_argument('block2', nargs='?', type=lambda x: int(x, 0), | ||||
|         help="Second block address for finding the metadata pair.") | ||||
|     parser.add_argument('-a', '--all', action='store_true', | ||||
|         help="Show all tags in log, included tags in corrupted commits.") | ||||
|     parser.add_argument('-l', '--log', action='store_true', | ||||
|         help="Show tags in log.") | ||||
|     parser.add_argument('-a', '--all', action='store_true', | ||||
|         help="Show all tags in log, included tags in corrupted commits.") | ||||
|     parser.add_argument('-T', '--no-truncate', action='store_true', | ||||
|         help="Don't truncate large amounts of data in tags.") | ||||
|         help="Don't truncate large amounts of data.") | ||||
|     sys.exit(main(parser.parse_args())) | ||||
|   | ||||
| @@ -13,45 +13,6 @@ def popc(x): | ||||
| def ctz(x): | ||||
|     return len(bin(x)) - len(bin(x).rstrip('0')) | ||||
|  | ||||
| def dumptags(args, mdir, f): | ||||
|     if args.all: | ||||
|         tags = mdir.all_ | ||||
|     elif args.log: | ||||
|         tags = mdir.log | ||||
|     else: | ||||
|         tags = mdir.tags | ||||
|  | ||||
|     for k, tag in enumerate(tags): | ||||
|         f.write("tag %08x %s" % (tag, tag.typerepr())) | ||||
|         if tag.id != 0x3ff: | ||||
|             f.write(" id %d" % tag.id) | ||||
|         if tag.size != 0x3ff: | ||||
|             f.write(" size %d" % tag.size) | ||||
|         if tag.is_('name'): | ||||
|             f.write(" name %s" % | ||||
|                 json.dumps(tag.data.decode('utf8'))) | ||||
|         if tag.is_('dirstruct'): | ||||
|             f.write(" dir {%#x, %#x}" % struct.unpack( | ||||
|                 '<II', tag.data[:8].ljust(8, b'\xff'))) | ||||
|         if tag.is_('ctzstruct'): | ||||
|             f.write(" ctz {%#x} size %d" % struct.unpack( | ||||
|                 '<II', tag.data[:8].ljust(8, b'\xff'))) | ||||
|         if tag.is_('inlinestruct'): | ||||
|             f.write(" inline size %d" % tag.size) | ||||
|         if tag.is_('gstate'): | ||||
|             f.write(" 0x%s" % ''.join('%02x' % c for c in tag.data)) | ||||
|         if tag.is_('tail'): | ||||
|             f.write(" tail {%#x, %#x}" % struct.unpack( | ||||
|                 '<II', tag.data[:8].ljust(8, b'\xff'))) | ||||
|         f.write("\n") | ||||
|  | ||||
|         if args.data: | ||||
|             for i in range(0, len(tag.data), 16): | ||||
|                 f.write("  %-47s  %-16s\n" % ( | ||||
|                     ' '.join('%02x' % c for c in tag.data[i:i+16]), | ||||
|                     ''.join(c if c >= ' ' and c <= '~' else '.' | ||||
|                         for c in map(chr, tag.data[i:i+16])))) | ||||
|  | ||||
| def dumpentries(args, mdir, f): | ||||
|     for k, id_ in enumerate(mdir.ids): | ||||
|         name = mdir[Tag('name', id_, 0)] | ||||
| @@ -72,8 +33,8 @@ def dumpentries(args, mdir, f): | ||||
|  | ||||
|         if args.data and struct_.is_('inlinestruct'): | ||||
|             for i in range(0, len(struct_.data), 16): | ||||
|                 f.write("  %-47s  %-16s\n" % ( | ||||
|                     ' '.join('%02x' % c for c in struct_.data[i:i+16]), | ||||
|                 f.write("  %08x: %-47s  %-16s\n" % ( | ||||
|                     i, ' '.join('%02x' % c for c in struct_.data[i:i+16]), | ||||
|                     ''.join(c if c >= ' ' and c <= '~' else '.' | ||||
|                         for c in map(chr, struct_.data[i:i+16])))) | ||||
|         elif args.data and struct_.is_('ctzstruct'): | ||||
| @@ -95,8 +56,8 @@ def dumpentries(args, mdir, f): | ||||
|                 it.chain.from_iterable(reversed(data)), size)) | ||||
|             for i in range(0, min(len(data), 256) | ||||
|                     if not args.no_truncate else len(data), 16): | ||||
|                 f.write("  %-47s  %-16s\n" % ( | ||||
|                     ' '.join('%02x' % c for c in data[i:i+16]), | ||||
|                 f.write("  %08x: %-47s  %-16s\n" % ( | ||||
|                     i, ' '.join('%02x' % c for c in data[i:i+16]), | ||||
|                     ''.join(c if c >= ' ' and c <= '~' else '.' | ||||
|                         for c in map(chr, data[i:i+16])))) | ||||
|  | ||||
| @@ -239,8 +200,12 @@ def main(args): | ||||
|                     ' (corrupted)' if not mdir else '')) | ||||
|  | ||||
|                 f = io.StringIO() | ||||
|                 if args.tags or args.all or args.log: | ||||
|                     dumptags(args, mdir, f) | ||||
|                 if args.tags: | ||||
|                     mdir.dump_tags(f, truncate=not args.no_truncate) | ||||
|                 elif args.log: | ||||
|                     mdir.dump_log(f, truncate=not args.no_truncate) | ||||
|                 elif args.all: | ||||
|                     mdir.dump_all(f, truncate=not args.no_truncate) | ||||
|                 else: | ||||
|                     dumpentries(args, mdir, f) | ||||
|  | ||||
| @@ -285,12 +250,12 @@ if __name__ == "__main__": | ||||
|         help="Show contents of metadata-pairs/directories.") | ||||
|     parser.add_argument('-t', '--tags', action='store_true', | ||||
|         help="Show metadata tags instead of reconstructing entries.") | ||||
|     parser.add_argument('-a', '--all', action='store_true', | ||||
|         help="Show all tags in log, included tags in corrupted commits.") | ||||
|     parser.add_argument('-l', '--log', action='store_true', | ||||
|         help="Show tags in log.") | ||||
|     parser.add_argument('-a', '--all', action='store_true', | ||||
|         help="Show all tags in log, included tags in corrupted commits.") | ||||
|     parser.add_argument('-d', '--data', action='store_true', | ||||
|         help="Also show the raw contents of files/attrs/tags.") | ||||
|     parser.add_argument('-T', '--no-truncate', action='store_true', | ||||
|         help="Don't truncate large amounts of data in files.") | ||||
|         help="Don't truncate large amounts of data.") | ||||
|     sys.exit(main(parser.parse_args())) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user