1*25210b06SDavid du Colombier typedef struct Dosboot Dosboot; 2*25210b06SDavid du Colombier typedef struct Dos Dos; 3*25210b06SDavid du Colombier typedef struct Dosdir Dosdir; 4*25210b06SDavid du Colombier typedef struct Dosfile Dosfile; 5*25210b06SDavid du Colombier typedef struct Dospart Dospart; 6*25210b06SDavid du Colombier typedef struct File File; 7*25210b06SDavid du Colombier typedef struct Bootfs Bootfs; 8*25210b06SDavid du Colombier 9*25210b06SDavid du Colombier int fsread(File *file, void *a, long n); 10*25210b06SDavid du Colombier int fsboot(Bootfs *fs, char *path, Boot *b); 11*25210b06SDavid du Colombier int fswalk(Bootfs *fs, char *path, File *f); 12*25210b06SDavid du Colombier 13*25210b06SDavid du Colombier struct Dospart 14*25210b06SDavid du Colombier { 15*25210b06SDavid du Colombier uchar flag; /* active flag */ 16*25210b06SDavid du Colombier uchar shead; /* starting head */ 17*25210b06SDavid du Colombier uchar scs[2]; /* starting cylinder/sector */ 18*25210b06SDavid du Colombier uchar type; /* partition type */ 19*25210b06SDavid du Colombier uchar ehead; /* ending head */ 20*25210b06SDavid du Colombier uchar ecs[2]; /* ending cylinder/sector */ 21*25210b06SDavid du Colombier uchar start[4]; /* starting sector */ 22*25210b06SDavid du Colombier uchar len[4]; /* length in sectors */ 23*25210b06SDavid du Colombier }; 24*25210b06SDavid du Colombier 25*25210b06SDavid du Colombier #define FAT12 0x01 26*25210b06SDavid du Colombier #define FAT16 0x04 27*25210b06SDavid du Colombier #define EXTEND 0x05 28*25210b06SDavid du Colombier #define FATHUGE 0x06 29*25210b06SDavid du Colombier #define FAT32 0x0b 30*25210b06SDavid du Colombier #define FAT32X 0x0c 31*25210b06SDavid du Colombier #define EXTHUGE 0x0f 32*25210b06SDavid du Colombier #define DMDDO 0x54 33*25210b06SDavid du Colombier #define PLAN9 0x39 34*25210b06SDavid du Colombier #define LEXTEND 0x85 35*25210b06SDavid du Colombier 36*25210b06SDavid du Colombier struct Dosfile{ 37*25210b06SDavid du Colombier Dos *dos; /* owning dos file system */ 38*25210b06SDavid du Colombier char name[8]; 39*25210b06SDavid du Colombier char ext[3]; 40*25210b06SDavid du Colombier uchar attr; 41*25210b06SDavid du Colombier long length; 42*25210b06SDavid du Colombier long pstart; /* physical start cluster address */ 43*25210b06SDavid du Colombier long pcurrent; /* physical current cluster address */ 44*25210b06SDavid du Colombier long lcurrent; /* logical current cluster address */ 45*25210b06SDavid du Colombier long offset; 46*25210b06SDavid du Colombier }; 47*25210b06SDavid du Colombier 48*25210b06SDavid du Colombier struct Dos{ 49*25210b06SDavid du Colombier long start; /* start of file system */ 50*25210b06SDavid du Colombier int sectsize; /* in bytes */ 51*25210b06SDavid du Colombier int clustsize; /* in sectors */ 52*25210b06SDavid du Colombier int clustbytes; /* in bytes */ 53*25210b06SDavid du Colombier int nresrv; /* sectors */ 54*25210b06SDavid du Colombier int nfats; /* usually 2 */ 55*25210b06SDavid du Colombier int rootsize; /* number of entries */ 56*25210b06SDavid du Colombier int volsize; /* in sectors */ 57*25210b06SDavid du Colombier int mediadesc; 58*25210b06SDavid du Colombier int fatsize; /* in sectors */ 59*25210b06SDavid du Colombier int fatclusters; 60*25210b06SDavid du Colombier int fatbits; /* 12 or 16 */ 61*25210b06SDavid du Colombier long fataddr; /* sector number */ 62*25210b06SDavid du Colombier long rootaddr; 63*25210b06SDavid du Colombier long rootclust; 64*25210b06SDavid du Colombier long dataaddr; 65*25210b06SDavid du Colombier long freeptr; 66*25210b06SDavid du Colombier }; 67*25210b06SDavid du Colombier 68*25210b06SDavid du Colombier typedef struct Dosboot Dosboot; 69*25210b06SDavid du Colombier typedef struct Dosdir Dosdir; 70*25210b06SDavid du Colombier 71*25210b06SDavid du Colombier struct Dosboot{ 72*25210b06SDavid du Colombier uchar magic[3]; 73*25210b06SDavid du Colombier uchar version[8]; 74*25210b06SDavid du Colombier uchar sectsize[2]; 75*25210b06SDavid du Colombier uchar clustsize; 76*25210b06SDavid du Colombier uchar nresrv[2]; 77*25210b06SDavid du Colombier uchar nfats; 78*25210b06SDavid du Colombier uchar rootsize[2]; 79*25210b06SDavid du Colombier uchar volsize[2]; 80*25210b06SDavid du Colombier uchar mediadesc; 81*25210b06SDavid du Colombier uchar fatsize[2]; 82*25210b06SDavid du Colombier uchar trksize[2]; 83*25210b06SDavid du Colombier uchar nheads[2]; 84*25210b06SDavid du Colombier uchar nhidden[4]; 85*25210b06SDavid du Colombier uchar bigvolsize[4]; 86*25210b06SDavid du Colombier /* fat 32 */ 87*25210b06SDavid du Colombier uchar bigfatsize[4]; 88*25210b06SDavid du Colombier uchar extflags[2]; 89*25210b06SDavid du Colombier uchar fsversion[2]; 90*25210b06SDavid du Colombier uchar rootdirstartclust[4]; 91*25210b06SDavid du Colombier uchar fsinfosect[2]; 92*25210b06SDavid du Colombier uchar backupbootsect[2]; 93*25210b06SDavid du Colombier /* ??? 94*25210b06SDavid du Colombier uchar driveno; 95*25210b06SDavid du Colombier uchar reserved0; 96*25210b06SDavid du Colombier uchar bootsig; 97*25210b06SDavid du Colombier uchar volid[4]; 98*25210b06SDavid du Colombier uchar label[11]; 99*25210b06SDavid du Colombier uchar reserved1[8]; 100*25210b06SDavid du Colombier */ 101*25210b06SDavid du Colombier }; 102*25210b06SDavid du Colombier 103*25210b06SDavid du Colombier struct Dosdir{ 104*25210b06SDavid du Colombier uchar name[8]; 105*25210b06SDavid du Colombier uchar ext[3]; 106*25210b06SDavid du Colombier uchar attr; 107*25210b06SDavid du Colombier uchar lowercase; 108*25210b06SDavid du Colombier uchar hundredth; 109*25210b06SDavid du Colombier uchar ctime[2]; 110*25210b06SDavid du Colombier uchar cdate[2]; 111*25210b06SDavid du Colombier uchar adate[2]; 112*25210b06SDavid du Colombier uchar highstart[2]; 113*25210b06SDavid du Colombier uchar mtime[2]; 114*25210b06SDavid du Colombier uchar mdate[2]; 115*25210b06SDavid du Colombier uchar start[2]; 116*25210b06SDavid du Colombier uchar length[4]; 117*25210b06SDavid du Colombier }; 118*25210b06SDavid du Colombier 119*25210b06SDavid du Colombier #define DOSRONLY 0x01 120*25210b06SDavid du Colombier #define DOSHIDDEN 0x02 121*25210b06SDavid du Colombier #define DOSSYSTEM 0x04 122*25210b06SDavid du Colombier #define DOSVLABEL 0x08 123*25210b06SDavid du Colombier #define DOSDIR 0x10 124*25210b06SDavid du Colombier #define DOSARCH 0x20 125*25210b06SDavid du Colombier 126*25210b06SDavid du Colombier // #pragma incomplete Bootfs 127*25210b06SDavid du Colombier 128*25210b06SDavid du Colombier struct File{ 129*25210b06SDavid du Colombier union{ 130*25210b06SDavid du Colombier Dosfile dos; 131*25210b06SDavid du Colombier int walked; 132*25210b06SDavid du Colombier }; 133*25210b06SDavid du Colombier Bootfs *fs; 134*25210b06SDavid du Colombier char *path; 135*25210b06SDavid du Colombier }; 136*25210b06SDavid du Colombier 137*25210b06SDavid du Colombier struct Bootfs{ 138*25210b06SDavid du Colombier union { 139*25210b06SDavid du Colombier Dos dos; 140*25210b06SDavid du Colombier }; 141*25210b06SDavid du Colombier Chan *devch; 142*25210b06SDavid du Colombier char *disk; 143*25210b06SDavid du Colombier 144*25210b06SDavid du Colombier /* for *bios.c */ 145*25210b06SDavid du Colombier int dev; /* device id */ 146*25210b06SDavid du Colombier long (*diskread)(Bootfs*, void*, long); /* disk read routine */ 147*25210b06SDavid du Colombier vlong (*diskseek)(Bootfs*, vlong); /* disk seek routine */ 148*25210b06SDavid du Colombier 149*25210b06SDavid du Colombier long (*read)(File*, void*, long); 150*25210b06SDavid du Colombier int (*walk)(File*, char*); 151*25210b06SDavid du Colombier File root; 152*25210b06SDavid du Colombier }; 153*25210b06SDavid du Colombier 154*25210b06SDavid du Colombier extern int dosinit(Bootfs*, char *); 155*25210b06SDavid du Colombier 156*25210b06SDavid du Colombier #define BADPTR(x) ((ulong)(x) < 0x80000000) 157