1 typedef struct Dosboot Dosboot; 2 typedef struct Dosboot32 Dosboot32; 3 typedef struct Dosbpb Dosbpb; 4 typedef struct Dosdir Dosdir; 5 typedef struct Dospart Dospart; 6 typedef struct Dosptr Dosptr; 7 typedef struct Fatinfo Fatinfo; 8 typedef struct Xfs Xfs; 9 typedef struct Xfile Xfile; 10 11 struct Dospart{ 12 uchar active; 13 uchar hstart; 14 uchar cylstart[2]; 15 uchar type; 16 uchar hend; 17 uchar cylend[2]; 18 uchar start[4]; 19 uchar length[4]; 20 }; 21 22 enum 23 { 24 /* 25 * dos partition types 26 */ 27 FAT12 = 0x01, 28 FAT16 = 0x04, /* partitions smaller than 32MB */ 29 FATHUGE = 0x06, /* fat16 partitions larger than 32MB */ 30 FAT32 = 0x0b, 31 FAT32X = 0x0c, 32 FATHUGEX = 0x0e, 33 DMDDO = 0x54, 34 35 FATRESRV = 2, /* number of reserved fat entries */ 36 }; 37 38 /* 39 * dos boot sector, the start of every dos partition 40 */ 41 struct Dosboot{ 42 uchar magic[3]; 43 uchar version[8]; 44 uchar sectsize[2]; 45 uchar clustsize; 46 uchar nresrv[2]; 47 uchar nfats; 48 uchar rootsize[2]; 49 uchar volsize[2]; 50 uchar mediadesc; 51 uchar fatsize[2]; 52 uchar trksize[2]; 53 uchar nheads[2]; 54 uchar nhidden[4]; 55 uchar bigvolsize[4]; /* same as Dosboot32 up to here */ 56 uchar driveno; 57 uchar reserved0; 58 uchar bootsig; 59 uchar volid[4]; 60 uchar label[11]; 61 uchar reserved1[8]; 62 }; 63 64 /* 65 * dos boot sector for FAT32 66 */ 67 enum 68 { 69 NOFATMIRROR = 0x0080, /* masks for extflags */ 70 ACTFATMASK = 0x000f, 71 }; 72 73 struct Dosboot32{ 74 uchar magic[3]; 75 uchar version[8]; 76 uchar sectsize[2]; 77 uchar clustsize; 78 uchar nresrv[2]; 79 uchar nfats; 80 uchar rootsize[2]; 81 uchar volsize[2]; 82 uchar mediadesc; 83 uchar fatsize[2]; 84 uchar trksize[2]; 85 uchar nheads[2]; 86 uchar nhidden[4]; 87 uchar bigvolsize[4]; /* same as Dosboot up to here */ 88 uchar fatsize32[4]; /* sectors per fat */ 89 uchar extflags[2]; /* active fat flags */ 90 uchar version1[2]; /* fat32 version; major & minor bytes */ 91 uchar rootstart[4]; /* starting cluster of root dir */ 92 uchar infospec[2]; /* fat allocation info sector */ 93 uchar backupboot[2]; /* backup boot sector */ 94 uchar reserved[12]; 95 }; 96 97 /* 98 * optional FAT32 info sector 99 */ 100 enum 101 { 102 FATINFOSIG1 = 0x41615252UL, 103 FATINFOSIG = 0x61417272UL, 104 }; 105 106 struct Fatinfo 107 { 108 uchar sig1[4]; 109 uchar pad[480]; 110 uchar sig[4]; 111 uchar freeclust[4]; /* num frre clusters; -1 is unknown */ 112 uchar nextfree[4]; /* most recently allocated cluster */ 113 uchar resrv[4*3]; 114 }; 115 116 /* 117 * BIOS paramater block 118 */ 119 struct Dosbpb{ 120 MLock; /* access to fat */ 121 int sectsize; /* in bytes */ 122 int clustsize; /* in sectors */ 123 int nresrv; /* sectors */ 124 int nfats; /* usually 2; modified to 1 if fat mirroring disabled */ 125 int rootsize; /* number of entries, for fat12 and fat16 */ 126 long volsize; /* in sectors */ 127 int mediadesc; 128 long fatsize; /* in sectors */ 129 int fatclusters; 130 int fatbits; /* 12, 16, or 32 */ 131 long fataddr; /* sector number of first valid fat entry */ 132 long rootaddr; /* for fat16 or fat12, sector of root dir */ 133 long rootstart; /* for fat32, cluster of root dir */ 134 long dataaddr; /* initial sector of data clusters */ 135 long freeptr; /* next free cluster candidate */ 136 long freeclusters; /* count of free clusters, for fat32 */ 137 int fatinfo; /* fat info sector location; 0 => none */ 138 }; 139 140 enum 141 { 142 DOSDIRSIZE = 32, 143 DOSEMPTY = 0xe5, /* first char in name if entry is unused */ 144 DOSRUNE = 13, /* runes per dosdir in a long file name */ 145 DOSNAMELEN = 261 /* max dos file name length */ 146 }; 147 148 struct Dosdir{ 149 uchar name[8]; 150 uchar ext[3]; 151 uchar attr; 152 uchar reserved[1]; 153 uchar ctime[3]; /* creation time */ 154 uchar cdate[2]; /* creation date */ 155 uchar adate[2]; /* last access date */ 156 uchar hstart[2]; /* high bits of start for fat32 */ 157 uchar time[2]; /* last modified time */ 158 uchar date[2]; /* last modified date */ 159 uchar start[2]; 160 uchar length[4]; 161 }; 162 163 enum 164 { 165 DRONLY = 0x01, 166 DHIDDEN = 0x02, 167 DSYSTEM = 0x04, 168 DVLABEL = 0x08, 169 DDIR = 0x10, 170 DARCH = 0x20, 171 }; 172 173 #define GSHORT(p) (((p)[0])|(p)[1]<<8) 174 #define GLONG(p) (((long)(p)[0])|(p)[1]<<8|(p)[2]<<16|(p)[3]<<24) 175 #define PSHORT(p,v) ((p)[0]=(v),(p)[1]=(v)>>8) 176 #define PLONG(p,v) ((p)[0]=(v),(p)[1]=(v)>>8,(p)[2]=(v)>>16,(p)[3]=(v)>>24) 177 178 struct Dosptr{ 179 ulong addr; /* sector & entry within of file's directory entry */ 180 ulong offset; 181 ulong paddr; /* of parent's directory entry */ 182 ulong poffset; 183 ulong iclust; /* ordinal within file */ 184 ulong clust; 185 ulong naddr; /* next block in directory (for writing multi entry elements) */ 186 ulong prevaddr; 187 Iosect *p; 188 Dosdir *d; 189 }; 190 191 #define QIDPATH(p) ((p)->addr*(Sectorsize/DOSDIRSIZE) + \ 192 (p)->offset/DOSDIRSIZE) 193 194 struct Xfs{ 195 Xfs *next; 196 int omode; /* of file containing external fs */ 197 char *name; /* of file containing external f.s. */ 198 Qid qid; /* of file containing external f.s. */ 199 long ref; /* attach count */ 200 Qid rootqid; /* of plan9 constructed root directory */ 201 uchar isfat32; /* is a fat 32 file system? */ 202 short dev; 203 short fmt; 204 long offset; 205 void *ptr; 206 }; 207 208 struct Xfile{ 209 Xfile *next; /* in hash bucket */ 210 long fid; 211 ulong flags; 212 Qid qid; 213 Xfs *xf; 214 Dosptr *ptr; 215 }; 216 217 enum{ 218 Asis, Clean, Clunk 219 }; 220 221 enum{ 222 Invalid, Short, ShortLower, Long 223 }; 224 225 enum{ /* Xfile flags */ 226 Oread = 1, 227 Owrite = 2, 228 Orclose = 4, 229 Omodes = 3, 230 }; 231 232 enum{ 233 Enevermind, 234 Eformat, 235 Eio, 236 Enoauth, 237 Enomem, 238 Enonexist, 239 Eperm, 240 Enofilsys, 241 Eauth, 242 Econtig, 243 Ebadfcall, 244 Ebadstat, 245 Eversion, 246 Etoolong, 247 Eerrstr, 248 ESIZE 249 }; 250 251 extern int chatty; 252 extern int errno; 253 extern int readonly; 254 extern char *deffile; 255 extern int trspaces;