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