summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2014-11-20 16:31:31 +0000
committerae <ae@FreeBSD.org>2014-11-20 16:31:31 +0000
commite50f01ba8437c18bac1f73993d8fecf86b3ca2ce (patch)
treecef9e035bd03ec9dd979e8e0cb659e1d5349feec /sbin
parent87fb414438edb52a73177bc44e997aeed6ff9f05 (diff)
downloadFreeBSD-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.c54
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);
}
OpenPOWER on IntegriCloud