xref: /plan9/sys/src/cmd/disk/9660/iso9660.h (revision f7db61556a577f91350f05658e9c0724969b02c3)
180ee5cbfSDavid du Colombier /*
280ee5cbfSDavid du Colombier  * iso9660.h
380ee5cbfSDavid du Colombier  *
480ee5cbfSDavid du Colombier  * Routines and data structures to support reading and writing ISO 9660 CD images.
580ee5cbfSDavid du Colombier  * See the ISO 9660 or ECMA 119 standards.
680ee5cbfSDavid du Colombier  *
780ee5cbfSDavid du Colombier  * Also supports Rock Ridge extensions for long file names and Unix stuff.
880ee5cbfSDavid du Colombier  * Also supports Microsoft's Joliet extensions for Unicode and long file names.
99a747e4fSDavid du Colombier  * Also supports El Torito bootable CD spec.
1080ee5cbfSDavid du Colombier  */
1180ee5cbfSDavid du Colombier 
1280ee5cbfSDavid du Colombier typedef struct Cdimg Cdimg;
1380ee5cbfSDavid du Colombier typedef struct Cdinfo Cdinfo;
1480ee5cbfSDavid du Colombier typedef struct Conform Conform;
1580ee5cbfSDavid du Colombier typedef struct Direc Direc;
1680ee5cbfSDavid du Colombier typedef struct Dumproot Dumproot;
1780ee5cbfSDavid du Colombier typedef struct Voldesc Voldesc;
1880ee5cbfSDavid du Colombier typedef struct XDir XDir;
1980ee5cbfSDavid du Colombier 
2080ee5cbfSDavid du Colombier #ifndef CHLINK
2180ee5cbfSDavid du Colombier #define CHLINK 0
2280ee5cbfSDavid du Colombier #endif
2380ee5cbfSDavid du Colombier 
2480ee5cbfSDavid du Colombier struct XDir {
2580ee5cbfSDavid du Colombier 	char	*name;
2680ee5cbfSDavid du Colombier 	char	*uid;
2780ee5cbfSDavid du Colombier 	char	*gid;
2880ee5cbfSDavid du Colombier 	char	*symlink;
2980ee5cbfSDavid du Colombier 	ulong   uidno;   /* Numeric uid */
3080ee5cbfSDavid du Colombier 	ulong   gidno;   /* Numeric gid */
3180ee5cbfSDavid du Colombier 
3280ee5cbfSDavid du Colombier 	ulong	mode;
3380ee5cbfSDavid du Colombier 	ulong	atime;
3480ee5cbfSDavid du Colombier 	ulong	mtime;
3580ee5cbfSDavid du Colombier 	ulong   ctime;
3680ee5cbfSDavid du Colombier 
3780ee5cbfSDavid du Colombier         vlong   length;
3880ee5cbfSDavid du Colombier };
3980ee5cbfSDavid du Colombier 
4080ee5cbfSDavid du Colombier /*
4180ee5cbfSDavid du Colombier  * A directory entry in a ISO9660 tree.
4280ee5cbfSDavid du Colombier  * The extra data (uid, etc.) here is put into the system use areas.
4380ee5cbfSDavid du Colombier  */
4480ee5cbfSDavid du Colombier struct Direc {
4580ee5cbfSDavid du Colombier 	char *name;	/* real name */
4680ee5cbfSDavid du Colombier 	char *confname;	/* conformant name */
4780ee5cbfSDavid du Colombier 	char *srcfile;	/* file to copy onto the image */
4880ee5cbfSDavid du Colombier 
4980ee5cbfSDavid du Colombier 	ulong block;
5080ee5cbfSDavid du Colombier 	ulong length;
5180ee5cbfSDavid du Colombier 	int flags;
5280ee5cbfSDavid du Colombier 
5380ee5cbfSDavid du Colombier 	char *uid;
5480ee5cbfSDavid du Colombier 	char *gid;
5580ee5cbfSDavid du Colombier 	char *symlink;
5680ee5cbfSDavid du Colombier 	ulong mode;
5780ee5cbfSDavid du Colombier 	long atime;
5880ee5cbfSDavid du Colombier 	long ctime;
5980ee5cbfSDavid du Colombier 	long mtime;
6080ee5cbfSDavid du Colombier 
6180ee5cbfSDavid du Colombier 	ulong uidno;
6280ee5cbfSDavid du Colombier 	ulong gidno;
6380ee5cbfSDavid du Colombier 
6480ee5cbfSDavid du Colombier 	Direc *child;
6580ee5cbfSDavid du Colombier 	int nchild;
6680ee5cbfSDavid du Colombier };
6780ee5cbfSDavid du Colombier enum {  /* Direc flags */
6880ee5cbfSDavid du Colombier 	Dbadname = 1<<0,  /* Non-conformant name     */
6980ee5cbfSDavid du Colombier };
7080ee5cbfSDavid du Colombier 
7180ee5cbfSDavid du Colombier /*
7280ee5cbfSDavid du Colombier  * Data found in a volume descriptor.
7380ee5cbfSDavid du Colombier  */
7480ee5cbfSDavid du Colombier struct Voldesc {
7580ee5cbfSDavid du Colombier 	char *systemid;
7680ee5cbfSDavid du Colombier 	char *volumeset;
7780ee5cbfSDavid du Colombier 	char *publisher;
7880ee5cbfSDavid du Colombier 	char *preparer;
7980ee5cbfSDavid du Colombier 	char *application;
8080ee5cbfSDavid du Colombier 
8180ee5cbfSDavid du Colombier 	/* file names for various parameters */
8280ee5cbfSDavid du Colombier 	char *abstract;
8380ee5cbfSDavid du Colombier 	char *biblio;
8480ee5cbfSDavid du Colombier 	char *notice;
8580ee5cbfSDavid du Colombier 
8680ee5cbfSDavid du Colombier 	/* path table */
8780ee5cbfSDavid du Colombier 	ulong pathsize;
8880ee5cbfSDavid du Colombier 	ulong lpathloc;
8980ee5cbfSDavid du Colombier 	ulong mpathloc;
9080ee5cbfSDavid du Colombier 
9180ee5cbfSDavid du Colombier 	/* root of file tree */
9280ee5cbfSDavid du Colombier 	Direc root;
9380ee5cbfSDavid du Colombier };
9480ee5cbfSDavid du Colombier 
9580ee5cbfSDavid du Colombier /*
9680ee5cbfSDavid du Colombier  * An ISO9660 CD image.  Various parameters are kept in memory but the
9780ee5cbfSDavid du Colombier  * real image file is opened for reading and writing on fd.
9880ee5cbfSDavid du Colombier  *
9980ee5cbfSDavid du Colombier  * The bio buffers brd and bwr moderate reading and writing to the image.
10080ee5cbfSDavid du Colombier  * The routines we use are careful to flush one before or after using the other,
10180ee5cbfSDavid du Colombier  * as necessary.
10280ee5cbfSDavid du Colombier  */
10380ee5cbfSDavid du Colombier struct Cdimg {
10480ee5cbfSDavid du Colombier 	char *file;
10580ee5cbfSDavid du Colombier 	int fd;
10680ee5cbfSDavid du Colombier 	ulong dumpblock;
10780ee5cbfSDavid du Colombier 	ulong nextblock;
10880ee5cbfSDavid du Colombier 	ulong iso9660pvd;
10980ee5cbfSDavid du Colombier 	ulong jolietsvd;
11080ee5cbfSDavid du Colombier 	ulong pathblock;
11173ee67a1SDavid du Colombier 	uvlong rrcontin;	/* rock ridge continuation offset */
11280ee5cbfSDavid du Colombier 	ulong nulldump;		/* next dump block */
11380ee5cbfSDavid du Colombier 	ulong nconform;		/* number of conform entries written already */
11473ee67a1SDavid du Colombier 	uvlong bootcatptr;
1159a747e4fSDavid du Colombier 	ulong bootcatblock;
11673ee67a1SDavid du Colombier 	uvlong bootimageptr;
117*f7db6155SDavid du Colombier 	Direc *loaderdirec;
1189a747e4fSDavid du Colombier 	Direc *bootdirec;
1199a747e4fSDavid du Colombier 	char *bootimage;
120*f7db6155SDavid du Colombier 	char *loader;
1219a747e4fSDavid du Colombier 
12280ee5cbfSDavid du Colombier 	Biobuf brd;
12380ee5cbfSDavid du Colombier 	Biobuf bwr;
12480ee5cbfSDavid du Colombier 
12580ee5cbfSDavid du Colombier 	int flags;
12680ee5cbfSDavid du Colombier 
12780ee5cbfSDavid du Colombier 	Voldesc iso;
12880ee5cbfSDavid du Colombier 	Voldesc joliet;
12980ee5cbfSDavid du Colombier };
13080ee5cbfSDavid du Colombier enum {	/* Cdimg->flags, Cdinfo->flags */
13180ee5cbfSDavid du Colombier 	CDjoliet = 1<<0,
13280ee5cbfSDavid du Colombier 	CDplan9 = 1<<1,
13380ee5cbfSDavid du Colombier 	CDconform = 1<<2,
13480ee5cbfSDavid du Colombier 	CDrockridge = 1<<3,
13580ee5cbfSDavid du Colombier 	CDnew = 1<<4,
13680ee5cbfSDavid du Colombier 	CDdump = 1<<5,
1379a747e4fSDavid du Colombier 	CDbootable = 1<<6,
13843751f27SDavid du Colombier 	CDbootnoemu = 1<<7,
139*f7db6155SDavid du Colombier 	CDpbs= 1<<8,
14080ee5cbfSDavid du Colombier };
14180ee5cbfSDavid du Colombier 
14280ee5cbfSDavid du Colombier typedef struct Tx Tx;
14380ee5cbfSDavid du Colombier struct Tx {
14480ee5cbfSDavid du Colombier 	char *bad;	/* atoms */
14580ee5cbfSDavid du Colombier 	char *good;
14680ee5cbfSDavid du Colombier };
14780ee5cbfSDavid du Colombier 
14880ee5cbfSDavid du Colombier struct Conform {
14980ee5cbfSDavid du Colombier 	Tx *t;
15080ee5cbfSDavid du Colombier 	int nt;	/* delta = 32 */
15180ee5cbfSDavid du Colombier };
15280ee5cbfSDavid du Colombier 
15380ee5cbfSDavid du Colombier struct Cdinfo {
15480ee5cbfSDavid du Colombier 	int flags;
15580ee5cbfSDavid du Colombier 
15680ee5cbfSDavid du Colombier 	char *volumename;
15780ee5cbfSDavid du Colombier 
15880ee5cbfSDavid du Colombier 	char *volumeset;
15980ee5cbfSDavid du Colombier 	char *publisher;
16080ee5cbfSDavid du Colombier 	char *preparer;
16180ee5cbfSDavid du Colombier 	char *application;
1629a747e4fSDavid du Colombier 	char *bootimage;
163*f7db6155SDavid du Colombier 	char *loader;
16480ee5cbfSDavid du Colombier };
16580ee5cbfSDavid du Colombier 
16680ee5cbfSDavid du Colombier /*
16780ee5cbfSDavid du Colombier  * This is a doubly binary tree.
16880ee5cbfSDavid du Colombier  * We have a tree keyed on the MD5 values
16980ee5cbfSDavid du Colombier  * as well as a tree keyed on the block numbers.
17080ee5cbfSDavid du Colombier  */
17180ee5cbfSDavid du Colombier typedef struct Dump Dump;
17280ee5cbfSDavid du Colombier typedef struct Dumpdir Dumpdir;
17380ee5cbfSDavid du Colombier 
17480ee5cbfSDavid du Colombier struct Dump {
17580ee5cbfSDavid du Colombier 	Cdimg *cd;
17680ee5cbfSDavid du Colombier 	Dumpdir *md5root;
17780ee5cbfSDavid du Colombier 	Dumpdir *blockroot;
17880ee5cbfSDavid du Colombier };
17980ee5cbfSDavid du Colombier 
18080ee5cbfSDavid du Colombier struct Dumpdir {
18180ee5cbfSDavid du Colombier 	char *name;
18280ee5cbfSDavid du Colombier 	uchar md5[MD5dlen];
18380ee5cbfSDavid du Colombier 	ulong block;
18480ee5cbfSDavid du Colombier 	ulong length;
18580ee5cbfSDavid du Colombier 	Dumpdir *md5left;
18680ee5cbfSDavid du Colombier 	Dumpdir *md5right;
18780ee5cbfSDavid du Colombier 	Dumpdir *blockleft;
18880ee5cbfSDavid du Colombier 	Dumpdir *blockright;
18980ee5cbfSDavid du Colombier };
19080ee5cbfSDavid du Colombier 
19180ee5cbfSDavid du Colombier struct Dumproot {
19280ee5cbfSDavid du Colombier 	char *name;
19380ee5cbfSDavid du Colombier 	int nkid;
19480ee5cbfSDavid du Colombier 	Dumproot *kid;
19580ee5cbfSDavid du Colombier 	Direc root;
19680ee5cbfSDavid du Colombier 	Direc jroot;
19780ee5cbfSDavid du Colombier };
19880ee5cbfSDavid du Colombier 
19980ee5cbfSDavid du Colombier /*
20080ee5cbfSDavid du Colombier  * ISO9660 on-CD structures.
20180ee5cbfSDavid du Colombier  */
20280ee5cbfSDavid du Colombier typedef struct Cdir Cdir;
20380ee5cbfSDavid du Colombier typedef struct Cpath Cpath;
20480ee5cbfSDavid du Colombier typedef struct Cvoldesc Cvoldesc;
20580ee5cbfSDavid du Colombier 
20680ee5cbfSDavid du Colombier /* a volume descriptor block */
20780ee5cbfSDavid du Colombier struct Cvoldesc {
20880ee5cbfSDavid du Colombier 	uchar	magic[8];	/* 0x01, "CD001", 0x01, 0x00 */
20980ee5cbfSDavid du Colombier 	uchar	systemid[32];	/* system identifier */
21080ee5cbfSDavid du Colombier 	uchar	volumeid[32];	/* volume identifier */
21180ee5cbfSDavid du Colombier 	uchar	unused[8];	/* character set in secondary desc */
21280ee5cbfSDavid du Colombier 	uchar	volsize[8];	/* volume size */
21380ee5cbfSDavid du Colombier 	uchar	charset[32];
21480ee5cbfSDavid du Colombier 	uchar	volsetsize[4];	/* volume set size = 1 */
21580ee5cbfSDavid du Colombier 	uchar	volseqnum[4];	/* volume sequence number = 1 */
21680ee5cbfSDavid du Colombier 	uchar	blocksize[4];	/* logical block size */
21780ee5cbfSDavid du Colombier 	uchar	pathsize[8];	/* path table size */
21880ee5cbfSDavid du Colombier 	uchar	lpathloc[4];	/* Lpath */
21980ee5cbfSDavid du Colombier 	uchar	olpathloc[4];	/* optional Lpath */
22080ee5cbfSDavid du Colombier 	uchar	mpathloc[4];	/* Mpath */
22180ee5cbfSDavid du Colombier 	uchar	ompathloc[4];	/* optional Mpath */
22280ee5cbfSDavid du Colombier 	uchar	rootdir[34];	/* directory entry for root */
22380ee5cbfSDavid du Colombier 	uchar	volumeset[128];	/* volume set identifier */
22480ee5cbfSDavid du Colombier 	uchar	publisher[128];
22580ee5cbfSDavid du Colombier 	uchar	preparer[128];	/* data preparer identifier */
22680ee5cbfSDavid du Colombier 	uchar	application[128];	/* application identifier */
22780ee5cbfSDavid du Colombier 	uchar	notice[37];	/* copyright notice file */
22880ee5cbfSDavid du Colombier 	uchar	abstract[37];	/* abstract file */
22980ee5cbfSDavid du Colombier 	uchar	biblio[37];	/* bibliographic file */
23080ee5cbfSDavid du Colombier 	uchar	cdate[17];	/* creation date */
23180ee5cbfSDavid du Colombier 	uchar	mdate[17];	/* modification date */
23280ee5cbfSDavid du Colombier 	uchar	xdate[17];	/* expiration date */
23380ee5cbfSDavid du Colombier 	uchar	edate[17];	/* effective date */
23480ee5cbfSDavid du Colombier 	uchar	fsvers;		/* file system version = 1 */
23580ee5cbfSDavid du Colombier };
23680ee5cbfSDavid du Colombier 
23780ee5cbfSDavid du Colombier /* a directory entry */
23880ee5cbfSDavid du Colombier struct Cdir {
23980ee5cbfSDavid du Colombier 	uchar	len;
24080ee5cbfSDavid du Colombier 	uchar	xlen;
24180ee5cbfSDavid du Colombier 	uchar	dloc[8];
24280ee5cbfSDavid du Colombier 	uchar	dlen[8];
24380ee5cbfSDavid du Colombier 	uchar	date[7];
24480ee5cbfSDavid du Colombier 	uchar	flags;
24580ee5cbfSDavid du Colombier 	uchar	unitsize;
24680ee5cbfSDavid du Colombier 	uchar	gapsize;
24780ee5cbfSDavid du Colombier 	uchar	volseqnum[4];
24880ee5cbfSDavid du Colombier 	uchar	namelen;
24980ee5cbfSDavid du Colombier 	uchar	name[1];	/* chumminess */
25080ee5cbfSDavid du Colombier };
25180ee5cbfSDavid du Colombier 
25280ee5cbfSDavid du Colombier /* a path table entry */
25380ee5cbfSDavid du Colombier struct Cpath {
25480ee5cbfSDavid du Colombier 	uchar   namelen;
25580ee5cbfSDavid du Colombier 	uchar   xlen;
25680ee5cbfSDavid du Colombier 	uchar   dloc[4];
25780ee5cbfSDavid du Colombier 	uchar   parent[2];
25880ee5cbfSDavid du Colombier 	uchar   name[1];        /* chumminess */
25980ee5cbfSDavid du Colombier };
26080ee5cbfSDavid du Colombier 
26180ee5cbfSDavid du Colombier enum { /* Rockridge flags */
26280ee5cbfSDavid du Colombier 	RR_PX = 1<<0,
26380ee5cbfSDavid du Colombier 	RR_PN = 1<<1,
26480ee5cbfSDavid du Colombier 	RR_SL = 1<<2,
26580ee5cbfSDavid du Colombier 	RR_NM = 1<<3,
26680ee5cbfSDavid du Colombier 	RR_CL = 1<<4,
26780ee5cbfSDavid du Colombier 	RR_PL = 1<<5,
26880ee5cbfSDavid du Colombier 	RR_RE = 1<<6,
26980ee5cbfSDavid du Colombier 	RR_TF = 1<<7,
27080ee5cbfSDavid du Colombier };
27180ee5cbfSDavid du Colombier 
27280ee5cbfSDavid du Colombier enum { /* CputrripTF type argument */
27380ee5cbfSDavid du Colombier 	TFcreation = 1<<0,
27480ee5cbfSDavid du Colombier 	TFmodify = 1<<1,
27580ee5cbfSDavid du Colombier 	TFaccess = 1<<2,
27680ee5cbfSDavid du Colombier 	TFattributes = 1<<3,
27780ee5cbfSDavid du Colombier 	TFbackup = 1<<4,
27880ee5cbfSDavid du Colombier 	TFexpiration = 1<<5,
27980ee5cbfSDavid du Colombier 	TFeffective = 1<<6,
28080ee5cbfSDavid du Colombier 	TFlongform = 1<<7,
28180ee5cbfSDavid du Colombier };
28280ee5cbfSDavid du Colombier 
28380ee5cbfSDavid du Colombier enum { /* CputrripNM flag types */
28480ee5cbfSDavid du Colombier 	NMcontinue = 1<<0,
28580ee5cbfSDavid du Colombier 	NMcurrent = 1<<1,
28680ee5cbfSDavid du Colombier 	NMparent = 1<<2,
28780ee5cbfSDavid du Colombier 	NMroot = 1<<3,
28880ee5cbfSDavid du Colombier 	NMvolroot = 1<<4,
28980ee5cbfSDavid du Colombier 	NMhost = 1<<5,
29080ee5cbfSDavid du Colombier };
29180ee5cbfSDavid du Colombier 
2929a747e4fSDavid du Colombier /* boot.c */
2939a747e4fSDavid du Colombier void Cputbootvol(Cdimg*);
2949a747e4fSDavid du Colombier void Cputbootcat(Cdimg*);
2959a747e4fSDavid du Colombier void Cupdatebootvol(Cdimg*);
2969a747e4fSDavid du Colombier void Cupdatebootcat(Cdimg*);
297*f7db6155SDavid du Colombier void Cfillpbs(Cdimg*);
2989a747e4fSDavid du Colombier void findbootimage(Cdimg*, Direc*);
299*f7db6155SDavid du Colombier void findloader(Cdimg*, Direc*);
3009a747e4fSDavid du Colombier 
30180ee5cbfSDavid du Colombier /* cdrdwr.c */
30280ee5cbfSDavid du Colombier Cdimg *createcd(char*, Cdinfo);
30380ee5cbfSDavid du Colombier Cdimg *opencd(char*, Cdinfo);
30480ee5cbfSDavid du Colombier void Creadblock(Cdimg*, void*, ulong, ulong);
30580ee5cbfSDavid du Colombier ulong big(void*, int);
30680ee5cbfSDavid du Colombier ulong little(void*, int);
30780ee5cbfSDavid du Colombier int parsedir(Cdimg*, Direc*, uchar*, int, char *(*)(uchar*, int));
30880ee5cbfSDavid du Colombier void setroot(Cdimg*, ulong, ulong, ulong);
3093e33a36fSDavid du Colombier void setvolsize(Cdimg*, uvlong, ulong);
31080ee5cbfSDavid du Colombier void setpathtable(Cdimg*, ulong, ulong, ulong, ulong);
31180ee5cbfSDavid du Colombier void Cputc(Cdimg*, int);
3123e33a36fSDavid du Colombier void Cputnl(Cdimg*, uvlong, int);
3133e33a36fSDavid du Colombier void Cputnm(Cdimg*, uvlong, int);
3143e33a36fSDavid du Colombier void Cputn(Cdimg*, uvlong, int);
31580ee5cbfSDavid du Colombier void Crepeat(Cdimg*, int, int);
31680ee5cbfSDavid du Colombier void Cputs(Cdimg*, char*, int);
31780ee5cbfSDavid du Colombier void Cwrite(Cdimg*, void*, int);
31880ee5cbfSDavid du Colombier void Cputr(Cdimg*, Rune);
31980ee5cbfSDavid du Colombier void Crepeatr(Cdimg*, Rune, int);
32080ee5cbfSDavid du Colombier void Cputrs(Cdimg*, Rune*, int);
32180ee5cbfSDavid du Colombier void Cputrscvt(Cdimg*, char*, int);
32280ee5cbfSDavid du Colombier void Cpadblock(Cdimg*);
32380ee5cbfSDavid du Colombier void Cputdate(Cdimg*, ulong);
32480ee5cbfSDavid du Colombier void Cputdate1(Cdimg*, ulong);
32580ee5cbfSDavid du Colombier void Cread(Cdimg*, void*, int);
32680ee5cbfSDavid du Colombier void Cwflush(Cdimg*);
32773ee67a1SDavid du Colombier void Cwseek(Cdimg*, vlong);
32873ee67a1SDavid du Colombier uvlong Cwoffset(Cdimg*);
32973ee67a1SDavid du Colombier uvlong Croffset(Cdimg*);
33080ee5cbfSDavid du Colombier int Cgetc(Cdimg*);
33173ee67a1SDavid du Colombier void Crseek(Cdimg*, vlong);
33280ee5cbfSDavid du Colombier char *Crdline(Cdimg*, int);
33380ee5cbfSDavid du Colombier int Clinelen(Cdimg*);
33480ee5cbfSDavid du Colombier 
33580ee5cbfSDavid du Colombier /* conform.c */
33680ee5cbfSDavid du Colombier void rdconform(Cdimg*);
33780ee5cbfSDavid du Colombier char *conform(char*, int);
33873ee67a1SDavid du Colombier void wrconform(Cdimg*, int, ulong*, uvlong*);
33980ee5cbfSDavid du Colombier 
34080ee5cbfSDavid du Colombier /* direc.c */
34180ee5cbfSDavid du Colombier void mkdirec(Direc*, XDir*);
34280ee5cbfSDavid du Colombier Direc *walkdirec(Direc*, char*);
34380ee5cbfSDavid du Colombier Direc *adddirec(Direc*, char*, XDir*);
34480ee5cbfSDavid du Colombier void copydirec(Direc*, Direc*);
34580ee5cbfSDavid du Colombier void checknames(Direc*, int (*)(char*));
34680ee5cbfSDavid du Colombier void convertnames(Direc*, char* (*)(char*, char*));
34780ee5cbfSDavid du Colombier void dsort(Direc*, int (*)(const void*, const void*));
34880ee5cbfSDavid du Colombier void setparents(Direc*);
34980ee5cbfSDavid du Colombier 
35080ee5cbfSDavid du Colombier /* dump.c */
35180ee5cbfSDavid du Colombier ulong Cputdumpblock(Cdimg*);
35280ee5cbfSDavid du Colombier int hasdump(Cdimg*);
35380ee5cbfSDavid du Colombier Dump *dumpcd(Cdimg*, Direc*);
35480ee5cbfSDavid du Colombier Dumpdir *lookupmd5(Dump*, uchar*);
35580ee5cbfSDavid du Colombier void insertmd5(Dump*, char*, uchar*, ulong, ulong);
35680ee5cbfSDavid du Colombier 
35780ee5cbfSDavid du Colombier Direc readdumpdirs(Cdimg*, XDir*, char*(*)(uchar*,int));
35880ee5cbfSDavid du Colombier char *adddumpdir(Direc*, ulong, XDir*);
35980ee5cbfSDavid du Colombier void copybutname(Direc*, Direc*);
36080ee5cbfSDavid du Colombier 
36180ee5cbfSDavid du Colombier void readkids(Cdimg*, Direc*, char*(*)(uchar*,int));
36280ee5cbfSDavid du Colombier void freekids(Direc*);
36380ee5cbfSDavid du Colombier void readdumpconform(Cdimg*);
36480ee5cbfSDavid du Colombier void rmdumpdir(Direc*, char*);
36580ee5cbfSDavid du Colombier 
36680ee5cbfSDavid du Colombier /* ichar.c */
36780ee5cbfSDavid du Colombier char *isostring(uchar*, int);
36880ee5cbfSDavid du Colombier int isbadiso9660(char*);
36980ee5cbfSDavid du Colombier int isocmp(const void*, const void*);
37080ee5cbfSDavid du Colombier int isisofrog(char);
37180ee5cbfSDavid du Colombier void Cputisopvd(Cdimg*, Cdinfo);
37280ee5cbfSDavid du Colombier 
37380ee5cbfSDavid du Colombier /* jchar.c */
37480ee5cbfSDavid du Colombier char *jolietstring(uchar*, int);
37580ee5cbfSDavid du Colombier int isbadjoliet(char*);
37680ee5cbfSDavid du Colombier int jolietcmp(const void*, const void*);
37780ee5cbfSDavid du Colombier int isjolietfrog(Rune);
37880ee5cbfSDavid du Colombier void Cputjolietsvd(Cdimg*, Cdinfo);
37980ee5cbfSDavid du Colombier 
38080ee5cbfSDavid du Colombier /* path.c */
38180ee5cbfSDavid du Colombier void writepathtables(Cdimg*);
38280ee5cbfSDavid du Colombier 
38380ee5cbfSDavid du Colombier /* util.c */
38480ee5cbfSDavid du Colombier void *emalloc(ulong);
38580ee5cbfSDavid du Colombier void *erealloc(void*, ulong);
38680ee5cbfSDavid du Colombier char *atom(char*);
38780ee5cbfSDavid du Colombier char *struprcpy(char*, char*);
38880ee5cbfSDavid du Colombier int chat(char*, ...);
38980ee5cbfSDavid du Colombier 
39080ee5cbfSDavid du Colombier /* unix.c, plan9.c */
39180ee5cbfSDavid du Colombier void dirtoxdir(XDir*, Dir*);
39280ee5cbfSDavid du Colombier void fdtruncate(int, ulong);
39380ee5cbfSDavid du Colombier long uidno(char*);
39480ee5cbfSDavid du Colombier long gidno(char*);
39580ee5cbfSDavid du Colombier 
39680ee5cbfSDavid du Colombier /* rune.c */
39780ee5cbfSDavid du Colombier Rune *strtorune(Rune*, char*);
39880ee5cbfSDavid du Colombier Rune *runechr(Rune*, Rune);
39980ee5cbfSDavid du Colombier int runecmp(Rune*, Rune*);
40080ee5cbfSDavid du Colombier 
40180ee5cbfSDavid du Colombier /* sysuse.c */
40280ee5cbfSDavid du Colombier int Cputsysuse(Cdimg*, Direc*, int, int, int);
40380ee5cbfSDavid du Colombier 
40480ee5cbfSDavid du Colombier /* write.c */
40580ee5cbfSDavid du Colombier void writefiles(Dump*, Cdimg*, Direc*);
40680ee5cbfSDavid du Colombier void writedirs(Cdimg*, Direc*, int(*)(Cdimg*, Direc*, int, int, int));
40780ee5cbfSDavid du Colombier void writedumpdirs(Cdimg*, Direc*, int(*)(Cdimg*, Direc*, int, int, int));
40880ee5cbfSDavid du Colombier int Cputisodir(Cdimg*, Direc*, int, int, int);
40980ee5cbfSDavid du Colombier int Cputjolietdir(Cdimg*, Direc*, int, int, int);
41080ee5cbfSDavid du Colombier void Cputendvd(Cdimg*);
41180ee5cbfSDavid du Colombier 
41280ee5cbfSDavid du Colombier enum {
41380ee5cbfSDavid du Colombier 	Blocksize = 2048,
41480ee5cbfSDavid du Colombier 	Ndirblock = 16,		/* directory blocks allocated at once */
41580ee5cbfSDavid du Colombier 
41680ee5cbfSDavid du Colombier 	DTdot = 0,
41780ee5cbfSDavid du Colombier 	DTdotdot,
41880ee5cbfSDavid du Colombier 	DTiden,
41980ee5cbfSDavid du Colombier 	DTroot,
42080ee5cbfSDavid du Colombier 	DTrootdot,
42180ee5cbfSDavid du Colombier };
42280ee5cbfSDavid du Colombier 
42380ee5cbfSDavid du Colombier extern ulong now;
42480ee5cbfSDavid du Colombier extern Conform *map;
42580ee5cbfSDavid du Colombier extern int chatty;
42680ee5cbfSDavid du Colombier extern int docolon;
42780ee5cbfSDavid du Colombier extern int mk9660;
4284fec87e5SDavid du Colombier extern int blocksize;
429