ref: ae4f2427e78904f57323f3618f110e2a8b36a602
dir: /main.c/
#include <u.h> #include <libc.h> #include <bio.h> #include "common.h" enum { Outbufsz = 256*1024, Inbufsz = 256*1024, }; Biobuf stderr, out; int dflag, trackdump; static void usage(void) { fprint(2, "usage: %s [-t INDEX|audio|video] [FILE]\n", argv0); exits("usage"); } void main(int argc, char **argv) { u8int d[4], *outbuf, *inbuf; char *s, *status; Biobuf f; int fd; fmtinstall('H', encodefmt); fmtinstall('T', isotypefmt); fmtinstall('P', srttsfmt); dflag = 0; trackdump = Nodump; ARGBEGIN{ case 'd': dflag++; break; case 't': s = EARGF(usage()); if(strcmp(s, "audio") == 0) trackdump = Dumpaudio; else if(strcmp(s, "video") == 0) trackdump = Dumpvideo; else trackdump = atoi(s); break; default: usage(); }ARGEND if((outbuf = malloc(Outbufsz)) == nil) sysfatal("memory"); if((inbuf = malloc(Inbufsz)) == nil) sysfatal("memory"); fd = 0; if(argc == 1) fd = open(*argv, OREAD); else if(argc != 0) usage(); if(Binits(&f, fd, OREAD, inbuf, Inbufsz) != 0) sysfatal("%r"); if(Binits(&out, 1, OWRITE, outbuf, Outbufsz) != 0) sysfatal("%r"); if(Binit(&stderr, 2, OWRITE) != 0) sysfatal("%r"); status = nil; if(Bread(&f, d, 4) != 4){ Bprint(&stderr, "unknown format\n"); status = "unknown format"; }else if(Bungetc(&f) < 0 || Bungetc(&f) < 0 || Bungetc(&f) < 0 || Bungetc(&f) < 0){ Bprint(&stderr, "seek back failed: %r\n"); status = "seek failed"; }else if(memcmp(d, "\x1a\x45\xdf\xa3", 4) == 0){ if(matroskarun(&f) != 0){ Bprint(&stderr, "matroska: %r\n"); status = "matroska failed"; } }else if(isorun(&f) != 0){ Bprint(&stderr, "iso: %r\n"); status = "iso failed"; } Bterm(&f); Bterm(&out); Bterm(&stderr); exits(status); }