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;