123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- /*
- * iso9660.h
- *
- * Routines and data structures to support reading and writing ISO 9660 CD images.
- * See the ISO 9660 or ECMA 119 standards.
- *
- * Also supports Rock Ridge extensions for long file names and Unix stuff.
- * Also supports Microsoft's Joliet extensions for Unicode and long file names.
- * Also supports El Torito bootable CD spec.
- */
- typedef struct Cdimg Cdimg;
- typedef struct Cdinfo Cdinfo;
- typedef struct Conform Conform;
- typedef struct Direc Direc;
- typedef struct Dumproot Dumproot;
- typedef struct Voldesc Voldesc;
- typedef struct XDir XDir;
- #ifndef CHLINK
- #define CHLINK 0
- #endif
- struct XDir {
- char *name;
- char *uid;
- char *gid;
- char *symlink;
- ulong uidno; /* Numeric uid */
- ulong gidno; /* Numeric gid */
- ulong mode;
- ulong atime;
- ulong mtime;
- ulong ctime;
- vlong length;
- };
- /*
- * A directory entry in a ISO9660 tree.
- * The extra data (uid, etc.) here is put into the system use areas.
- */
- struct Direc {
- char *name; /* real name */
- char *confname; /* conformant name */
- char *srcfile; /* file to copy onto the image */
- ulong block;
- ulong length;
- int flags;
- char *uid;
- char *gid;
- char *symlink;
- ulong mode;
- long atime;
- long ctime;
- long mtime;
- ulong uidno;
- ulong gidno;
- Direc *child;
- int nchild;
- };
- enum { /* Direc flags */
- Dbadname = 1<<0, /* Non-conformant name */
- };
- /*
- * Data found in a volume descriptor.
- */
- struct Voldesc {
- char *systemid;
- char *volumeset;
- char *publisher;
- char *preparer;
- char *application;
- /* file names for various parameters */
- char *abstract;
- char *biblio;
- char *notice;
- /* path table */
- ulong pathsize;
- ulong lpathloc;
- ulong mpathloc;
- /* root of file tree */
- Direc root;
- };
- /*
- * An ISO9660 CD image. Various parameters are kept in memory but the
- * real image file is opened for reading and writing on fd.
- *
- * The bio buffers brd and bwr moderate reading and writing to the image.
- * The routines we use are careful to flush one before or after using the other,
- * as necessary.
- */
- struct Cdimg {
- char *file;
- int fd;
- ulong dumpblock;
- ulong nextblock;
- ulong iso9660pvd;
- ulong jolietsvd;
- ulong pathblock;
- ulong rrcontin; /* rock ridge continuation offset */
- ulong nulldump; /* next dump block */
- ulong nconform; /* number of conform entries written already */
- ulong bootcatptr;
- ulong bootcatblock;
- ulong bootimageptr;
- Direc *bootdirec;
- char *bootimage;
-
- Biobuf brd;
- Biobuf bwr;
- int flags;
- Voldesc iso;
- Voldesc joliet;
- };
- enum { /* Cdimg->flags, Cdinfo->flags */
- CDjoliet = 1<<0,
- CDplan9 = 1<<1,
- CDconform = 1<<2,
- CDrockridge = 1<<3,
- CDnew = 1<<4,
- CDdump = 1<<5,
- CDbootable = 1<<6,
- };
- typedef struct Tx Tx;
- struct Tx {
- char *bad; /* atoms */
- char *good;
- };
- struct Conform {
- Tx *t;
- int nt; /* delta = 32 */
- };
- struct Cdinfo {
- int flags;
- char *volumename;
- char *volumeset;
- char *publisher;
- char *preparer;
- char *application;
- char *bootimage;
- };
- enum {
- Blocklen = 2048,
- };
- /*
- * This is a doubly binary tree.
- * We have a tree keyed on the MD5 values
- * as well as a tree keyed on the block numbers.
- */
- typedef struct Dump Dump;
- typedef struct Dumpdir Dumpdir;
- struct Dump {
- Cdimg *cd;
- Dumpdir *md5root;
- Dumpdir *blockroot;
- };
- struct Dumpdir {
- char *name;
- uchar md5[MD5dlen];
- ulong block;
- ulong length;
- Dumpdir *md5left;
- Dumpdir *md5right;
- Dumpdir *blockleft;
- Dumpdir *blockright;
- };
- struct Dumproot {
- char *name;
- int nkid;
- Dumproot *kid;
- Direc root;
- Direc jroot;
- };
- /*
- * ISO9660 on-CD structures.
- */
- typedef struct Cdir Cdir;
- typedef struct Cpath Cpath;
- typedef struct Cvoldesc Cvoldesc;
- /* a volume descriptor block */
- struct Cvoldesc {
- uchar magic[8]; /* 0x01, "CD001", 0x01, 0x00 */
- uchar systemid[32]; /* system identifier */
- uchar volumeid[32]; /* volume identifier */
- uchar unused[8]; /* character set in secondary desc */
- uchar volsize[8]; /* volume size */
- uchar charset[32];
- uchar volsetsize[4]; /* volume set size = 1 */
- uchar volseqnum[4]; /* volume sequence number = 1 */
- uchar blocksize[4]; /* logical block size */
- uchar pathsize[8]; /* path table size */
- uchar lpathloc[4]; /* Lpath */
- uchar olpathloc[4]; /* optional Lpath */
- uchar mpathloc[4]; /* Mpath */
- uchar ompathloc[4]; /* optional Mpath */
- uchar rootdir[34]; /* directory entry for root */
- uchar volumeset[128]; /* volume set identifier */
- uchar publisher[128];
- uchar preparer[128]; /* data preparer identifier */
- uchar application[128]; /* application identifier */
- uchar notice[37]; /* copyright notice file */
- uchar abstract[37]; /* abstract file */
- uchar biblio[37]; /* bibliographic file */
- uchar cdate[17]; /* creation date */
- uchar mdate[17]; /* modification date */
- uchar xdate[17]; /* expiration date */
- uchar edate[17]; /* effective date */
- uchar fsvers; /* file system version = 1 */
- };
- /* a directory entry */
- struct Cdir {
- uchar len;
- uchar xlen;
- uchar dloc[8];
- uchar dlen[8];
- uchar date[7];
- uchar flags;
- uchar unitsize;
- uchar gapsize;
- uchar volseqnum[4];
- uchar namelen;
- uchar name[1]; /* chumminess */
- };
- /* a path table entry */
- struct Cpath {
- uchar namelen;
- uchar xlen;
- uchar dloc[4];
- uchar parent[2];
- uchar name[1]; /* chumminess */
- };
- enum { /* Rockridge flags */
- RR_PX = 1<<0,
- RR_PN = 1<<1,
- RR_SL = 1<<2,
- RR_NM = 1<<3,
- RR_CL = 1<<4,
- RR_PL = 1<<5,
- RR_RE = 1<<6,
- RR_TF = 1<<7,
- };
- enum { /* CputrripTF type argument */
- TFcreation = 1<<0,
- TFmodify = 1<<1,
- TFaccess = 1<<2,
- TFattributes = 1<<3,
- TFbackup = 1<<4,
- TFexpiration = 1<<5,
- TFeffective = 1<<6,
- TFlongform = 1<<7,
- };
- enum { /* CputrripNM flag types */
- NMcontinue = 1<<0,
- NMcurrent = 1<<1,
- NMparent = 1<<2,
- NMroot = 1<<3,
- NMvolroot = 1<<4,
- NMhost = 1<<5,
- };
- /* boot.c */
- void Cputbootvol(Cdimg*);
- void Cputbootcat(Cdimg*);
- void Cupdatebootvol(Cdimg*);
- void Cupdatebootcat(Cdimg*);
- void findbootimage(Cdimg*, Direc*);
- /* cdrdwr.c */
- Cdimg *createcd(char*, Cdinfo);
- Cdimg *opencd(char*, Cdinfo);
- void Creadblock(Cdimg*, void*, ulong, ulong);
- ulong big(void*, int);
- ulong little(void*, int);
- int parsedir(Cdimg*, Direc*, uchar*, int, char *(*)(uchar*, int));
- void setroot(Cdimg*, ulong, ulong, ulong);
- void setvolsize(Cdimg*, ulong, ulong);
- void setpathtable(Cdimg*, ulong, ulong, ulong, ulong);
- void Cputc(Cdimg*, int);
- void Cputnl(Cdimg*, ulong, int);
- void Cputnm(Cdimg*, ulong, int);
- void Cputn(Cdimg*, long, int);
- void Crepeat(Cdimg*, int, int);
- void Cputs(Cdimg*, char*, int);
- void Cwrite(Cdimg*, void*, int);
- void Cputr(Cdimg*, Rune);
- void Crepeatr(Cdimg*, Rune, int);
- void Cputrs(Cdimg*, Rune*, int);
- void Cputrscvt(Cdimg*, char*, int);
- void Cpadblock(Cdimg*);
- void Cputdate(Cdimg*, ulong);
- void Cputdate1(Cdimg*, ulong);
- void Cread(Cdimg*, void*, int);
- void Cwflush(Cdimg*);
- void Cwseek(Cdimg*, ulong);
- ulong Cwoffset(Cdimg*);
- ulong Croffset(Cdimg*);
- int Cgetc(Cdimg*);
- void Crseek(Cdimg*, ulong);
- char *Crdline(Cdimg*, int);
- int Clinelen(Cdimg*);
- /* conform.c */
- void rdconform(Cdimg*);
- char *conform(char*, int);
- void wrconform(Cdimg*, int, ulong*, ulong*);
- /* direc.c */
- void mkdirec(Direc*, XDir*);
- Direc *walkdirec(Direc*, char*);
- Direc *adddirec(Direc*, char*, XDir*);
- void copydirec(Direc*, Direc*);
- void checknames(Direc*, int (*)(char*));
- void convertnames(Direc*, char* (*)(char*, char*));
- void dsort(Direc*, int (*)(const void*, const void*));
- void setparents(Direc*);
- /* dump.c */
- ulong Cputdumpblock(Cdimg*);
- int hasdump(Cdimg*);
- Dump *dumpcd(Cdimg*, Direc*);
- Dumpdir *lookupmd5(Dump*, uchar*);
- void insertmd5(Dump*, char*, uchar*, ulong, ulong);
- Direc readdumpdirs(Cdimg*, XDir*, char*(*)(uchar*,int));
- char *adddumpdir(Direc*, ulong, XDir*);
- void copybutname(Direc*, Direc*);
- void readkids(Cdimg*, Direc*, char*(*)(uchar*,int));
- void freekids(Direc*);
- void readdumpconform(Cdimg*);
- void rmdumpdir(Direc*, char*);
- /* ichar.c */
- char *isostring(uchar*, int);
- int isbadiso9660(char*);
- int isocmp(const void*, const void*);
- int isisofrog(char);
- void Cputisopvd(Cdimg*, Cdinfo);
- /* jchar.c */
- char *jolietstring(uchar*, int);
- int isbadjoliet(char*);
- int jolietcmp(const void*, const void*);
- int isjolietfrog(Rune);
- void Cputjolietsvd(Cdimg*, Cdinfo);
- /* path.c */
- void writepathtables(Cdimg*);
- /* util.c */
- void *emalloc(ulong);
- void *erealloc(void*, ulong);
- char *atom(char*);
- char *struprcpy(char*, char*);
- int chat(char*, ...);
- /* unix.c, plan9.c */
- void dirtoxdir(XDir*, Dir*);
- void fdtruncate(int, ulong);
- long uidno(char*);
- long gidno(char*);
- /* rune.c */
- Rune *strtorune(Rune*, char*);
- Rune *runechr(Rune*, Rune);
- int runecmp(Rune*, Rune*);
- /* sysuse.c */
- int Cputsysuse(Cdimg*, Direc*, int, int, int);
- /* write.c */
- void writefiles(Dump*, Cdimg*, Direc*);
- void writedirs(Cdimg*, Direc*, int(*)(Cdimg*, Direc*, int, int, int));
- void writedumpdirs(Cdimg*, Direc*, int(*)(Cdimg*, Direc*, int, int, int));
- int Cputisodir(Cdimg*, Direc*, int, int, int);
- int Cputjolietdir(Cdimg*, Direc*, int, int, int);
- void Cputendvd(Cdimg*);
- enum {
- Blocksize = 2048,
- Ndirblock = 16, /* directory blocks allocated at once */
- DTdot = 0,
- DTdotdot,
- DTiden,
- DTroot,
- DTrootdot,
- };
- extern ulong now;
- extern Conform *map;
- extern int chatty;
- extern int docolon;
- extern int mk9660;
- extern int blocksize;
|