SOURCES: util-linux-mount-helper-auto.patch (NEW) - call mount.<FS...

baggins baggins at pld-linux.org
Sun Mar 25 17:37:19 CEST 2007


Author: baggins                      Date: Sun Mar 25 15:37:19 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- call mount.<FSTYPE> for autodetected filesystems also

---- Files affected:
SOURCES:
   util-linux-mount-helper-auto.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/util-linux-mount-helper-auto.patch
diff -u /dev/null SOURCES/util-linux-mount-helper-auto.patch:1.1
--- /dev/null	Sun Mar 25 17:37:19 2007
+++ SOURCES/util-linux-mount-helper-auto.patch	Sun Mar 25 17:37:14 2007
@@ -0,0 +1,187 @@
+--- 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.  */
================================================================


More information about the pld-cvs-commit mailing list