diff --git a/sbin/fsck/fsck.c b/sbin/fsck/fsck.c index b483a9bb3bba..35a4b91d64f6 100644 --- a/sbin/fsck/fsck.c +++ b/sbin/fsck/fsck.c @@ -278,7 +278,7 @@ isok(struct fstab *fs) static int -checkfs(const char *vfstype, const char *spec, const char *mntpt, +checkfs(const char *pvfstype, const char *spec, const char *mntpt, char *auxopt, pid_t *pidp) { /* List of directories containing fsck_xxx subcommands. */ @@ -291,6 +291,7 @@ checkfs(const char *vfstype, const char *spec, const char *mntpt, pid_t pid; int argc, i, status, maxargc; char *optbuf, execname[MAXPATHLEN + 1], execbase[MAXPATHLEN]; + char *vfstype = NULL; const char *extra = NULL; #ifdef __GNUC__ @@ -298,6 +299,24 @@ checkfs(const char *vfstype, const char *spec, const char *mntpt, (void) &optbuf; (void) &vfstype; #endif + /* + * We convert the vfstype to lowercase and any spaces to underscores + * to not confuse the issue + * + * XXX This is a kludge to make automatic filesystem type guessing + * from the disklabel work for "4.2BSD" filesystems. It does a + * very limited subset of transliteration to a normalised form of + * filesystem name, and we do not seem to enforce a filesystem + * name character set. + */ + vfstype = strdup(pvfstype); + if (vfstype == NULL) + perror("strdup(pvfstype)"); + for (i = 0; i < strlen(vfstype); i++) { + vfstype[i] = tolower(vfstype[i]); + if (vfstype[i] == ' ') + vfstype[i] = '_'; + } extra = getoptions(vfstype); optbuf = NULL; @@ -334,6 +353,7 @@ checkfs(const char *vfstype, const char *spec, const char *mntpt, warn("vfork"); if (optbuf) free(optbuf); + free(vfstype); return (1); case 0: /* Child. */ @@ -367,6 +387,8 @@ checkfs(const char *vfstype, const char *spec, const char *mntpt, if (optbuf) free(optbuf); + free(vfstype); + if (pidp) { *pidp = pid; return 0;