diff options
author | ae <ae@FreeBSD.org> | 2014-11-20 16:31:31 +0000 |
---|---|---|
committer | ae <ae@FreeBSD.org> | 2014-11-20 16:31:31 +0000 |
commit | e50f01ba8437c18bac1f73993d8fecf86b3ca2ce (patch) | |
tree | cef9e035bd03ec9dd979e8e0cb659e1d5349feec /sbin | |
parent | 87fb414438edb52a73177bc44e997aeed6ff9f05 (diff) | |
download | FreeBSD-src-e50f01ba8437c18bac1f73993d8fecf86b3ca2ce.zip FreeBSD-src-e50f01ba8437c18bac1f73993d8fecf86b3ca2ce.tar.gz |
Use geom attribute "PART::type" to determine partition type and choose
relevant fsck_xxx utility.
MFC after: 1 week
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/fsck/fsck.c | 54 |
1 files changed, 25 insertions, 29 deletions
diff --git a/sbin/fsck/fsck.c b/sbin/fsck/fsck.c index 6bc702e..63ff153 100644 --- a/sbin/fsck/fsck.c +++ b/sbin/fsck/fsck.c @@ -41,8 +41,7 @@ __FBSDID("$FreeBSD$"); #include <sys/mount.h> #include <sys/queue.h> #include <sys/wait.h> -#define FSTYPENAMES -#include <sys/disklabel.h> +#include <sys/disk.h> #include <sys/ioctl.h> #include <ctype.h> @@ -81,10 +80,21 @@ static void addentry(struct fstypelist *, const char *, const char *); static void maketypelist(char *); static void catopt(char **, const char *); static void mangle(char *, int *, const char ** volatile *, int *); -static const char *getfslab(const char *); +static const char *getfstype(const char *); static void usage(void) __dead2; static int isok(struct fstab *); +static struct { + const char *ptype; + const char *name; +} ptype_map[] = { + { "ufs", "ffs" }, + { "ffs", "ffs" }, + { "fat", "msdosfs" }, + { "efi", "msdosfs" }, + { NULL, NULL }, +}; + int main(int argc, char *argv[]) { @@ -203,7 +213,7 @@ main(int argc, char *argv[]) if ((fs = getfsfile(spec)) == NULL && (fs = getfsspec(spec)) == NULL) { if (vfstype == NULL) - vfstype = getfslab(spec); + vfstype = getfstype(spec); if (vfstype == NULL) errx(1, "Could not determine filesystem type"); type = vfstype; @@ -535,41 +545,27 @@ mangle(char *opts, int *argcp, const char ** volatile *argvp, int *maxargcp) *maxargcp = maxargc; } - static const char * -getfslab(const char *str) +getfstype(const char *str) { - struct disklabel dl; - int fd; - char p; - const char *vfstype; - u_char t; + struct diocgattr_arg attr; + int fd, i; - /* deduce the file system type from the disk label */ if ((fd = open(str, O_RDONLY)) == -1) err(1, "cannot open `%s'", str); - if (ioctl(fd, DIOCGDINFO, &dl) == -1) { + strncpy(attr.name, "PART::type", sizeof(attr.name)); + memset(&attr.value, 0, sizeof(attr.value)); + attr.len = sizeof(attr.value); + if (ioctl(fd, DIOCGATTR, &attr) == -1) { (void) close(fd); return(NULL); } - (void) close(fd); - - p = str[strlen(str) - 1]; - - if ((p - 'a') >= dl.d_npartitions) - errx(1, "partition `%s' is not defined on disk", str); - - if ((t = dl.d_partitions[p - 'a'].p_fstype) >= FSMAXTYPES) - errx(1, "partition `%s' is not of a legal vfstype", - str); - - if ((vfstype = fstypenames[t]) == NULL) - errx(1, "vfstype `%s' on partition `%s' is not supported", - fstypenames[t], str); - - return vfstype; + for (i = 0; ptype_map[i].ptype != NULL; i++) + if (strstr(attr.value.str, ptype_map[i].ptype) != NULL) + return (ptype_map[i].name); + return (NULL); } |