188 lines
4.9 KiB
Diff
188 lines
4.9 KiB
Diff
|
--- util-linux-2.12p/mount/mount.c.ocfs2 2005-07-12 16:31:16.000000000 +0200
|
||
|
+++ util-linux-2.12p/mount/mount.c 2005-07-12 16:31:46.000000000 +0200
|
||
|
@@ -466,6 +466,61 @@
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
+ * check_special_mountprog()
|
||
|
+ * If there is a special mount program for this type, exec it.
|
||
|
+ * returns: 0: no exec was done, 1: exec was done, status has result
|
||
|
+ */
|
||
|
+
|
||
|
+static int
|
||
|
+check_special_mountprog(const char *spec, const char *node, const char *type, int flags,
|
||
|
+ char *extra_opts, int *status) {
|
||
|
+ char mountprog[120];
|
||
|
+ struct stat statbuf;
|
||
|
+ int res;
|
||
|
+
|
||
|
+ if (!external_allowed)
|
||
|
+ return 0;
|
||
|
+
|
||
|
+ if (type && strlen(type) < 100) {
|
||
|
+ sprintf(mountprog, "/sbin/mount.%s", type);
|
||
|
+ if (stat(mountprog, &statbuf) == 0) {
|
||
|
+ res = fork();
|
||
|
+ if (res == 0) {
|
||
|
+ char *oo, *mountargs[10];
|
||
|
+ int i = 0;
|
||
|
+
|
||
|
+ setuid(getuid());
|
||
|
+ setgid(getgid());
|
||
|
+ oo = fix_opts_string (flags, extra_opts, NULL);
|
||
|
+ mountargs[i++] = mountprog;
|
||
|
+ mountargs[i++] = spec;
|
||
|
+ mountargs[i++] = node;
|
||
|
+ if (nomtab)
|
||
|
+ mountargs[i++] = "-n";
|
||
|
+ if (verbose)
|
||
|
+ mountargs[i++] = "-v";
|
||
|
+ if (oo && *oo) {
|
||
|
+ mountargs[i++] = "-o";
|
||
|
+ mountargs[i++] = oo;
|
||
|
+ }
|
||
|
+ mountargs[i] = NULL;
|
||
|
+ execv(mountprog, mountargs);
|
||
|
+ exit(1); /* exec failed */
|
||
|
+ } else if (res != -1) {
|
||
|
+ int st;
|
||
|
+ wait(&st);
|
||
|
+ *status = (WIFEXITED(st) ? WEXITSTATUS(st) : EX_SYSERR);
|
||
|
+ return 1;
|
||
|
+ } else {
|
||
|
+ int errsv = errno;
|
||
|
+ error(_("mount: cannot fork: %s"), strerror(errsv));
|
||
|
+ }
|
||
|
+ }
|
||
|
+ }
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
+/*
|
||
|
* guess_fstype_and_mount()
|
||
|
* Mount a single file system. Guess the type when unknown.
|
||
|
* returns: 0: OK, -1: error in errno, 1: other error
|
||
|
@@ -474,9 +529,11 @@
|
||
|
*/
|
||
|
static int
|
||
|
guess_fstype_and_mount(const char *spec, const char *node, const char **types,
|
||
|
- int flags, char *mount_opts) {
|
||
|
+ int flags, char *mount_opts, int *special, int *status) {
|
||
|
struct mountargs args = { spec, node, NULL, flags & ~MS_NOSYS, mount_opts };
|
||
|
|
||
|
+ *special = 0;
|
||
|
+
|
||
|
if (*types && strcasecmp (*types, "auto") == 0)
|
||
|
*types = NULL;
|
||
|
|
||
|
@@ -485,10 +542,16 @@
|
||
|
|
||
|
if (!*types && !(flags & MS_REMOUNT)) {
|
||
|
*types = guess_fstype(spec);
|
||
|
- if (*types && !strcmp(*types, "swap")) {
|
||
|
- error(_("%s looks like swapspace - not mounted"), spec);
|
||
|
- *types = NULL;
|
||
|
- return 1;
|
||
|
+ if (*types) {
|
||
|
+ if (!strcmp(*types, "swap")) {
|
||
|
+ error(_("%s looks like swapspace - not mounted"), spec);
|
||
|
+ *types = NULL;
|
||
|
+ return 1;
|
||
|
+ } else if (check_special_mountprog(spec, node, *types, flags,
|
||
|
+ mount_opts, status)) {
|
||
|
+ *special = 1;
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@@ -741,61 +804,6 @@
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
- * check_special_mountprog()
|
||
|
- * If there is a special mount program for this type, exec it.
|
||
|
- * returns: 0: no exec was done, 1: exec was done, status has result
|
||
|
- */
|
||
|
-
|
||
|
-static int
|
||
|
-check_special_mountprog(const char *spec, const char *node, const char *type,
|
||
|
- int flags, char *extra_opts, int *status) {
|
||
|
- char mountprog[120];
|
||
|
- struct stat statbuf;
|
||
|
- int res;
|
||
|
-
|
||
|
- if (!external_allowed)
|
||
|
- return 0;
|
||
|
-
|
||
|
- if (type && strlen(type) < 100) {
|
||
|
- sprintf(mountprog, "/sbin/mount.%s", type);
|
||
|
- if (stat(mountprog, &statbuf) == 0) {
|
||
|
- res = fork();
|
||
|
- if (res == 0) {
|
||
|
- const char *oo, *mountargs[10];
|
||
|
- int i = 0;
|
||
|
-
|
||
|
- setuid(getuid());
|
||
|
- setgid(getgid());
|
||
|
- oo = fix_opts_string (flags, extra_opts, NULL);
|
||
|
- mountargs[i++] = mountprog;
|
||
|
- mountargs[i++] = spec;
|
||
|
- mountargs[i++] = node;
|
||
|
- if (nomtab)
|
||
|
- mountargs[i++] = "-n";
|
||
|
- if (verbose)
|
||
|
- mountargs[i++] = "-v";
|
||
|
- if (oo && *oo) {
|
||
|
- mountargs[i++] = "-o";
|
||
|
- mountargs[i++] = oo;
|
||
|
- }
|
||
|
- mountargs[i] = NULL;
|
||
|
- execv(mountprog, (char **) mountargs);
|
||
|
- exit(1); /* exec failed */
|
||
|
- } else if (res != -1) {
|
||
|
- int st;
|
||
|
- wait(&st);
|
||
|
- *status = (WIFEXITED(st) ? WEXITSTATUS(st) : EX_SYSERR);
|
||
|
- return 1;
|
||
|
- } else {
|
||
|
- int errsv = errno;
|
||
|
- error(_("mount: cannot fork: %s"), strerror(errsv));
|
||
|
- }
|
||
|
- }
|
||
|
- }
|
||
|
- return 0;
|
||
|
-}
|
||
|
-
|
||
|
-/*
|
||
|
* try_mount_one()
|
||
|
* Try to mount one file system. When "bg" is 1, this is a retry
|
||
|
* in the background. One additional exit code EX_BG is used here.
|
||
|
@@ -807,7 +815,7 @@
|
||
|
static int
|
||
|
try_mount_one (const char *spec0, const char *node0, const char *types0,
|
||
|
const char *opts0, int freq, int pass, int bg, int ro) {
|
||
|
- int res = 0, status;
|
||
|
+ int res = 0, status, special;
|
||
|
int mnt5_res = 0; /* only for gcc */
|
||
|
int mnt_err;
|
||
|
int flags;
|
||
|
@@ -898,9 +906,15 @@
|
||
|
block_signals (SIG_BLOCK);
|
||
|
nosigblock:
|
||
|
|
||
|
- if (!fake)
|
||
|
+ if (!fake) {
|
||
|
mnt5_res = guess_fstype_and_mount (spec, node, &types, flags & ~MS_NOSYS,
|
||
|
- mount_opts);
|
||
|
+ mount_opts, &special, &status);
|
||
|
+
|
||
|
+ if (special) {
|
||
|
+ block_signals (SIG_UNBLOCK);
|
||
|
+ return status;
|
||
|
+ }
|
||
|
+ }
|
||
|
|
||
|
if (fake || mnt5_res == 0) {
|
||
|
/* Mount succeeded, report this (if verbose) and write mtab entry. */
|