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
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;
}