summaryrefslogtreecommitdiffstats
path: root/sbin/badsect/badsect.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/badsect/badsect.c')
-rw-r--r--sbin/badsect/badsect.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/sbin/badsect/badsect.c b/sbin/badsect/badsect.c
index 6094db2..94f9023 100644
--- a/sbin/badsect/badsect.c
+++ b/sbin/badsect/badsect.c
@@ -59,8 +59,8 @@ static const char rcsid[] =
#include <sys/stat.h>
#include <sys/disklabel.h>
-#include <ufs/ffs/fs.h>
#include <ufs/ufs/dinode.h>
+#include <ufs/ffs/fs.h>
#include <err.h>
#include <dirent.h>
@@ -73,7 +73,7 @@ static const char rcsid[] =
union {
struct fs fs;
- char fsx[SBSIZE];
+ char fsx[SBLOCKSIZE];
} ufs;
#define sblock ufs.fs
union {
@@ -91,6 +91,11 @@ char buf[MAXBSIZE];
void rdfs(daddr_t, int, char *);
int chkuse(daddr_t, int);
+/*
+ * Possible superblock locations ordered from most to least likely.
+ */
+static int sblock_try[] = SBLOCKSEARCH;
+
static void
usage(void)
{
@@ -108,6 +113,7 @@ main(int argc, char *argv[])
DIR *dirp;
char name[2 * MAXPATHLEN];
char *name_dir_end;
+ int i;
if (argc < 3)
usage();
@@ -134,7 +140,19 @@ main(int argc, char *argv[])
if ((fsi = open(name, O_RDONLY)) < 0)
err(6, "%s", name);
fs = &sblock;
- rdfs(SBOFF, SBSIZE, (char *)fs);
+ for (i = 0; sblock_try[i] != -1; i++) {
+ rdfs(sblock_try[i] / dev_bsize, SBLOCKSIZE, (char *)fs);
+ if ((fs->fs_magic == FS_UFS1_MAGIC ||
+ (fs->fs_magic == FS_UFS2_MAGIC &&
+ fs->fs_sblockloc == numfrags(fs, sblock_try[i]))) &&
+ fs->fs_bsize <= MAXBSIZE &&
+ fs->fs_bsize >= sizeof(struct fs))
+ break;
+ }
+ if (sblock_try[i] == -1) {
+ printf("Cannot find filesystem\n");
+ exit(7);
+ }
dev_bsize = fs->fs_fsize / fsbtodb(fs, 1);
for (argc -= 2, argv += 2; argc > 0; argc--, argv++) {
number = atol(*argv);
OpenPOWER on IntegriCloud