⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iso9660.h

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 H
字号:
/* * 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#endifstruct 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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -