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