xref: /plan9/sys/src/cmd/disk/rd9660.c (revision 14cc0f535177405a84c5b73603a98e5db6674719)
159cc4ca5SDavid du Colombier /*
259cc4ca5SDavid du Colombier  * dump a 9660 cd image for a little while.
359cc4ca5SDavid du Colombier  * for debugging.
459cc4ca5SDavid du Colombier  */
559cc4ca5SDavid du Colombier #include <u.h>
659cc4ca5SDavid du Colombier #include <libc.h>
759cc4ca5SDavid du Colombier #include <bio.h>
859cc4ca5SDavid du Colombier #include <disk.h>
959cc4ca5SDavid du Colombier 
1059cc4ca5SDavid du Colombier Biobuf *b;
1159cc4ca5SDavid du Colombier 
1259cc4ca5SDavid du Colombier #pragma varargck type "s" uchar*
1359cc4ca5SDavid du Colombier #pragma varargck type "L" uchar*
1459cc4ca5SDavid du Colombier #pragma varargck type "B" uchar*
1559cc4ca5SDavid du Colombier #pragma varargck type "N" uchar*
1659cc4ca5SDavid du Colombier #pragma varargck type "T" uchar*
1759cc4ca5SDavid du Colombier #pragma varargck type "D" uchar*
1859cc4ca5SDavid du Colombier 
1959cc4ca5SDavid du Colombier typedef struct Voldesc Voldesc;
2059cc4ca5SDavid du Colombier struct Voldesc {
2159cc4ca5SDavid du Colombier 	uchar	magic[8];	/* 0x01, "CD001", 0x01, 0x00 */
2259cc4ca5SDavid du Colombier 	uchar	systemid[32];	/* system identifier */
2359cc4ca5SDavid du Colombier 	uchar	volumeid[32];	/* volume identifier */
2459cc4ca5SDavid du Colombier 	uchar	unused[8];	/* character set in secondary desc */
2559cc4ca5SDavid du Colombier 	uchar	volsize[8];	/* volume size */
2659cc4ca5SDavid du Colombier 	uchar	charset[32];
2759cc4ca5SDavid du Colombier 	uchar	volsetsize[4];	/* volume set size = 1 */
2859cc4ca5SDavid du Colombier 	uchar	volseqnum[4];	/* volume sequence number = 1 */
2959cc4ca5SDavid du Colombier 	uchar	blocksize[4];	/* logical block size */
3059cc4ca5SDavid du Colombier 	uchar	pathsize[8];	/* path table size */
3159cc4ca5SDavid du Colombier 	uchar	lpathloc[4];	/* Lpath */
3259cc4ca5SDavid du Colombier 	uchar	olpathloc[4];	/* optional Lpath */
3359cc4ca5SDavid du Colombier 	uchar	mpathloc[4];	/* Mpath */
3459cc4ca5SDavid du Colombier 	uchar	ompathloc[4];	/* optional Mpath */
3559cc4ca5SDavid du Colombier 	uchar	rootdir[34];	/* root directory */
3659cc4ca5SDavid du Colombier 	uchar	volsetid[128];	/* volume set identifier */
3759cc4ca5SDavid du Colombier 	uchar	publisher[128];
3859cc4ca5SDavid du Colombier 	uchar	prepid[128];	/* data preparer identifier */
3959cc4ca5SDavid du Colombier 	uchar	applid[128];	/* application identifier */
4059cc4ca5SDavid du Colombier 	uchar	notice[37];	/* copyright notice file */
4159cc4ca5SDavid du Colombier 	uchar	abstract[37];	/* abstract file */
4259cc4ca5SDavid du Colombier 	uchar	biblio[37];	/* bibliographic file */
4359cc4ca5SDavid du Colombier 	uchar	cdate[17];	/* creation date */
4459cc4ca5SDavid du Colombier 	uchar	mdate[17];	/* modification date */
4559cc4ca5SDavid du Colombier 	uchar	xdate[17];	/* expiration date */
4659cc4ca5SDavid du Colombier 	uchar	edate[17];	/* effective date */
4759cc4ca5SDavid du Colombier 	uchar	fsvers;		/* file system version = 1 */
4859cc4ca5SDavid du Colombier };
4959cc4ca5SDavid du Colombier 
5059cc4ca5SDavid du Colombier void
dumpbootvol(void * a)5159cc4ca5SDavid du Colombier dumpbootvol(void *a)
5259cc4ca5SDavid du Colombier {
5359cc4ca5SDavid du Colombier 	Voldesc *v;
5459cc4ca5SDavid du Colombier 
5559cc4ca5SDavid du Colombier 	v = a;
5659cc4ca5SDavid du Colombier 	print("magic %.2ux %.5s %.2ux %2ux\n",
5759cc4ca5SDavid du Colombier 		v->magic[0], v->magic+1, v->magic[6], v->magic[7]);
5859cc4ca5SDavid du Colombier 	if(v->magic[0] == 0xFF)
5959cc4ca5SDavid du Colombier 		return;
6059cc4ca5SDavid du Colombier 
6159cc4ca5SDavid du Colombier 	print("system %.32T\n", v->systemid);
6259cc4ca5SDavid du Colombier 	print("volume %.32T\n", v->volumeid);
6359cc4ca5SDavid du Colombier 	print("volume size %.4N\n", v->volsize);
6459cc4ca5SDavid du Colombier 	print("charset %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n",
6559cc4ca5SDavid du Colombier 		v->charset[0], v->charset[1], v->charset[2], v->charset[3],
6659cc4ca5SDavid du Colombier 		v->charset[4], v->charset[5], v->charset[6], v->charset[7]);
6759cc4ca5SDavid du Colombier 	print("volume set size %.2N\n", v->volsetsize);
6859cc4ca5SDavid du Colombier 	print("volume sequence number %.2N\n", v->volseqnum);
6959cc4ca5SDavid du Colombier 	print("logical block size %.2N\n", v->blocksize);
7059cc4ca5SDavid du Colombier 	print("path size %.4L\n", v->pathsize);
7159cc4ca5SDavid du Colombier 	print("lpath loc %.4L\n", v->lpathloc);
7259cc4ca5SDavid du Colombier 	print("opt lpath loc %.4L\n", v->olpathloc);
7359cc4ca5SDavid du Colombier 	print("mpath loc %.4B\n", v->mpathloc);
7459cc4ca5SDavid du Colombier 	print("opt mpath loc %.4B\n", v->ompathloc);
7559cc4ca5SDavid du Colombier 	print("rootdir %D\n", v->rootdir);
7659cc4ca5SDavid du Colombier 	print("volume set identifier %.128T\n", v->volsetid);
7759cc4ca5SDavid du Colombier 	print("publisher %.128T\n", v->publisher);
7859cc4ca5SDavid du Colombier 	print("preparer %.128T\n", v->prepid);
7959cc4ca5SDavid du Colombier 	print("application %.128T\n", v->applid);
8059cc4ca5SDavid du Colombier 	print("notice %.37T\n", v->notice);
8159cc4ca5SDavid du Colombier 	print("abstract %.37T\n", v->abstract);
8259cc4ca5SDavid du Colombier 	print("biblio %.37T\n", v->biblio);
8359cc4ca5SDavid du Colombier 	print("creation date %.17s\n", v->cdate);
8459cc4ca5SDavid du Colombier 	print("modification date %.17s\n", v->mdate);
8559cc4ca5SDavid du Colombier 	print("expiration date %.17s\n", v->xdate);
8659cc4ca5SDavid du Colombier 	print("effective date %.17s\n", v->edate);
8759cc4ca5SDavid du Colombier 	print("fs version %d\n", v->fsvers);
8859cc4ca5SDavid du Colombier }
8959cc4ca5SDavid du Colombier 
9059cc4ca5SDavid du Colombier typedef struct Cdir Cdir;
9159cc4ca5SDavid du Colombier struct Cdir {
9259cc4ca5SDavid du Colombier 	uchar	len;
9359cc4ca5SDavid du Colombier 	uchar	xlen;
9459cc4ca5SDavid du Colombier 	uchar	dloc[8];
9559cc4ca5SDavid du Colombier 	uchar	dlen[8];
9659cc4ca5SDavid du Colombier 	uchar	date[7];
9759cc4ca5SDavid du Colombier 	uchar	flags;
9859cc4ca5SDavid du Colombier 	uchar	unitsize;
9959cc4ca5SDavid du Colombier 	uchar	gapsize;
10059cc4ca5SDavid du Colombier 	uchar	volseqnum[4];
10159cc4ca5SDavid du Colombier 	uchar	namelen;
10259cc4ca5SDavid du Colombier 	uchar	name[1];	/* chumminess */
10359cc4ca5SDavid du Colombier };
10459cc4ca5SDavid du Colombier #pragma varargck type "D" Cdir*
10559cc4ca5SDavid du Colombier 
10659cc4ca5SDavid du Colombier int
Dfmt(Fmt * fmt)1075d459b5aSDavid du Colombier Dfmt(Fmt *fmt)
10859cc4ca5SDavid du Colombier {
10959cc4ca5SDavid du Colombier 	char buf[128];
11059cc4ca5SDavid du Colombier 	Cdir *c;
11159cc4ca5SDavid du Colombier 
1125d459b5aSDavid du Colombier 	c = va_arg(fmt->args, Cdir*);
11359cc4ca5SDavid du Colombier 	if(c->namelen == 1 && c->name[0] == '\0' || c->name[0] == '\001') {
11459cc4ca5SDavid du Colombier 		snprint(buf, sizeof buf, ".%s dloc %.4N dlen %.4N",
11559cc4ca5SDavid du Colombier 			c->name[0] ? "." : "", c->dloc, c->dlen);
11659cc4ca5SDavid du Colombier 	} else {
11759cc4ca5SDavid du Colombier 		snprint(buf, sizeof buf, "%.*T dloc %.4N dlen %.4N", c->namelen, c->name,
11859cc4ca5SDavid du Colombier 			c->dloc, c->dlen);
11959cc4ca5SDavid du Colombier 	}
1205d459b5aSDavid du Colombier 	fmtstrcpy(fmt, buf);
12159cc4ca5SDavid du Colombier 	return 0;
12259cc4ca5SDavid du Colombier }
12359cc4ca5SDavid du Colombier 
12459cc4ca5SDavid du Colombier typedef struct Path Path;
12559cc4ca5SDavid du Colombier struct Path {
12659cc4ca5SDavid du Colombier 	uchar	namelen;
12759cc4ca5SDavid du Colombier 	uchar	xlen;
12859cc4ca5SDavid du Colombier 	uchar	dloc[4];
12959cc4ca5SDavid du Colombier 	uchar	parent[2];
13059cc4ca5SDavid du Colombier 	uchar	name[1];	/* chumminess */
13159cc4ca5SDavid du Colombier };
13259cc4ca5SDavid du Colombier #pragma varargck type "P" Path*
13359cc4ca5SDavid du Colombier 
13459cc4ca5SDavid du Colombier char longc, shortc;
13559cc4ca5SDavid du Colombier void
bigend(void)13659cc4ca5SDavid du Colombier bigend(void)
13759cc4ca5SDavid du Colombier {
13859cc4ca5SDavid du Colombier 	longc = 'B';
13959cc4ca5SDavid du Colombier }
14059cc4ca5SDavid du Colombier 
14159cc4ca5SDavid du Colombier void
littleend(void)14259cc4ca5SDavid du Colombier littleend(void)
14359cc4ca5SDavid du Colombier {
14459cc4ca5SDavid du Colombier 	longc = 'L';
14559cc4ca5SDavid du Colombier }
14659cc4ca5SDavid du Colombier 
14759cc4ca5SDavid du Colombier int
Pfmt(Fmt * fmt)1485d459b5aSDavid du Colombier Pfmt(Fmt *fmt)
14959cc4ca5SDavid du Colombier {
1505d459b5aSDavid du Colombier 	char xfmt[128], buf[128];
15159cc4ca5SDavid du Colombier 	Path *p;
15259cc4ca5SDavid du Colombier 
1535d459b5aSDavid du Colombier 	p = va_arg(fmt->args, Path*);
1545d459b5aSDavid du Colombier 	sprint(xfmt, "data=%%.4%c up=%%.2%c name=%%.*T (%%d)", longc, longc);
1555d459b5aSDavid du Colombier 	snprint(buf, sizeof buf, xfmt, p->dloc, p->parent, p->namelen, p->name, p->namelen);
1565d459b5aSDavid du Colombier 	fmtstrcpy(fmt, buf);
15759cc4ca5SDavid du Colombier 	return 0;
15859cc4ca5SDavid du Colombier }
15959cc4ca5SDavid du Colombier 
16059cc4ca5SDavid du Colombier ulong
big(void * a,int n)16159cc4ca5SDavid du Colombier big(void *a, int n)
16259cc4ca5SDavid du Colombier {
16359cc4ca5SDavid du Colombier 	uchar *p;
16459cc4ca5SDavid du Colombier 	ulong v;
16559cc4ca5SDavid du Colombier 	int i;
16659cc4ca5SDavid du Colombier 
16759cc4ca5SDavid du Colombier 	p = a;
16859cc4ca5SDavid du Colombier 	v = 0;
16959cc4ca5SDavid du Colombier 	for(i=0; i<n; i++)
17059cc4ca5SDavid du Colombier 		v = (v<<8) | *p++;
17159cc4ca5SDavid du Colombier 	return v;
17259cc4ca5SDavid du Colombier }
17359cc4ca5SDavid du Colombier 
17459cc4ca5SDavid du Colombier ulong
little(void * a,int n)17559cc4ca5SDavid du Colombier little(void *a, int n)
17659cc4ca5SDavid du Colombier {
17759cc4ca5SDavid du Colombier 	uchar *p;
17859cc4ca5SDavid du Colombier 	ulong v;
17959cc4ca5SDavid du Colombier 	int i;
18059cc4ca5SDavid du Colombier 
18159cc4ca5SDavid du Colombier 	p = a;
18259cc4ca5SDavid du Colombier 	v = 0;
18359cc4ca5SDavid du Colombier 	for(i=0; i<n; i++)
18459cc4ca5SDavid du Colombier 		v |= (*p++<<(i*8));
18559cc4ca5SDavid du Colombier 	return v;
18659cc4ca5SDavid du Colombier }
18759cc4ca5SDavid du Colombier 
18859cc4ca5SDavid du Colombier /* numbers in big or little endian. */
18959cc4ca5SDavid du Colombier int
BLfmt(Fmt * fmt)1905d459b5aSDavid du Colombier BLfmt(Fmt *fmt)
19159cc4ca5SDavid du Colombier {
19259cc4ca5SDavid du Colombier 	ulong v;
19359cc4ca5SDavid du Colombier 	uchar *p;
19459cc4ca5SDavid du Colombier 	char buf[20];
19559cc4ca5SDavid du Colombier 
1965d459b5aSDavid du Colombier 	p = va_arg(fmt->args, uchar*);
19759cc4ca5SDavid du Colombier 
1985d459b5aSDavid du Colombier 	if(!(fmt->flags&FmtPrec)) {
1995d459b5aSDavid du Colombier 		fmtstrcpy(fmt, "*BL*");
20059cc4ca5SDavid du Colombier 		return 0;
20159cc4ca5SDavid du Colombier 	}
20259cc4ca5SDavid du Colombier 
2035d459b5aSDavid du Colombier 	if(fmt->r == 'B')
2045d459b5aSDavid du Colombier 		v = big(p, fmt->prec);
20559cc4ca5SDavid du Colombier 	else
2065d459b5aSDavid du Colombier 		v = little(p, fmt->prec);
20759cc4ca5SDavid du Colombier 
2085d459b5aSDavid du Colombier 	sprint(buf, "0x%.*lux", fmt->prec*2, v);
2095d459b5aSDavid du Colombier 	fmt->flags &= ~FmtPrec;
2105d459b5aSDavid du Colombier 	fmtstrcpy(fmt, buf);
21159cc4ca5SDavid du Colombier 	return 0;
21259cc4ca5SDavid du Colombier }
21359cc4ca5SDavid du Colombier 
21459cc4ca5SDavid du Colombier /* numbers in both little and big endian */
21559cc4ca5SDavid du Colombier int
Nfmt(Fmt * fmt)2165d459b5aSDavid du Colombier Nfmt(Fmt *fmt)
21759cc4ca5SDavid du Colombier {
21859cc4ca5SDavid du Colombier 	char buf[100];
21959cc4ca5SDavid du Colombier 	uchar *p;
22059cc4ca5SDavid du Colombier 
2215d459b5aSDavid du Colombier 	p = va_arg(fmt->args, uchar*);
22259cc4ca5SDavid du Colombier 
2235d459b5aSDavid du Colombier 	sprint(buf, "%.*L %.*B", fmt->prec, p, fmt->prec, p+fmt->prec);
2245d459b5aSDavid du Colombier 	fmt->flags &= ~FmtPrec;
2255d459b5aSDavid du Colombier 	fmtstrcpy(fmt, buf);
22659cc4ca5SDavid du Colombier 	return 0;
22759cc4ca5SDavid du Colombier }
22859cc4ca5SDavid du Colombier 
22959cc4ca5SDavid du Colombier int
asciiTfmt(Fmt * fmt)2305d459b5aSDavid du Colombier asciiTfmt(Fmt *fmt)
23159cc4ca5SDavid du Colombier {
23259cc4ca5SDavid du Colombier 	char *p, buf[256];
23359cc4ca5SDavid du Colombier 	int i;
23459cc4ca5SDavid du Colombier 
2355d459b5aSDavid du Colombier 	p = va_arg(fmt->args, char*);
2365d459b5aSDavid du Colombier 	for(i=0; i<fmt->prec; i++)
23759cc4ca5SDavid du Colombier 		buf[i] = *p++;
23859cc4ca5SDavid du Colombier 	buf[i] = '\0';
23959cc4ca5SDavid du Colombier 	for(p=buf+strlen(buf); p>buf && p[-1]==' '; p--)
24059cc4ca5SDavid du Colombier 		;
24159cc4ca5SDavid du Colombier 	p[0] = '\0';
2425d459b5aSDavid du Colombier 	fmt->flags &= ~FmtPrec;
2435d459b5aSDavid du Colombier 	fmtstrcpy(fmt, buf);
24459cc4ca5SDavid du Colombier 	return 0;
24559cc4ca5SDavid du Colombier }
24659cc4ca5SDavid du Colombier 
24759cc4ca5SDavid du Colombier int
runeTfmt(Fmt * fmt)2485d459b5aSDavid du Colombier runeTfmt(Fmt *fmt)
24959cc4ca5SDavid du Colombier {
25059cc4ca5SDavid du Colombier 	Rune buf[256], *r;
25159cc4ca5SDavid du Colombier 	int i;
25259cc4ca5SDavid du Colombier 	uchar *p;
25359cc4ca5SDavid du Colombier 
2545d459b5aSDavid du Colombier 	p = va_arg(fmt->args, uchar*);
2555d459b5aSDavid du Colombier 	for(i=0; i*2+2<=fmt->prec; i++, p+=2)
25659cc4ca5SDavid du Colombier 		buf[i] = (p[0]<<8)|p[1];
25759cc4ca5SDavid du Colombier 	buf[i] = L'\0';
25859cc4ca5SDavid du Colombier 	for(r=buf+i; r>buf && r[-1]==L' '; r--)
25959cc4ca5SDavid du Colombier 		;
26059cc4ca5SDavid du Colombier 	r[0] = L'\0';
2615d459b5aSDavid du Colombier 	fmt->flags &= ~FmtPrec;
2625d459b5aSDavid du Colombier 	return fmtprint(fmt, "%S", buf);
26359cc4ca5SDavid du Colombier }
26459cc4ca5SDavid du Colombier 
26559cc4ca5SDavid du Colombier void
ascii(void)26659cc4ca5SDavid du Colombier ascii(void)
26759cc4ca5SDavid du Colombier {
2685d459b5aSDavid du Colombier 	fmtinstall('T', asciiTfmt);
26959cc4ca5SDavid du Colombier }
27059cc4ca5SDavid du Colombier 
27159cc4ca5SDavid du Colombier void
joliet(void)27259cc4ca5SDavid du Colombier joliet(void)
27359cc4ca5SDavid du Colombier {
2745d459b5aSDavid du Colombier 	fmtinstall('T', runeTfmt);
27559cc4ca5SDavid du Colombier }
27659cc4ca5SDavid du Colombier 
27759cc4ca5SDavid du Colombier void
getsect(uchar * buf,int n)27859cc4ca5SDavid du Colombier getsect(uchar *buf, int n)
27959cc4ca5SDavid du Colombier {
28059cc4ca5SDavid du Colombier 	if(Bseek(b, n*2048, 0) != n*2048 || Bread(b, buf, 2048) != 2048)
281*14cc0f53SDavid du Colombier 		sysfatal("reading block %ux", n);
2825d459b5aSDavid du Colombier }
2835d459b5aSDavid du Colombier 
2845d459b5aSDavid du Colombier void
pathtable(Voldesc * v,int islittle)2855d459b5aSDavid du Colombier pathtable(Voldesc *v, int islittle)
2865d459b5aSDavid du Colombier {
2875d459b5aSDavid du Colombier 	int i, j, n, sz, addr;
2885d459b5aSDavid du Colombier 	ulong (*word)(void*, int);
2895d459b5aSDavid du Colombier 	uchar x[2048], *p, *ep;
2905d459b5aSDavid du Colombier 	Path *pt;
2915d459b5aSDavid du Colombier 
2925d459b5aSDavid du Colombier 	print(">>> entire %s path table\n", islittle ? "little" : "big");
2935d459b5aSDavid du Colombier 	littleend();
2945d459b5aSDavid du Colombier 	if(islittle) {
2955d459b5aSDavid du Colombier 		littleend();
2965d459b5aSDavid du Colombier 		word = little;
2975d459b5aSDavid du Colombier 	}else{
2985d459b5aSDavid du Colombier 		bigend();
2995d459b5aSDavid du Colombier 		word = big;
3005d459b5aSDavid du Colombier 	}
3015d459b5aSDavid du Colombier 	sz = little(v->pathsize, 4);	/* little, not word */
3025d459b5aSDavid du Colombier 	addr = word(islittle ? v->lpathloc : v->mpathloc, 4);
3035d459b5aSDavid du Colombier 	j = 0;
3045d459b5aSDavid du Colombier 	n = 1;
3055d459b5aSDavid du Colombier 	while(sz > 0){
3065d459b5aSDavid du Colombier 		getsect(x, addr);
3075d459b5aSDavid du Colombier 		p = x;
3085d459b5aSDavid du Colombier 		ep = x+sz;
3095d459b5aSDavid du Colombier 		if(ep > x+2048)
3105d459b5aSDavid du Colombier 			ep = x+2048;
3115d459b5aSDavid du Colombier 		for(i=0; p<ep; i++) {
3125d459b5aSDavid du Colombier 			pt = (Path*)p;
3135d459b5aSDavid du Colombier 			if(pt->namelen==0)
3145d459b5aSDavid du Colombier 				break;
3155d459b5aSDavid du Colombier 			print("0x%.4x %4d+%-4ld %P\n", n, j, p-x, pt);
3165d459b5aSDavid du Colombier 			n++;
3175d459b5aSDavid du Colombier 			p += 8+pt->namelen+(pt->namelen&1);
3185d459b5aSDavid du Colombier 		}
3195d459b5aSDavid du Colombier 		sz -= 2048;
3205d459b5aSDavid du Colombier 		addr++;
3215d459b5aSDavid du Colombier 		j++;
3225d459b5aSDavid du Colombier 	}
32359cc4ca5SDavid du Colombier }
32459cc4ca5SDavid du Colombier 
32559cc4ca5SDavid du Colombier void
dump(void * root)32659cc4ca5SDavid du Colombier dump(void *root)
32759cc4ca5SDavid du Colombier {
32859cc4ca5SDavid du Colombier 	Voldesc *v;
32959cc4ca5SDavid du Colombier 	Cdir *c;
33059cc4ca5SDavid du Colombier 	long rootdirloc;
33159cc4ca5SDavid du Colombier 	uchar x[2048];
33259cc4ca5SDavid du Colombier 	int i;
33359cc4ca5SDavid du Colombier 	uchar *p;
33459cc4ca5SDavid du Colombier 
33559cc4ca5SDavid du Colombier 	dumpbootvol(root);
33659cc4ca5SDavid du Colombier 	v = (Voldesc*)root;
33759cc4ca5SDavid du Colombier 	c = (Cdir*)v->rootdir;
33859cc4ca5SDavid du Colombier 	rootdirloc = little(c->dloc, 4);
3395d459b5aSDavid du Colombier 	print(">>> sed 5q root directory\n");
34059cc4ca5SDavid du Colombier 	getsect(x, rootdirloc);
34159cc4ca5SDavid du Colombier 	p = x;
34259cc4ca5SDavid du Colombier 	for(i=0; i<5 && (p-x)<little(c->dlen, 4); i++) {
34359cc4ca5SDavid du Colombier 		print("%D\n", p);
34459cc4ca5SDavid du Colombier 		p += ((Cdir*)p)->len;
34559cc4ca5SDavid du Colombier 	}
34659cc4ca5SDavid du Colombier 
3475d459b5aSDavid du Colombier 	pathtable(v, 1);
3485d459b5aSDavid du Colombier 	pathtable(v, 0);
3495d459b5aSDavid du Colombier }
35059cc4ca5SDavid du Colombier 
35159cc4ca5SDavid du Colombier void
main(int argc,char ** argv)35259cc4ca5SDavid du Colombier main(int argc, char **argv)
35359cc4ca5SDavid du Colombier {
35459cc4ca5SDavid du Colombier 	uchar root[2048], jroot[2048];
35559cc4ca5SDavid du Colombier 
35659cc4ca5SDavid du Colombier 	if(argc != 2)
357*14cc0f53SDavid du Colombier 		sysfatal("usage: %s file", argv[0]);
35859cc4ca5SDavid du Colombier 
35959cc4ca5SDavid du Colombier 	b = Bopen(argv[1], OREAD);
36059cc4ca5SDavid du Colombier 	if(b == nil)
361*14cc0f53SDavid du Colombier 		sysfatal("bopen %r");
36259cc4ca5SDavid du Colombier 
3635d459b5aSDavid du Colombier 	fmtinstall('L', BLfmt);
3645d459b5aSDavid du Colombier 	fmtinstall('B', BLfmt);
3655d459b5aSDavid du Colombier 	fmtinstall('N', Nfmt);
3665d459b5aSDavid du Colombier 	fmtinstall('D', Dfmt);
3675d459b5aSDavid du Colombier 	fmtinstall('P', Pfmt);
36859cc4ca5SDavid du Colombier 
36959cc4ca5SDavid du Colombier 	getsect(root, 16);
37059cc4ca5SDavid du Colombier 	ascii();
37159cc4ca5SDavid du Colombier 	dump(root);
37259cc4ca5SDavid du Colombier 
37359cc4ca5SDavid du Colombier 	getsect(jroot, 17);
37459cc4ca5SDavid du Colombier 	joliet();
37559cc4ca5SDavid du Colombier 	dump(jroot);
37659cc4ca5SDavid du Colombier 	exits(0);
37759cc4ca5SDavid du Colombier }
378