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