Home | History | Annotate | Download | only in fsck_msdos

Lines Matching refs:boot

30 __RCSID("$NetBSD: boot.c,v 1.27 2022/08/28 11:32:19 mlelstv Exp $");
46 readboot(int dosfs, struct bootblock *boot)
68 perr("could not read boot block");
74 pfatal("Invalid signature in boot block: %02x%02x", block[511], block[510]);
79 memset(boot, 0, sizeof *boot);
80 boot->ValidFat = -1;
83 boot->BytesPerSec = block[11] + (block[12] << 8);
84 boot->SecPerClust = block[13];
85 if (boot->SecPerClust == 0 || popcount(boot->SecPerClust) != 1) {
86 pfatal("Invalid cluster size: %u\n", boot->SecPerClust);
89 boot->ResSectors = block[14] + (block[15] << 8);
90 boot->FATs = block[16];
91 if (boot->FATs == 0) {
92 pfatal("Invalid number of FATs: %u\n", boot->FATs);
95 boot->RootDirEnts = block[17] + (block[18] << 8);
96 boot->Sectors = block[19] + (block[20] << 8);
97 boot->Media = block[21];
98 boot->FATsmall = block[22] + (block[23] << 8);
99 boot->SecPerTrack = block[24] + (block[25] << 8);
100 boot->Heads = block[26] + (block[27] << 8);
101 boot->HiddenSecs = block[28] + (block[29] << 8) + (block[30] << 16) + ((uint32_t)block[31] << 24);
102 boot->HugeSectors = block[32] + (block[33] << 8) + (block[34] << 16) + ((uint32_t)block[35] << 24);
104 boot->FATsecs = boot->FATsmall;
113 if (!boot->RootDirEnts)
114 boot->flags |= FAT32;
115 if (boot->flags & FAT32) {
116 boot->FATsecs = block[36] + (block[37] << 8)
119 boot->ValidFat = block[40] & 0x0f;
128 boot->RootCl = block[44] + (block[45] << 8)
130 boot->FSInfo = block[48] + (block[49] << 8);
131 boot->Backup = block[50] + (block[51] << 8);
133 if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)
134 != boot->FSInfo * boot->BytesPerSec
160 if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)
161 != boot->FSInfo * boot->BytesPerSec
172 boot->FSInfo = 0;
174 if (boot->FSInfo) {
175 boot->FSFree = fsinfo[0x1e8] + (fsinfo[0x1e9] << 8)
178 boot->FSNext = fsinfo[0x1ec] + (fsinfo[0x1ed] << 8)
183 if (lseek(dosfs, boot->Backup * boot->BytesPerSec, SEEK_SET)
184 != boot->Backup * boot->BytesPerSec
204 boot->Backup);
218 if (boot->FATsecs == 0) {
219 pfatal("Invalid number of FAT sectors: %u\n", boot->FATsecs);
223 boot->FirstCluster = (boot->RootDirEnts * 32 + boot->BytesPerSec - 1)
224 / boot->BytesPerSec
225 + boot->ResSectors
226 + boot->FATs * boot->FATsecs;
228 if (boot->BytesPerSec % DOSBOOTBLOCKSIZE != 0) {
229 pfatal("Invalid sector size: %u", boot->BytesPerSec);
232 if (boot->SecPerClust == 0) {
233 pfatal("Invalid cluster size: %u", boot->SecPerClust);
236 if (boot->Sectors) {
237 boot->HugeSectors = 0;
238 boot->NumSectors = boot->Sectors;
240 boot->NumSectors = boot->HugeSectors;
242 if (boot->FirstCluster + boot->SecPerClust > boot->NumSectors) {
244 boot->FirstCluster);
252 boot->NumClusters =
253 (boot->NumSectors - boot->FirstCluster) / boot->SecPerClust;
255 if (boot->flags&FAT32)
256 boot->ClustMask = CLUST32_MASK;
257 else if (boot->NumClusters < (CLUST_RSRVD&CLUST12_MASK))
258 boot->ClustMask = CLUST12_MASK;
259 else if (boot->NumClusters < (CLUST_RSRVD&CLUST16_MASK))
260 boot->ClustMask = CLUST16_MASK;
263 boot->NumClusters);
267 switch (boot->ClustMask) {
269 boot->NumFatEntries = (boot->FATsecs * boot->BytesPerSec) / 4;
272 boot->NumFatEntries = (boot->FATsecs * boot->BytesPerSec) / 2;
275 boot->NumFatEntries = (boot->FATsecs * boot->BytesPerSec * 2) / 3;
279 if (boot->NumFatEntries < boot->NumClusters) {
281 boot->NumClusters, boot->FATsecs);
290 boot->NumClusters += CLUST_FIRST;
292 boot->ClusterSize = boot->BytesPerSec * boot->SecPerClust;
294 boot->NumFiles = 1;
295 boot->NumFree = 0;
301 writefsinfo(int dosfs, struct bootblock *boot)
305 fsinfo = calloc(2, boot->BytesPerSec);
309 if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)
310 != boot->FSInfo * boot->BytesPerSec
311 || (size_t)read(dosfs, fsinfo, 2 * boot->BytesPerSec)
312 != 2 * boot->BytesPerSec) {
317 fsinfo[0x1e8] = (u_char)boot->FSFree;
318 fsinfo[0x1e9] = (u_char)(boot->FSFree >> 8);
319 fsinfo[0x1ea] = (u_char)(boot->FSFree >> 16);
320 fsinfo[0x1eb] = (u_char)(boot->FSFree >> 24);
321 fsinfo[0x1ec] = (u_char)boot->FSNext;
322 fsinfo[0x1ed] = (u_char)(boot->FSNext >> 8);
323 fsinfo[0x1ee] = (u_char)(boot->FSNext >> 16);
324 fsinfo[0x1ef] = (u_char)(boot->FSNext >> 24);
325 if (lseek(dosfs, boot->FSInfo * boot->BytesPerSec, SEEK_SET)
326 != boot->FSInfo * boot->BytesPerSec
327 || (size_t)write(dosfs, fsinfo, 2 * boot->BytesPerSec)
328 != 2 * boot->BytesPerSec) {