#include #include #include "tag.h" void usage(void) { fprint(2, "usage: %s type [file]\n", argv0); exits("usage"); } void main(int argc, char **argv) { char *type; int fd; vlong offset; uchar buf[8192], *p; u32int length; ARGBEGIN { default: usage(); } ARGEND if(argc < 1) usage(); type = argv[0]; argc--; argv++; if(strlen(type) != 4) sysfatal("invalid type"); switch(argc) { case 0: fd = 0; break; case 1: if((fd = open(argv[0], OREAD)) < 0) sysfatal("open %s: %r", argv[0]); break; default: usage(); SET(fd); } offset = 0; while(pread(fd, buf, 8, offset) == 8) { p = buf; length = g32(&p); if(memcmp(type, p, 4) == 0) { seek(fd, offset+8, 0); dup(fd, 0); execl("./8.readn", "readn", smprint("%d", length - 8), nil); sysfatal("exec: %r"); } offset += length; } exits(nil); }