Re: [PATCH] fsck/mkfs/mount: unify default search paths for helpers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Jan 24, 2010 at 10:36:55PM -0500, Mike Frysinger wrote:
> Rather than each fs util having its own search policy, unify the paths in
> configure and allow them to be tweaked by downstream.  In the process,
> drop the /etc paths as no one has ever really used these.
> 
> Signed-off-by: Mike Frysinger <vapier@xxxxxxxxxx>
> ---
>  configure.ac      |   26 +++++++++
>  disk-utils/mkfs.c |    2 +-
>  fsck/fsck.c       |    2 +-
>  mount/mount.c     |  149 +++++++++++++++++++++++++++++------------------------
>  4 files changed, 110 insertions(+), 69 deletions(-)

 Applied, with one important change... (see the patch below)

> +AS_VAR_SET([fs_paths], [$fs_paths_defaults])
> +AS_IF([test "x$fs_paths_extra" != "x"],
> +  [AS_IF([test "x$fs_paths" != "x"], [AS_VAR_APPEND([fs_paths], [:])])
> +   AS_VAR_APPEND([fs_paths], [$fs_paths_extra])]
> +)

 ... the AS_VAR_APPEND() macro is supported since autoconf 2.64. For
 example the latest stable Fedora still has 2.63. BTW, we still have
 AC_PREREQ(2.60) in the configure script.
 
 I have removed all AS_* macros from your patch, because in whole
 configure script we use "if", "case", etc.

 Thanks.

    Karel


>From bb4cb69df2a7fba3098f073aa4b758a8011d826f Mon Sep 17 00:00:00 2001
From: Mike Frysinger <vapier@xxxxxxxxxx>
Date: Sun, 24 Jan 2010 22:36:55 -0500
Subject: [PATCH] fsck/mkfs/mount: unify default search paths for helpers

Rather than each fs util having its own search policy, unify the paths in
configure and allow them to be tweaked by downstream.  In the process,
drop the /etc paths as no one has ever really used these.

[kzak@xxxxxxxxxx: - backport to autoconf < 2.64
                    (remove AS_{SET,IF,CASE,APPEND} macros)]

Signed-off-by: Mike Frysinger <vapier@xxxxxxxxxx>
Signed-off-by: Karel Zak <kzak@xxxxxxxxxx>
---
 configure.ac      |   28 ++++++++++
 disk-utils/mkfs.c |    2 +-
 fsck/fsck.c       |    2 +-
 mount/mount.c     |  149 +++++++++++++++++++++++++++++------------------------
 4 files changed, 112 insertions(+), 69 deletions(-)

diff --git a/configure.ac b/configure.ac
index 1fef944..e36b8f6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -960,6 +960,34 @@ if test "x$enable_require_password" = xyes; then
 fi
 
 
+AC_DEFUN([FS_PATHS_DEFAULT], [/sbin:/sbin/fs.d:/sbin/fs])
+AC_ARG_ENABLE([fs-paths-default],
+  AS_HELP_STRING([--enable-fs-paths-default=paths], [default search path for fs helpers @<:@FS_PATHS_DEFAULT@:>@]),
+  [case "$enableval" in
+     yes) fs_paths_defaults="FS_PATHS_DEFAULT" ;;
+      no) fs_paths_defaults="" ;;
+       *) fs_paths_defaults="$enableval" ;;
+   esac],
+  [fs_paths_defaults="FS_PATHS_DEFAULT"]
+)
+AC_ARG_ENABLE([fs-paths-extra],
+  AS_HELP_STRING([--enable-fs-paths-extra=paths], [additional search paths for fs helpers]),
+  [case "$enableval" in
+     yes|no) fs_paths_extra="" ;;
+          *) fs_paths_extra="$enableval" ;;
+    esac],
+  [fs_paths_extra=""]
+)
+fs_paths="$fs_paths_defaults"
+if test "x$fs_paths_extra" != "x"; then
+  if test "x$fs_paths" != "x"; then
+    fs_paths="${fs_paths}:"
+  fi
+  fs_paths="${fs_paths}${fs_paths_extra}"
+fi
+AC_DEFINE_UNQUOTED([FS_SEARCH_PATH], "$fs_paths", [search path for fs helpers])
+
+
 AC_ARG_ENABLE([use-tty-group],
   AS_HELP_STRING([--disable-use-tty-group], [do not install wall and write setgid tty]),
   [], enable_use_tty_group=yes
diff --git a/disk-utils/mkfs.c b/disk-utils/mkfs.c
index 120da06..a0ccd16 100644
--- a/disk-utils/mkfs.c
+++ b/disk-utils/mkfs.c
@@ -27,7 +27,7 @@
 # define DEFAULT_FSTYPE		"ext2"
 #endif
 
-#define SEARCH_PATH	"PATH=/sbin:/sbin/fs:/sbin/fs.d:/etc/fs:/etc"
+#define SEARCH_PATH	"PATH=" FS_SEARCH_PATH
 #define PROGNAME	"mkfs.%s"
 
 
diff --git a/fsck/fsck.c b/fsck/fsck.c
index 66c027c..45d8484 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -105,7 +105,7 @@ char *progname;
 char *fstype = NULL;
 struct fs_info *filesys_info = NULL, *filesys_last = NULL;
 struct fsck_instance *instance_list;
-const char *fsck_prefix_path = "/sbin:/sbin/fs.d:/sbin/fs:/etc/fs:/etc";
+const char fsck_prefix_path[] = FS_SEARCH_PATH;
 char *fsck_path = 0;
 
 static char *string_copy(const char *s)
diff --git a/mount/mount.c b/mount/mount.c
index 0cef101..5cefdcc 100644
--- a/mount/mount.c
+++ b/mount/mount.c
@@ -639,74 +639,89 @@ do_mount (struct mountargs *args, int *special, int *status) {
 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 == NULL || strcmp(type, "none") == 0)
-	  return 0;
-
-  if (strlen(type) < 100) {
-       sprintf(mountprog, "/sbin/mount.%s", type);
-       if (stat(mountprog, &statbuf) == 0) {
-	    if (verbose)
-		 fflush(stdout);
-	    res = fork();
-	    if (res == 0) {
-		 char *oo, *mountargs[10];
-		 int i = 0;
-
-		 if(setgid(getgid()) < 0)
-			 die(EX_FAIL, _("mount: cannot set group id: %s"), strerror(errno));
-
-		 if(setuid(getuid()) < 0)
-			 die(EX_FAIL, _("mount: cannot set user id: %s"), strerror(errno));
-
-		 oo = fix_opts_string (flags, extra_opts, NULL);
-		 mountargs[i++] = mountprog;				/* 1 */
-		 mountargs[i++] = (char *) spec;			/* 2 */
-		 mountargs[i++] = (char *) node;			/* 3 */
-		 if (sloppy && strncmp(type, "nfs", 3) == 0)
-		      mountargs[i++] = "-s";				/* 4 */
-		 if (fake)
-		      mountargs[i++] = "-f";				/* 5 */
-		 if (nomtab)
-		      mountargs[i++] = "-n";				/* 6 */
-		 if (verbose)
-		      mountargs[i++] = "-v";				/* 7 */
-		 if (oo && *oo) {
-		      mountargs[i++] = "-o";				/* 8 */
-		      mountargs[i++] = oo;				/* 9 */
-		 }
-		 mountargs[i] = NULL;					/* 10 */
-
-		 if (verbose > 2) {
-			i = 0;
-			while(mountargs[i]) {
-				printf("mount: external mount: argv[%d] = \"%s\"\n",
-					i, mountargs[i]);
-				i++;
-			}
+	char search_path[] = FS_SEARCH_PATH;
+	char *path, mountprog[150];
+	struct stat statbuf;
+	int res;
+
+	if (!external_allowed)
+		return 0;
+
+	if (type == NULL || strcmp(type, "none") == 0)
+		return 0;
+
+	path = strtok(search_path, ":");
+	while (path) {
+		res = snprintf(mountprog, sizeof(mountprog), "%s/mount.%s",
+			       path, type);
+		path = strtok(NULL, ":");
+		if (res >= sizeof(mountprog) || res < 0)
+			continue;
+
+		if (stat(mountprog, &statbuf))
+			continue;
+
+		if (verbose)
 			fflush(stdout);
-		 }
-
-		 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;
+
+		switch (fork()) {
+		case 0: { /* child */
+			char *oo, *mountargs[10];
+			int i = 0;
+
+			if (setgid(getgid()) < 0)
+				die(EX_FAIL, _("mount: cannot set group id: %s"), strerror(errno));
+
+			if (setuid(getuid()) < 0)
+				die(EX_FAIL, _("mount: cannot set user id: %s"), strerror(errno));
+
+			oo = fix_opts_string (flags, extra_opts, NULL);
+			mountargs[i++] = mountprog;			/* 1 */
+			mountargs[i++] = (char *) spec;			/* 2 */
+			mountargs[i++] = (char *) node;			/* 3 */
+			if (sloppy && strncmp(type, "nfs", 3) == 0)
+				mountargs[i++] = "-s";			/* 4 */
+			if (fake)
+				mountargs[i++] = "-f";			/* 5 */
+			if (nomtab)
+				mountargs[i++] = "-n";			/* 6 */
+			if (verbose)
+				mountargs[i++] = "-v";			/* 7 */
+			if (oo && *oo) {
+				mountargs[i++] = "-o";			/* 8 */
+				mountargs[i++] = oo;			/* 9 */
+			}
+			mountargs[i] = NULL;				/* 10 */
+
+			if (verbose > 2) {
+				i = 0;
+				while (mountargs[i]) {
+					printf("mount: external mount: argv[%d] = \"%s\"\n",
+						i, mountargs[i]);
+					i++;
+				}
+				fflush(stdout);
+			}
+
+			execv(mountprog, mountargs);
+			exit(1);	/* exec failed */
+		}
+
+		default: { /* parent */
+			int st;
+			wait(&st);
+			*status = (WIFEXITED(st) ? WEXITSTATUS(st) : EX_SYSERR);
+			return 1;
+		}
+
+		case -1: { /* error */
+			int errsv = errno;
+			error(_("mount: cannot fork: %s"), strerror(errsv));
+		}
+		}
+	}
+
+	return 0;
 }
 
 
-- 
1.6.6

--
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux