xref: /plan9/sys/src/cmd/dossrv/dat.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier typedef struct Dosboot		Dosboot;
27dd7cddfSDavid du Colombier typedef struct Dosboot32	Dosboot32;
33e12c5d1SDavid du Colombier typedef struct Dosbpb		Dosbpb;
43e12c5d1SDavid du Colombier typedef struct Dosdir		Dosdir;
53e12c5d1SDavid du Colombier typedef struct Dospart		Dospart;
63e12c5d1SDavid du Colombier typedef struct Dosptr		Dosptr;
77dd7cddfSDavid du Colombier typedef struct Fatinfo		Fatinfo;
83e12c5d1SDavid du Colombier typedef struct Xfs		Xfs;
93e12c5d1SDavid du Colombier typedef struct Xfile		Xfile;
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier struct Dospart{
123e12c5d1SDavid du Colombier 	uchar	active;
133e12c5d1SDavid du Colombier 	uchar	hstart;
143e12c5d1SDavid du Colombier 	uchar	cylstart[2];
153e12c5d1SDavid du Colombier 	uchar	type;
163e12c5d1SDavid du Colombier 	uchar	hend;
173e12c5d1SDavid du Colombier 	uchar	cylend[2];
183e12c5d1SDavid du Colombier 	uchar	start[4];
193e12c5d1SDavid du Colombier 	uchar	length[4];
203e12c5d1SDavid du Colombier };
213e12c5d1SDavid du Colombier 
227dd7cddfSDavid du Colombier enum
237dd7cddfSDavid du Colombier {
247dd7cddfSDavid du Colombier 	/*
257dd7cddfSDavid du Colombier 	 * dos partition types
267dd7cddfSDavid du Colombier 	 */
277dd7cddfSDavid du Colombier 	FAT12		= 0x01,
287dd7cddfSDavid du Colombier 	FAT16		= 0x04,		/* partitions smaller than 32MB */
297dd7cddfSDavid du Colombier 	FATHUGE		= 0x06,		/* fat16 partitions larger than 32MB */
307dd7cddfSDavid du Colombier 	FAT32		= 0x0b,
317dd7cddfSDavid du Colombier 	FAT32X		= 0x0c,
327dd7cddfSDavid du Colombier 	FATHUGEX	= 0x0e,
337dd7cddfSDavid du Colombier 	DMDDO		= 0x54,
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier 	FATRESRV	= 2,		/* number of reserved fat entries */
367dd7cddfSDavid du Colombier };
377dd7cddfSDavid du Colombier 
387dd7cddfSDavid du Colombier /*
397dd7cddfSDavid du Colombier  * dos boot sector, the start of every dos partition
407dd7cddfSDavid du Colombier  */
413e12c5d1SDavid du Colombier struct Dosboot{
423e12c5d1SDavid du Colombier 	uchar	magic[3];
433e12c5d1SDavid du Colombier 	uchar	version[8];
443e12c5d1SDavid du Colombier 	uchar	sectsize[2];
453e12c5d1SDavid du Colombier 	uchar	clustsize;
463e12c5d1SDavid du Colombier 	uchar	nresrv[2];
473e12c5d1SDavid du Colombier 	uchar	nfats;
483e12c5d1SDavid du Colombier 	uchar	rootsize[2];
493e12c5d1SDavid du Colombier 	uchar	volsize[2];
503e12c5d1SDavid du Colombier 	uchar	mediadesc;
513e12c5d1SDavid du Colombier 	uchar	fatsize[2];
523e12c5d1SDavid du Colombier 	uchar	trksize[2];
533e12c5d1SDavid du Colombier 	uchar	nheads[2];
543e12c5d1SDavid du Colombier 	uchar	nhidden[4];
557dd7cddfSDavid du Colombier 	uchar	bigvolsize[4];		/* same as Dosboot32 up to here */
563e12c5d1SDavid du Colombier 	uchar	driveno;
573e12c5d1SDavid du Colombier 	uchar	reserved0;
583e12c5d1SDavid du Colombier 	uchar	bootsig;
593e12c5d1SDavid du Colombier 	uchar	volid[4];
603e12c5d1SDavid du Colombier 	uchar	label[11];
613e12c5d1SDavid du Colombier 	uchar	reserved1[8];
623e12c5d1SDavid du Colombier };
633e12c5d1SDavid du Colombier 
647dd7cddfSDavid du Colombier /*
657dd7cddfSDavid du Colombier  * dos boot sector for FAT32
667dd7cddfSDavid du Colombier  */
677dd7cddfSDavid du Colombier enum
687dd7cddfSDavid du Colombier {
697dd7cddfSDavid du Colombier 	NOFATMIRROR	= 0x0080,	/* masks for extflags */
707dd7cddfSDavid du Colombier 	ACTFATMASK	= 0x000f,
717dd7cddfSDavid du Colombier };
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier struct Dosboot32{
747dd7cddfSDavid du Colombier 	uchar	magic[3];
757dd7cddfSDavid du Colombier 	uchar	version[8];
767dd7cddfSDavid du Colombier 	uchar	sectsize[2];
777dd7cddfSDavid du Colombier 	uchar	clustsize;
787dd7cddfSDavid du Colombier 	uchar	nresrv[2];
797dd7cddfSDavid du Colombier 	uchar	nfats;
807dd7cddfSDavid du Colombier 	uchar	rootsize[2];
817dd7cddfSDavid du Colombier 	uchar	volsize[2];
827dd7cddfSDavid du Colombier 	uchar	mediadesc;
837dd7cddfSDavid du Colombier 	uchar	fatsize[2];
847dd7cddfSDavid du Colombier 	uchar	trksize[2];
857dd7cddfSDavid du Colombier 	uchar	nheads[2];
867dd7cddfSDavid du Colombier 	uchar	nhidden[4];
877dd7cddfSDavid du Colombier 	uchar	bigvolsize[4];		/* same as Dosboot up to here */
887dd7cddfSDavid du Colombier 	uchar	fatsize32[4];		/* sectors per fat */
897dd7cddfSDavid du Colombier 	uchar	extflags[2];		/* active fat flags */
907dd7cddfSDavid du Colombier 	uchar	version1[2];		/* fat32 version; major & minor bytes */
917dd7cddfSDavid du Colombier 	uchar	rootstart[4];		/* starting cluster of root dir */
927dd7cddfSDavid du Colombier 	uchar	infospec[2];		/* fat allocation info sector */
937dd7cddfSDavid du Colombier 	uchar	backupboot[2];		/* backup boot sector */
947dd7cddfSDavid du Colombier 	uchar	reserved[12];
957dd7cddfSDavid du Colombier };
967dd7cddfSDavid du Colombier 
977dd7cddfSDavid du Colombier /*
987dd7cddfSDavid du Colombier  * optional FAT32 info sector
997dd7cddfSDavid du Colombier  */
1007dd7cddfSDavid du Colombier enum
1017dd7cddfSDavid du Colombier {
1027dd7cddfSDavid du Colombier 	FATINFOSIG1	= 0x41615252UL,
1037dd7cddfSDavid du Colombier 	FATINFOSIG	= 0x61417272UL,
1047dd7cddfSDavid du Colombier };
1057dd7cddfSDavid du Colombier 
1067dd7cddfSDavid du Colombier struct Fatinfo
1077dd7cddfSDavid du Colombier {
1087dd7cddfSDavid du Colombier 	uchar	sig1[4];
1097dd7cddfSDavid du Colombier 	uchar	pad[480];
1107dd7cddfSDavid du Colombier 	uchar	sig[4];
1117dd7cddfSDavid du Colombier 	uchar	freeclust[4];	/* num frre clusters; -1 is unknown */
1127dd7cddfSDavid du Colombier 	uchar	nextfree[4];	/* most recently allocated cluster */
1137dd7cddfSDavid du Colombier 	uchar	resrv[4*3];
1147dd7cddfSDavid du Colombier };
1157dd7cddfSDavid du Colombier 
1167dd7cddfSDavid du Colombier /*
1177dd7cddfSDavid du Colombier  * BIOS paramater block
1187dd7cddfSDavid du Colombier  */
1193e12c5d1SDavid du Colombier struct Dosbpb{
1207dd7cddfSDavid du Colombier 	MLock;				/* access to fat */
1213e12c5d1SDavid du Colombier 	int	sectsize;		/* in bytes */
1223e12c5d1SDavid du Colombier 	int	clustsize;		/* in sectors */
1233e12c5d1SDavid du Colombier 	int	nresrv;			/* sectors */
1247dd7cddfSDavid du Colombier 	int	nfats;			/* usually 2; modified to 1 if fat mirroring disabled */
1257dd7cddfSDavid du Colombier 	int	rootsize;		/* number of entries, for fat12 and fat16 */
1267dd7cddfSDavid du Colombier 	long	volsize;		/* in sectors */
1273e12c5d1SDavid du Colombier 	int	mediadesc;
1287dd7cddfSDavid du Colombier 	long	fatsize;		/* in sectors */
1293e12c5d1SDavid du Colombier 	int	fatclusters;
1307dd7cddfSDavid du Colombier 	int	fatbits;		/* 12, 16, or 32 */
1317dd7cddfSDavid du Colombier 	long	fataddr;		/* sector number of first valid fat entry */
1327dd7cddfSDavid du Colombier 	long	rootaddr;		/* for fat16 or fat12, sector of root dir */
1337dd7cddfSDavid du Colombier 	long	rootstart;		/* for fat32, cluster of root dir */
1347dd7cddfSDavid du Colombier 	long	dataaddr;		/* initial sector of data clusters */
1353e12c5d1SDavid du Colombier 	long	freeptr;		/* next free cluster candidate */
1367dd7cddfSDavid du Colombier 	long	freeclusters;		/* count of free clusters, for fat32 */
1377dd7cddfSDavid du Colombier 	int	fatinfo;		/* fat info sector location; 0 => none */
1387dd7cddfSDavid du Colombier };
1397dd7cddfSDavid du Colombier 
1407dd7cddfSDavid du Colombier enum
1417dd7cddfSDavid du Colombier {
1427dd7cddfSDavid du Colombier 	DOSDIRSIZE	= 32,
1437dd7cddfSDavid du Colombier 	DOSEMPTY	= 0xe5,			/* first char in name if entry is unused */
1447dd7cddfSDavid du Colombier 	DOSRUNE		= 13,			/* runes per dosdir in a long file name */
1457dd7cddfSDavid du Colombier 	DOSNAMELEN	= 261			/* max dos file name length */
1463e12c5d1SDavid du Colombier };
1473e12c5d1SDavid du Colombier 
1483e12c5d1SDavid du Colombier struct Dosdir{
1493e12c5d1SDavid du Colombier 	uchar	name[8];
1503e12c5d1SDavid du Colombier 	uchar	ext[3];
1513e12c5d1SDavid du Colombier 	uchar	attr;
1527dd7cddfSDavid du Colombier 	uchar	reserved[1];
1537dd7cddfSDavid du Colombier 	uchar	ctime[3];		/* creation time */
1547dd7cddfSDavid du Colombier 	uchar	cdate[2];		/* creation date */
1557dd7cddfSDavid du Colombier 	uchar	adate[2];		/* last access date */
1567dd7cddfSDavid du Colombier 	uchar	hstart[2];		/* high bits of start for fat32 */
1577dd7cddfSDavid du Colombier 	uchar	time[2];		/* last modified time */
1587dd7cddfSDavid du Colombier 	uchar	date[2];		/* last modified date */
1593e12c5d1SDavid du Colombier 	uchar	start[2];
1603e12c5d1SDavid du Colombier 	uchar	length[4];
1613e12c5d1SDavid du Colombier };
1623e12c5d1SDavid du Colombier 
1637dd7cddfSDavid du Colombier enum
1647dd7cddfSDavid du Colombier {
1657dd7cddfSDavid du Colombier 	DRONLY		= 0x01,
1667dd7cddfSDavid du Colombier 	DHIDDEN		= 0x02,
1677dd7cddfSDavid du Colombier 	DSYSTEM		= 0x04,
1687dd7cddfSDavid du Colombier 	DVLABEL		= 0x08,
1697dd7cddfSDavid du Colombier 	DDIR		= 0x10,
1707dd7cddfSDavid du Colombier 	DARCH		= 0x20,
1717dd7cddfSDavid du Colombier };
1723e12c5d1SDavid du Colombier 
173*9a747e4fSDavid du Colombier #define	GSHORT(p)	(((p)[0])|(p)[1]<<8)
174*9a747e4fSDavid du Colombier #define	GLONG(p)	(((long)(p)[0])|(p)[1]<<8|(p)[2]<<16|(p)[3]<<24)
175*9a747e4fSDavid du Colombier #define PSHORT(p,v)	((p)[0]=(v),(p)[1]=(v)>>8)
176*9a747e4fSDavid du Colombier #define PLONG(p,v)	((p)[0]=(v),(p)[1]=(v)>>8,(p)[2]=(v)>>16,(p)[3]=(v)>>24)
1773e12c5d1SDavid du Colombier 
1783e12c5d1SDavid du Colombier struct Dosptr{
1797dd7cddfSDavid du Colombier 	ulong	addr;		/* sector & entry within of file's directory entry */
1803e12c5d1SDavid du Colombier 	ulong	offset;
1813e12c5d1SDavid du Colombier 	ulong	paddr;		/* of parent's directory entry */
1823e12c5d1SDavid du Colombier 	ulong	poffset;
1833e12c5d1SDavid du Colombier 	ulong	iclust;		/* ordinal within file */
1843e12c5d1SDavid du Colombier 	ulong	clust;
1857dd7cddfSDavid du Colombier 	ulong	naddr;		/* next block in directory (for writing multi entry elements) */
1867dd7cddfSDavid du Colombier 	ulong	prevaddr;
1873e12c5d1SDavid du Colombier 	Iosect *p;
1883e12c5d1SDavid du Colombier 	Dosdir *d;
1893e12c5d1SDavid du Colombier };
1903e12c5d1SDavid du Colombier 
1917dd7cddfSDavid du Colombier #define	QIDPATH(p)	((p)->addr*(Sectorsize/DOSDIRSIZE) + \
1927dd7cddfSDavid du Colombier 			 (p)->offset/DOSDIRSIZE)
1937dd7cddfSDavid du Colombier 
1943e12c5d1SDavid du Colombier struct Xfs{
1953e12c5d1SDavid du Colombier 	Xfs	*next;
196*9a747e4fSDavid du Colombier 	int omode;		/* of file containing external fs */
1973e12c5d1SDavid du Colombier 	char	*name;		/* of file containing external f.s. */
1983e12c5d1SDavid du Colombier 	Qid	qid;		/* of file containing external f.s. */
1993e12c5d1SDavid du Colombier 	long	ref;		/* attach count */
2003e12c5d1SDavid du Colombier 	Qid	rootqid;	/* of plan9 constructed root directory */
2017dd7cddfSDavid du Colombier 	uchar	isfat32;	/* is a fat 32 file system? */
2023e12c5d1SDavid du Colombier 	short	dev;
2033e12c5d1SDavid du Colombier 	short	fmt;
2043e12c5d1SDavid du Colombier 	long	offset;
2053e12c5d1SDavid du Colombier 	void	*ptr;
2063e12c5d1SDavid du Colombier };
2073e12c5d1SDavid du Colombier 
2083e12c5d1SDavid du Colombier struct Xfile{
2093e12c5d1SDavid du Colombier 	Xfile	*next;		/* in hash bucket */
2103e12c5d1SDavid du Colombier 	long	fid;
2113e12c5d1SDavid du Colombier 	ulong	flags;
2123e12c5d1SDavid du Colombier 	Qid	qid;
2133e12c5d1SDavid du Colombier 	Xfs	*xf;
214*9a747e4fSDavid du Colombier 	Dosptr	*ptr;
2153e12c5d1SDavid du Colombier };
2163e12c5d1SDavid du Colombier 
2173e12c5d1SDavid du Colombier enum{
2183e12c5d1SDavid du Colombier 	Asis, Clean, Clunk
2193e12c5d1SDavid du Colombier };
2203e12c5d1SDavid du Colombier 
221*9a747e4fSDavid du Colombier enum{
222*9a747e4fSDavid du Colombier 	Invalid, Short, ShortLower, Long
223*9a747e4fSDavid du Colombier };
224*9a747e4fSDavid du Colombier 
2257dd7cddfSDavid du Colombier enum{	/* Xfile flags */
2267dd7cddfSDavid du Colombier 	Oread = 1,
2277dd7cddfSDavid du Colombier 	Owrite = 2,
2287dd7cddfSDavid du Colombier 	Orclose = 4,
2293e12c5d1SDavid du Colombier 	Omodes = 3,
2303e12c5d1SDavid du Colombier };
2313e12c5d1SDavid du Colombier 
2323e12c5d1SDavid du Colombier enum{
2333e12c5d1SDavid du Colombier 	Enevermind,
2343e12c5d1SDavid du Colombier 	Eformat,
2353e12c5d1SDavid du Colombier 	Eio,
236*9a747e4fSDavid du Colombier 	Enoauth,
2373e12c5d1SDavid du Colombier 	Enomem,
2383e12c5d1SDavid du Colombier 	Enonexist,
2393e12c5d1SDavid du Colombier 	Eperm,
2403e12c5d1SDavid du Colombier 	Enofilsys,
2413e12c5d1SDavid du Colombier 	Eauth,
2427dd7cddfSDavid du Colombier 	Econtig,
243*9a747e4fSDavid du Colombier 	Ebadfcall,
244*9a747e4fSDavid du Colombier 	Ebadstat,
245*9a747e4fSDavid du Colombier 	Eversion,
246*9a747e4fSDavid du Colombier 	Etoolong,
247*9a747e4fSDavid du Colombier 	Eerrstr,
2487dd7cddfSDavid du Colombier 	ESIZE
2493e12c5d1SDavid du Colombier };
2503e12c5d1SDavid du Colombier 
2513e12c5d1SDavid du Colombier extern int	chatty;
2523e12c5d1SDavid du Colombier extern int	errno;
2537dd7cddfSDavid du Colombier extern int	readonly;
2543e12c5d1SDavid du Colombier extern char	*deffile;
255*9a747e4fSDavid du Colombier extern int trspaces;