Author: ae
Date: Thu Nov 27 08:41:31 2014
New Revision: 275179
URL: https://svnweb.freebsd.org/changeset/base/275179

Log:
  MFC r274750:
    Use geom attribute "PART::type" to determine partition type and choose
    relevant fsck_xxx utility.

Modified:
  stable/10/sbin/fsck/fsck.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sbin/fsck/fsck.c
==============================================================================
--- stable/10/sbin/fsck/fsck.c  Thu Nov 27 08:31:20 2014        (r275178)
+++ stable/10/sbin/fsck/fsck.c  Thu Nov 27 08:41:31 2014        (r275179)
@@ -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 *
 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 cha
        *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);
 }
 
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to