1*74a4d8c2SCharles.Forsyth typedef struct Dosboot Dosboot; 2*74a4d8c2SCharles.Forsyth typedef struct Dos Dos; 3*74a4d8c2SCharles.Forsyth typedef struct Dosdir Dosdir; 4*74a4d8c2SCharles.Forsyth typedef struct Dosfile Dosfile; 5*74a4d8c2SCharles.Forsyth typedef struct Dospart Dospart; 6*74a4d8c2SCharles.Forsyth 7*74a4d8c2SCharles.Forsyth struct Dospart 8*74a4d8c2SCharles.Forsyth { 9*74a4d8c2SCharles.Forsyth uchar flag; /* active flag */ 10*74a4d8c2SCharles.Forsyth uchar shead; /* starting head */ 11*74a4d8c2SCharles.Forsyth uchar scs[2]; /* starting cylinder/sector */ 12*74a4d8c2SCharles.Forsyth uchar type; /* partition type */ 13*74a4d8c2SCharles.Forsyth uchar ehead; /* ending head */ 14*74a4d8c2SCharles.Forsyth uchar ecs[2]; /* ending cylinder/sector */ 15*74a4d8c2SCharles.Forsyth uchar start[4]; /* starting sector */ 16*74a4d8c2SCharles.Forsyth uchar len[4]; /* length in sectors */ 17*74a4d8c2SCharles.Forsyth }; 18*74a4d8c2SCharles.Forsyth 19*74a4d8c2SCharles.Forsyth #define FAT12 0x01 20*74a4d8c2SCharles.Forsyth #define FAT16 0x04 21*74a4d8c2SCharles.Forsyth #define FATHUGE 0x06 22*74a4d8c2SCharles.Forsyth #define DMDDO 0x54 23*74a4d8c2SCharles.Forsyth 24*74a4d8c2SCharles.Forsyth struct Dosboot{ 25*74a4d8c2SCharles.Forsyth uchar magic[3]; 26*74a4d8c2SCharles.Forsyth uchar version[8]; 27*74a4d8c2SCharles.Forsyth uchar sectsize[2]; 28*74a4d8c2SCharles.Forsyth uchar clustsize; 29*74a4d8c2SCharles.Forsyth uchar nresrv[2]; 30*74a4d8c2SCharles.Forsyth uchar nfats; 31*74a4d8c2SCharles.Forsyth uchar rootsize[2]; 32*74a4d8c2SCharles.Forsyth uchar volsize[2]; 33*74a4d8c2SCharles.Forsyth uchar mediadesc; 34*74a4d8c2SCharles.Forsyth uchar fatsize[2]; 35*74a4d8c2SCharles.Forsyth uchar trksize[2]; 36*74a4d8c2SCharles.Forsyth uchar nheads[2]; 37*74a4d8c2SCharles.Forsyth uchar nhidden[4]; 38*74a4d8c2SCharles.Forsyth uchar bigvolsize[4]; 39*74a4d8c2SCharles.Forsyth uchar driveno; 40*74a4d8c2SCharles.Forsyth uchar reserved0; 41*74a4d8c2SCharles.Forsyth uchar bootsig; 42*74a4d8c2SCharles.Forsyth uchar volid[4]; 43*74a4d8c2SCharles.Forsyth uchar label[11]; 44*74a4d8c2SCharles.Forsyth uchar reserved1[8]; 45*74a4d8c2SCharles.Forsyth }; 46*74a4d8c2SCharles.Forsyth 47*74a4d8c2SCharles.Forsyth struct Dosfile{ 48*74a4d8c2SCharles.Forsyth Dos *dos; /* owning dos file system */ 49*74a4d8c2SCharles.Forsyth char name[8]; 50*74a4d8c2SCharles.Forsyth char ext[3]; 51*74a4d8c2SCharles.Forsyth uchar attr; 52*74a4d8c2SCharles.Forsyth long length; 53*74a4d8c2SCharles.Forsyth long pstart; /* physical start cluster address */ 54*74a4d8c2SCharles.Forsyth long pcurrent; /* physical current cluster address */ 55*74a4d8c2SCharles.Forsyth long lcurrent; /* logical current cluster address */ 56*74a4d8c2SCharles.Forsyth long offset; 57*74a4d8c2SCharles.Forsyth }; 58*74a4d8c2SCharles.Forsyth 59*74a4d8c2SCharles.Forsyth struct Dos{ 60*74a4d8c2SCharles.Forsyth int dev; /* device id */ 61*74a4d8c2SCharles.Forsyth long (*read)(int, void*, long); /* read routine */ 62*74a4d8c2SCharles.Forsyth long (*seek)(int, long); /* seek routine */ 63*74a4d8c2SCharles.Forsyth 64*74a4d8c2SCharles.Forsyth int start; /* start of file system */ 65*74a4d8c2SCharles.Forsyth int sectsize; /* in bytes */ 66*74a4d8c2SCharles.Forsyth int clustsize; /* in sectors */ 67*74a4d8c2SCharles.Forsyth int clustbytes; /* in bytes */ 68*74a4d8c2SCharles.Forsyth int nresrv; /* sectors */ 69*74a4d8c2SCharles.Forsyth int nfats; /* usually 2 */ 70*74a4d8c2SCharles.Forsyth int rootsize; /* number of entries */ 71*74a4d8c2SCharles.Forsyth int volsize; /* in sectors */ 72*74a4d8c2SCharles.Forsyth int mediadesc; 73*74a4d8c2SCharles.Forsyth int fatsize; /* in sectors */ 74*74a4d8c2SCharles.Forsyth int fatclusters; 75*74a4d8c2SCharles.Forsyth int fatbits; /* 12 or 16 */ 76*74a4d8c2SCharles.Forsyth long fataddr; /* sector number */ 77*74a4d8c2SCharles.Forsyth long rootaddr; 78*74a4d8c2SCharles.Forsyth long dataaddr; 79*74a4d8c2SCharles.Forsyth long freeptr; 80*74a4d8c2SCharles.Forsyth 81*74a4d8c2SCharles.Forsyth Dosfile root; 82*74a4d8c2SCharles.Forsyth }; 83*74a4d8c2SCharles.Forsyth 84*74a4d8c2SCharles.Forsyth struct Dosdir{ 85*74a4d8c2SCharles.Forsyth uchar name[8]; 86*74a4d8c2SCharles.Forsyth uchar ext[3]; 87*74a4d8c2SCharles.Forsyth uchar attr; 88*74a4d8c2SCharles.Forsyth uchar reserved[10]; 89*74a4d8c2SCharles.Forsyth uchar time[2]; 90*74a4d8c2SCharles.Forsyth uchar date[2]; 91*74a4d8c2SCharles.Forsyth uchar start[2]; 92*74a4d8c2SCharles.Forsyth uchar length[4]; 93*74a4d8c2SCharles.Forsyth }; 94*74a4d8c2SCharles.Forsyth 95*74a4d8c2SCharles.Forsyth #define DRONLY 0x01 96*74a4d8c2SCharles.Forsyth #define DHIDDEN 0x02 97*74a4d8c2SCharles.Forsyth #define DSYSTEM 0x04 98*74a4d8c2SCharles.Forsyth #define DVLABEL 0x08 99*74a4d8c2SCharles.Forsyth #define DDIR 0x10 100*74a4d8c2SCharles.Forsyth #define DARCH 0x20 101*74a4d8c2SCharles.Forsyth 102*74a4d8c2SCharles.Forsyth extern int chatty; 103*74a4d8c2SCharles.Forsyth 104*74a4d8c2SCharles.Forsyth extern int dosboot(Dos*, char*); 105*74a4d8c2SCharles.Forsyth extern int dosinit(Dos*, int, int); 106*74a4d8c2SCharles.Forsyth extern long dosread(Dosfile*, void*, long); 107*74a4d8c2SCharles.Forsyth extern int dosstat(Dos*, char*, Dosfile*); 108*74a4d8c2SCharles.Forsyth extern int doswalk(Dosfile*, char*); 109*74a4d8c2SCharles.Forsyth 110*74a4d8c2SCharles.Forsyth extern int plan9ini(Dos*, char*); 111