summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sbin/fsck_msdos/dir.c25
-rw-r--r--sbin/fsck_msdos/fat.c37
2 files changed, 26 insertions, 36 deletions
diff --git a/sbin/fsck_msdos/dir.c b/sbin/fsck_msdos/dir.c
index 4c5fe5ee4f9..46f70a2dfd6 100644
--- a/sbin/fsck_msdos/dir.c
+++ b/sbin/fsck_msdos/dir.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: dir.c,v 1.7 1997/03/02 05:25:53 millert Exp $ */
-/* $NetBSD: dir.c,v 1.8 1996/09/27 23:22:52 christos Exp $ */
+/* $OpenBSD: dir.c,v 1.8 1997/09/11 08:15:24 deraadt Exp $ */
+/* NetBSD: dir.c,v 1.9 1997/09/08 14:05:30 ws Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank
@@ -37,7 +37,7 @@
#ifndef lint
-static char rcsid[] = "$OpenBSD: dir.c,v 1.7 1997/03/02 05:25:53 millert Exp $";
+static char rcsid[] = "$OpenBSD: dir.c,v 1.8 1997/09/11 08:15:24 deraadt Exp $";
#endif /* not lint */
#include <stdio.h>
@@ -186,6 +186,8 @@ fullpath(dir)
} while ((dir = dir->parent) != NULL);
if (dir != NULL && dir->parent != NULL)
*--cp = '?';
+ else
+ cp++;
return (cp);
}
@@ -653,7 +655,9 @@ readDosDirSection(f, boot, fat, dir)
}
vallfn = NULL; /* not used any longer */
invlfn = NULL;
-
+ dirent.parent = dir;
+ dirent.next = dir->child;
+
if (dirent.size == 0 && !(dirent.flags & ATTR_DIRECTORY)) {
if (dirent.head != 0) {
pwarn("%s has clusters, but size 0\n",
@@ -714,8 +718,6 @@ readDosDirSection(f, boot, fat, dir)
}
}
- dirent.parent = dir;
- dirent.next = dir->child;
if (dirent.head >= CLUST_FIRST && dirent.head < boot->NumClusters)
fat[dirent.head].flags |= FAT_USED;
@@ -768,14 +770,11 @@ readDosDirSection(f, boot, fat, dir)
continue;
}
- boot->NumFiles++;
-
/* create directory tree node */
if (!(d = newDosDirEntry())) {
perror("No space for directory");
return (FSFATAL);
}
-
(void)memcpy(d, &dirent, sizeof(struct dosDirEntry));
/* link it into the tree */
dir->child = d;
@@ -792,8 +791,8 @@ readDosDirSection(f, boot, fat, dir)
mod |= k = checksize(boot, fat, p, &dirent);
if (k & FSDIRMOD)
mod |= THISMOD;
- boot->NumFiles++;
}
+ boot->NumFiles++;
}
if (mod & THISMOD) {
last *= 32;
@@ -901,7 +900,7 @@ reconnect(dosfs, boot, fat, head)
p = lfbuf;
while (1) {
if (p)
- while (p < lfbuf + boot->ClusterSize)
+ for (; p < lfbuf + boot->ClusterSize; p += 32)
if (*p == SLOT_EMPTY
|| *p == SLOT_DELETED)
break;
@@ -916,7 +915,7 @@ reconnect(dosfs, boot, fat, head)
lfoff = lfcl * boot->ClusterSize
+ boot->ClusterOffset * boot->BytesPerSec;
if (lseek(dosfs, lfoff, SEEK_SET) != lfoff
- || read(dosfs, buffer, boot->ClusterSize) != boot->ClusterSize) {
+ || read(dosfs, lfbuf, boot->ClusterSize) != boot->ClusterSize) {
perror("could not read LOST.DIR");
return (FSFATAL);
}
@@ -945,7 +944,7 @@ reconnect(dosfs, boot, fat, head)
p[31] = (u_char)(d.size >> 24);
fat[head].flags |= FAT_USED;
if (lseek(dosfs, lfoff, SEEK_SET) != lfoff
- || write(dosfs, buffer, boot->ClusterSize) != boot->ClusterSize) {
+ || write(dosfs, lfbuf, boot->ClusterSize) != boot->ClusterSize) {
perror("could not write LOST.DIR");
return (FSFATAL);
}
diff --git a/sbin/fsck_msdos/fat.c b/sbin/fsck_msdos/fat.c
index 1c8c4a035ce..116322de1dc 100644
--- a/sbin/fsck_msdos/fat.c
+++ b/sbin/fsck_msdos/fat.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: fat.c,v 1.5 1997/03/02 05:25:55 millert Exp $ */
-/* $NetBSD: fat.c,v 1.5 1997/01/03 14:32:49 ws Exp $ */
+/* $OpenBSD: fat.c,v 1.6 1997/09/11 08:15:26 deraadt Exp $ */
+/* $NetBSD: fat.c,v 1.6 1997/09/08 14:05:31 ws Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank
@@ -35,7 +35,7 @@
#ifndef lint
-static char rcsid[] = "$OpenBSD: fat.c,v 1.5 1997/03/02 05:25:55 millert Exp $";
+static char rcsid[] = "$OpenBSD: fat.c,v 1.6 1997/09/11 08:15:26 deraadt Exp $";
#endif /* not lint */
#include <stdlib.h>
@@ -140,7 +140,8 @@ readfat(fs, boot, no, fp)
fat[0].length = buffer[0]|(buffer[1] << 8)|(buffer[2] << 16);
if (boot->Is16BitFat)
fat[0].length |= buffer[3] << 24;
- if (buffer[1] != 0xff || buffer[2] != 0xff
+ if (buffer[0] != boot->Media
+ || buffer[1] != 0xff || buffer[2] != 0xff
|| (boot->Is16BitFat && buffer[3] != 0xff)) {
char *msg = boot->Is16BitFat
? "FAT starts with odd byte sequence (%02x%02x%02x%02x)\n"
@@ -273,18 +274,6 @@ comparefat(boot, first, second, fatnum)
cl_t cl;
int ret = FSOK;
- if (first[0].next != second[0].next) {
- pwarn("Media bytes in cluster 1(%02x) and %d(%02x) differ\n",
- first[0].next, fatnum, second[0].next);
- if (ask(1, "Use media byte from FAT 1")) {
- second[0].next = first[0].next;
- ret |= FSFATMOD;
- } else if (ask(0, "Use media byte from FAT %d", fatnum)) {
- first[0].next = second[0].next;
- ret |= FSFATMOD;
- } else
- ret |= FSERROR;
- }
for (cl = CLUST_FIRST; cl < boot->NumClusters; cl++)
if (first[cl].next != second[cl].next)
ret |= clustdiffer(cl, &first[cl].next, &second[cl].next, fatnum);
@@ -326,7 +315,7 @@ checkfat(boot, fat)
*/
for (head = CLUST_FIRST; head < boot->NumClusters; head++) {
/* find next untraveled chain */
- if (fat[head].head != 0 /* cluster already belongs to some chain*/
+ if (fat[head].head != 0 /* cluster already belongs to some chain */
|| fat[head].next == CLUST_FREE
|| fat[head].next == CLUST_BAD)
continue; /* skip it. */
@@ -446,16 +435,18 @@ writefat(fs, boot, fat)
}
(void)memset(buffer, 0, fatsz);
boot->NumFree = 0;
- buffer[0] = (u_char)fat[0].length;
- buffer[1] = (u_char)(fat[0].length >> 8);
+ p = buffer;
+ *p++ = (u_char)fat[0].length;
+ *p++ = (u_char)(fat[0].length >> 8);
+ *p++ = (u_char)(fat[0].length >> 16);
if (boot->Is16BitFat)
- buffer[3] = (u_char)(fat[0].length >> 24);
- for (cl = CLUST_FIRST, p = buffer; cl < boot->NumClusters;) {
+ *p++ = (u_char)(fat[0].length >> 24);
+ for (cl = CLUST_FIRST; cl < boot->NumClusters; cl++) {
if (boot->Is16BitFat) {
p[0] = (u_char)fat[cl].next;
if (fat[cl].next == CLUST_FREE)
boot->NumFree++;
- p[1] = (u_char)(fat[cl++].next >> 8);
+ p[1] = (u_char)(fat[cl].next >> 8);
p += 2;
} else {
if (fat[cl].next == CLUST_FREE)
@@ -466,7 +457,7 @@ writefat(fs, boot, fat)
p[0] = (u_char)fat[cl].next;
p[1] = (u_char)((fat[cl].next >> 8) & 0xf)
|(u_char)(fat[cl+1].next << 4);
- p[2] = (u_char)(fat[cl++].next >> 8);
+ p[2] = (u_char)(fat[++cl].next >> 4);
p += 3;
}
}