diff options
-rw-r--r-- | mount/mount.c | 19 | ||||
-rw-r--r-- | mount/umount.c | 17 |
2 files changed, 31 insertions, 5 deletions
diff --git a/mount/mount.c b/mount/mount.c index f2b6ee23..84986e36 100644 --- a/mount/mount.c +++ b/mount/mount.c @@ -664,13 +664,22 @@ check_special_mountprog(const char *spec, const char *node, const char *type, in path = strtok(search_path, ":"); while (path) { + int type_opt = 0; + res = snprintf(mountprog, sizeof(mountprog), "%s/mount.%s", path, type); path = strtok(NULL, ":"); if (res >= sizeof(mountprog) || res < 0) continue; - if (stat(mountprog, &statbuf)) + res = stat(mountprog, &statbuf); + if (res == -1 && errno == ENOENT && strchr(type, '.')) { + /* If type ends with ".subtype" try without it */ + *strrchr(mountprog, '.') = '\0'; + type_opt = 1; + res = stat(mountprog, &statbuf); + } + if (res) continue; if (verbose) @@ -678,7 +687,7 @@ check_special_mountprog(const char *spec, const char *node, const char *type, in switch (fork()) { case 0: { /* child */ - char *oo, *mountargs[10]; + char *oo, *mountargs[12]; int i = 0; if (setgid(getgid()) < 0) @@ -703,7 +712,11 @@ check_special_mountprog(const char *spec, const char *node, const char *type, in mountargs[i++] = "-o"; /* 8 */ mountargs[i++] = oo; /* 9 */ } - mountargs[i] = NULL; /* 10 */ + if (type_opt) { + mountargs[i++] = "-t"; /* 10 */ + mountargs[i++] = (char *) type; /* 11 */ + } + mountargs[i] = NULL; /* 12 */ if (verbose > 2) { i = 0; diff --git a/mount/umount.c b/mount/umount.c index 5bd53604..0ad7c5f9 100644 --- a/mount/umount.c +++ b/mount/umount.c @@ -103,11 +103,20 @@ check_special_umountprog(const char *spec, const char *node, return 0; if (strlen(type) < 100) { + int type_opt = 0; + sprintf(umountprog, "/sbin/umount.%s", type); - if (stat(umountprog, &statbuf) == 0) { + res = stat(umountprog, &statbuf); + if (res == -1 && errno == ENOENT && strchr(type, '.')) { + /* If type ends with ".subtype" try without it */ + *strrchr(umountprog, '.') = '\0'; + type_opt = 1; + res = stat(umountprog, &statbuf); + } + if (res == 0) { res = fork(); if (res == 0) { - char *umountargs[8]; + char *umountargs[10]; int i = 0; if(setgid(getgid()) < 0) @@ -128,6 +137,10 @@ check_special_umountprog(const char *spec, const char *node, umountargs[i++] = "-v"; if (remount) umountargs[i++] = "-r"; + if (type_opt) { + umountargs[i++] = "-t"; + umountargs[i++] = (char *) type; + } umountargs[i] = NULL; execv(umountprog, umountargs); exit(1); /* exec failed */ |