Author: imp
Date: Thu Nov 20 21:18:19 2014
New Revision: 274761
URL: https://svnweb.freebsd.org/changeset/base/274761

Log:
  Back our r274750 until discussions on proper fix are over.

Modified:
  head/sbin/fsck/fsck.c

Modified: head/sbin/fsck/fsck.c
==============================================================================
--- head/sbin/fsck/fsck.c       Thu Nov 20 20:50:05 2014        (r274760)
+++ head/sbin/fsck/fsck.c       Thu Nov 20 21:18:19 2014        (r274761)
@@ -41,7 +41,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/mount.h>
 #include <sys/queue.h>
 #include <sys/wait.h>
-#include <sys/disk.h>
+#define FSTYPENAMES
+#include <sys/disklabel.h>
 #include <sys/ioctl.h>
 
 #include <ctype.h>
@@ -80,21 +81,10 @@ 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 *getfstype(const char *);
+static const char *getfslab(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[])
 {
@@ -213,7 +203,7 @@ main(int argc, char *argv[])
                if ((fs = getfsfile(spec)) == NULL &&
                    (fs = getfsspec(spec)) == NULL) {
                        if (vfstype == NULL)
-                               vfstype = getfstype(spec);
+                               vfstype = getfslab(spec);
                        if (vfstype == NULL)
                                errx(1, "Could not determine filesystem type");
                        type = vfstype;
@@ -545,27 +535,41 @@ mangle(char *opts, int *argcp, const cha
        *maxargcp = maxargc;
 }
 
+
 static const char *
-getfstype(const char *str)
+getfslab(const char *str)
 {
-       struct diocgattr_arg attr;
-       int fd, i;
+       struct disklabel dl;
+       int fd;
+       char p;
+       const char *vfstype;
+       u_char t;
 
+       /* deduce the file system type from the disk label */
        if ((fd = open(str, O_RDONLY)) == -1)
                err(1, "cannot open `%s'", str);
 
-       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) {
+       if (ioctl(fd, DIOCGDINFO, &dl) == -1) {
                (void) close(fd);
                return(NULL);
        }
+
        (void) close(fd);
-       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);
+
+       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;
 }
 
 
_______________________________________________
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