svn commit: r274761 - head/sbin/fsck

Warner Losh imp at FreeBSD.org
Thu Nov 20 21:18:20 UTC 2014


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;
 }
 
 


More information about the svn-src-head mailing list