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 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 107*5d459b5aSDavid du Colombier Dfmt(Fmt *fmt) 10859cc4ca5SDavid du Colombier { 10959cc4ca5SDavid du Colombier char buf[128]; 11059cc4ca5SDavid du Colombier Cdir *c; 11159cc4ca5SDavid du Colombier 112*5d459b5aSDavid 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 } 120*5d459b5aSDavid 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 13659cc4ca5SDavid du Colombier bigend(void) 13759cc4ca5SDavid du Colombier { 13859cc4ca5SDavid du Colombier longc = 'B'; 13959cc4ca5SDavid du Colombier } 14059cc4ca5SDavid du Colombier 14159cc4ca5SDavid du Colombier void 14259cc4ca5SDavid du Colombier littleend(void) 14359cc4ca5SDavid du Colombier { 14459cc4ca5SDavid du Colombier longc = 'L'; 14559cc4ca5SDavid du Colombier } 14659cc4ca5SDavid du Colombier 14759cc4ca5SDavid du Colombier int 148*5d459b5aSDavid du Colombier Pfmt(Fmt *fmt) 14959cc4ca5SDavid du Colombier { 150*5d459b5aSDavid du Colombier char xfmt[128], buf[128]; 15159cc4ca5SDavid du Colombier Path *p; 15259cc4ca5SDavid du Colombier 153*5d459b5aSDavid du Colombier p = va_arg(fmt->args, Path*); 154*5d459b5aSDavid du Colombier sprint(xfmt, "data=%%.4%c up=%%.2%c name=%%.*T (%%d)", longc, longc); 155*5d459b5aSDavid du Colombier snprint(buf, sizeof buf, xfmt, p->dloc, p->parent, p->namelen, p->name, p->namelen); 156*5d459b5aSDavid du Colombier fmtstrcpy(fmt, buf); 15759cc4ca5SDavid du Colombier return 0; 15859cc4ca5SDavid du Colombier } 15959cc4ca5SDavid du Colombier 16059cc4ca5SDavid du Colombier ulong 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 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 190*5d459b5aSDavid 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 196*5d459b5aSDavid du Colombier p = va_arg(fmt->args, uchar*); 19759cc4ca5SDavid du Colombier 198*5d459b5aSDavid du Colombier if(!(fmt->flags&FmtPrec)) { 199*5d459b5aSDavid du Colombier fmtstrcpy(fmt, "*BL*"); 20059cc4ca5SDavid du Colombier return 0; 20159cc4ca5SDavid du Colombier } 20259cc4ca5SDavid du Colombier 203*5d459b5aSDavid du Colombier if(fmt->r == 'B') 204*5d459b5aSDavid du Colombier v = big(p, fmt->prec); 20559cc4ca5SDavid du Colombier else 206*5d459b5aSDavid du Colombier v = little(p, fmt->prec); 20759cc4ca5SDavid du Colombier 208*5d459b5aSDavid du Colombier sprint(buf, "0x%.*lux", fmt->prec*2, v); 209*5d459b5aSDavid du Colombier fmt->flags &= ~FmtPrec; 210*5d459b5aSDavid 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 216*5d459b5aSDavid du Colombier Nfmt(Fmt *fmt) 21759cc4ca5SDavid du Colombier { 21859cc4ca5SDavid du Colombier char buf[100]; 21959cc4ca5SDavid du Colombier uchar *p; 22059cc4ca5SDavid du Colombier 221*5d459b5aSDavid du Colombier p = va_arg(fmt->args, uchar*); 22259cc4ca5SDavid du Colombier 223*5d459b5aSDavid du Colombier sprint(buf, "%.*L %.*B", fmt->prec, p, fmt->prec, p+fmt->prec); 224*5d459b5aSDavid du Colombier fmt->flags &= ~FmtPrec; 225*5d459b5aSDavid du Colombier fmtstrcpy(fmt, buf); 22659cc4ca5SDavid du Colombier return 0; 22759cc4ca5SDavid du Colombier } 22859cc4ca5SDavid du Colombier 22959cc4ca5SDavid du Colombier int 230*5d459b5aSDavid du Colombier asciiTfmt(Fmt *fmt) 23159cc4ca5SDavid du Colombier { 23259cc4ca5SDavid du Colombier char *p, buf[256]; 23359cc4ca5SDavid du Colombier int i; 23459cc4ca5SDavid du Colombier 235*5d459b5aSDavid du Colombier p = va_arg(fmt->args, char*); 236*5d459b5aSDavid 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'; 242*5d459b5aSDavid du Colombier fmt->flags &= ~FmtPrec; 243*5d459b5aSDavid du Colombier fmtstrcpy(fmt, buf); 24459cc4ca5SDavid du Colombier return 0; 24559cc4ca5SDavid du Colombier } 24659cc4ca5SDavid du Colombier 24759cc4ca5SDavid du Colombier int 248*5d459b5aSDavid 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 254*5d459b5aSDavid du Colombier p = va_arg(fmt->args, uchar*); 255*5d459b5aSDavid 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'; 261*5d459b5aSDavid du Colombier fmt->flags &= ~FmtPrec; 262*5d459b5aSDavid du Colombier return fmtprint(fmt, "%S", buf); 26359cc4ca5SDavid du Colombier } 26459cc4ca5SDavid du Colombier 26559cc4ca5SDavid du Colombier void 26659cc4ca5SDavid du Colombier ascii(void) 26759cc4ca5SDavid du Colombier { 268*5d459b5aSDavid du Colombier fmtinstall('T', asciiTfmt); 26959cc4ca5SDavid du Colombier } 27059cc4ca5SDavid du Colombier 27159cc4ca5SDavid du Colombier void 27259cc4ca5SDavid du Colombier joliet(void) 27359cc4ca5SDavid du Colombier { 274*5d459b5aSDavid du Colombier fmtinstall('T', runeTfmt); 27559cc4ca5SDavid du Colombier } 27659cc4ca5SDavid du Colombier 27759cc4ca5SDavid du Colombier void 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*5d459b5aSDavid du Colombier sysfatal("reading block %ux\n", n); 282*5d459b5aSDavid du Colombier } 283*5d459b5aSDavid du Colombier 284*5d459b5aSDavid du Colombier void 285*5d459b5aSDavid du Colombier pathtable(Voldesc *v, int islittle) 286*5d459b5aSDavid du Colombier { 287*5d459b5aSDavid du Colombier int i, j, n, sz, addr; 288*5d459b5aSDavid du Colombier ulong (*word)(void*, int); 289*5d459b5aSDavid du Colombier uchar x[2048], *p, *ep; 290*5d459b5aSDavid du Colombier Path *pt; 291*5d459b5aSDavid du Colombier 292*5d459b5aSDavid du Colombier print(">>> entire %s path table\n", islittle ? "little" : "big"); 293*5d459b5aSDavid du Colombier littleend(); 294*5d459b5aSDavid du Colombier if(islittle) { 295*5d459b5aSDavid du Colombier littleend(); 296*5d459b5aSDavid du Colombier word = little; 297*5d459b5aSDavid du Colombier }else{ 298*5d459b5aSDavid du Colombier bigend(); 299*5d459b5aSDavid du Colombier word = big; 300*5d459b5aSDavid du Colombier } 301*5d459b5aSDavid du Colombier sz = little(v->pathsize, 4); /* little, not word */ 302*5d459b5aSDavid du Colombier addr = word(islittle ? v->lpathloc : v->mpathloc, 4); 303*5d459b5aSDavid du Colombier j = 0; 304*5d459b5aSDavid du Colombier n = 1; 305*5d459b5aSDavid du Colombier while(sz > 0){ 306*5d459b5aSDavid du Colombier getsect(x, addr); 307*5d459b5aSDavid du Colombier p = x; 308*5d459b5aSDavid du Colombier ep = x+sz; 309*5d459b5aSDavid du Colombier if(ep > x+2048) 310*5d459b5aSDavid du Colombier ep = x+2048; 311*5d459b5aSDavid du Colombier for(i=0; p<ep; i++) { 312*5d459b5aSDavid du Colombier pt = (Path*)p; 313*5d459b5aSDavid du Colombier if(pt->namelen==0) 314*5d459b5aSDavid du Colombier break; 315*5d459b5aSDavid du Colombier print("0x%.4x %4d+%-4ld %P\n", n, j, p-x, pt); 316*5d459b5aSDavid du Colombier n++; 317*5d459b5aSDavid du Colombier p += 8+pt->namelen+(pt->namelen&1); 318*5d459b5aSDavid du Colombier } 319*5d459b5aSDavid du Colombier sz -= 2048; 320*5d459b5aSDavid du Colombier addr++; 321*5d459b5aSDavid du Colombier j++; 322*5d459b5aSDavid du Colombier } 32359cc4ca5SDavid du Colombier } 32459cc4ca5SDavid du Colombier 32559cc4ca5SDavid du Colombier void 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); 339*5d459b5aSDavid 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 347*5d459b5aSDavid du Colombier pathtable(v, 1); 348*5d459b5aSDavid du Colombier pathtable(v, 0); 349*5d459b5aSDavid du Colombier } 35059cc4ca5SDavid du Colombier 35159cc4ca5SDavid du Colombier void 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) 35759cc4ca5SDavid du Colombier sysfatal("usage: %s file\n", argv[0]); 35859cc4ca5SDavid du Colombier 35959cc4ca5SDavid du Colombier b = Bopen(argv[1], OREAD); 36059cc4ca5SDavid du Colombier if(b == nil) 36159cc4ca5SDavid du Colombier sysfatal("bopen %r\n"); 36259cc4ca5SDavid du Colombier 363*5d459b5aSDavid du Colombier fmtinstall('L', BLfmt); 364*5d459b5aSDavid du Colombier fmtinstall('B', BLfmt); 365*5d459b5aSDavid du Colombier fmtinstall('N', Nfmt); 366*5d459b5aSDavid du Colombier fmtinstall('D', Dfmt); 367*5d459b5aSDavid 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