shithub: mcfs

ref: 74533c8ff1ab84ff0949d52c3726ccfcfc1bf76a
dir: mcfs/main.c

View raw version
#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(fd < 0)
		sysfatal("%r");

	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);
}