shithub: mcfs

ref: 03f6379de5cbf44e8d5cec74e4e3d259309af562
dir: mcfs/main.c

View raw version
#include <u.h>
#include <libc.h>
#include <bio.h>
#include "common.h"

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)
{
	Biobuf *f;
	char *s, *status;
	u8int d[4];

	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

	f = nil;
	if(argc == 1)
		f = Bopen(*argv, OREAD);
	else if(argc == 0)
		f = Bfdopen(0, OREAD);
	else
		usage();

	if(f == nil)
		sysfatal("%r");

	fmtinstall('H', encodefmt);
	fmtinstall('T', isotypefmt);
	Binit(&out, 1, OWRITE);
	Binit(&stderr, 2, OWRITE);

	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(ebmlrun(f) != 0){
			Bprint(&stderr, "embl: %r\n");
			status = "ebml failed";
		}
	}else if(isorun(f) != 0){
		Bprint(&stderr, "iso: %r\n");
		status = "iso failed";
	}

	Bterm(f);
	Bterm(&out);
	Bterm(&stderr);

	exits(status);
}