Compare commits
No commits in common. "c9-beta" and "c8" have entirely different histories.
@ -1 +1 @@
|
|||||||
086c327711a7f76692c582264c0742842f3570ba SOURCES/autofs-5.1.7-2.tar.gz
|
0256f9e75e2da9185afe797f1c5bedb1604c7eb2 SOURCES/autofs-5.1.4.tar.gz
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
|||||||
SOURCES/autofs-5.1.7-2.tar.gz
|
SOURCES/autofs-5.1.4.tar.gz
|
||||||
|
@ -0,0 +1,66 @@
|
|||||||
|
autofs-5.1.4 - Makefiles.rules: remove 'samples' from SUBDIRS
|
||||||
|
|
||||||
|
From: NeilBrown <neilb@suse.com>
|
||||||
|
|
||||||
|
The rules in Makefile make it quite clear that
|
||||||
|
'samples' is not expected to be part of SUBDIRS.
|
||||||
|
e.g.
|
||||||
|
- The rule for "clean" handles both $(SUBDIRS) *and* samples.
|
||||||
|
- There are separate "install" and "install_samples" targets.
|
||||||
|
|
||||||
|
However SUBDIRS does contain 'samples'. This means that
|
||||||
|
a simple "make; make install" will over-write your configuration files.
|
||||||
|
|
||||||
|
So remove 'samples' from SUBDIRS. Note that it has been removed in
|
||||||
|
the past, but then got added back again.
|
||||||
|
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.com>
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
Makefile.rules | 2 +-
|
||||||
|
autofs.spec | 6 ++++++
|
||||||
|
3 files changed, 8 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 313730b1..1e5ec15b 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -11,6 +11,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- account for recent libnsl changes.
|
||||||
|
- use_hostname_for_mounts shouldn't prevent selection among replicas.
|
||||||
|
- fix monotonic_elapsed.
|
||||||
|
+- Makefiles.rules: remove 'samples' from SUBDIRS.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/Makefile.rules b/Makefile.rules
|
||||||
|
index 2bfa043c..4deab3b9 100644
|
||||||
|
--- a/Makefile.rules
|
||||||
|
+++ b/Makefile.rules
|
||||||
|
@@ -3,7 +3,7 @@
|
||||||
|
#
|
||||||
|
|
||||||
|
# Root directory contents
|
||||||
|
-SUBDIRS = lib daemon modules man samples
|
||||||
|
+SUBDIRS = lib daemon modules man
|
||||||
|
INCDIRS = include
|
||||||
|
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
|
||||||
|
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
|
||||||
|
diff --git a/autofs.spec b/autofs.spec
|
||||||
|
index 6da0655d..57d8db46 100644
|
||||||
|
--- a/autofs.spec
|
||||||
|
+++ b/autofs.spec
|
||||||
|
@@ -121,6 +121,12 @@ install -m 755 redhat/autofs.init $RPM_BUILD_ROOT/etc/rc.d/init.d/autofs
|
||||||
|
install -m 644 redhat/autofs.conf $RPM_BUILD_ROOT/etc/autofs.conf
|
||||||
|
install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs
|
||||||
|
|
||||||
|
+install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master
|
||||||
|
+install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc
|
||||||
|
+install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net
|
||||||
|
+install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb
|
||||||
|
+install -m 600 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf
|
||||||
|
+
|
||||||
|
%clean
|
||||||
|
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
|
||||||
|
|
557
SOURCES/autofs-5.1.4-account-for-libnsl-changes.patch
Normal file
557
SOURCES/autofs-5.1.4-account-for-libnsl-changes.patch
Normal file
@ -0,0 +1,557 @@
|
|||||||
|
autofs-5.1.4 - account for recent libnsl changes
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The glibc RPC code has been dropped.
|
||||||
|
|
||||||
|
The NIS functionality comes in the libnsl library but it installs
|
||||||
|
its files into sub directories of the system include and library
|
||||||
|
directories.
|
||||||
|
|
||||||
|
So configure needs to check for this and allow for it in the
|
||||||
|
compile and linking of the NIS and NIS+ lookup modules.
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
Makefile.conf.in | 4 -
|
||||||
|
Makefile.rules | 2
|
||||||
|
aclocal.m4 | 45 ++++++++
|
||||||
|
configure | 288 ++++++++++++++++++++++++++++++++++++++++++++++++---
|
||||||
|
configure.in | 27 ++---
|
||||||
|
include/config.h.in | 3 +
|
||||||
|
modules/Makefile | 10 ++
|
||||||
|
8 files changed, 343 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 9d19c0a7..2d5d5b1f 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -8,6 +8,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix sublink option not set from defaults.
|
||||||
|
- fix error return in do_nfs_mount().
|
||||||
|
- add error handling for ext_mount_add().
|
||||||
|
+- account for recent libnsl changes.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/Makefile.conf.in b/Makefile.conf.in
|
||||||
|
index f879e262..85662654 100644
|
||||||
|
--- a/Makefile.conf.in
|
||||||
|
+++ b/Makefile.conf.in
|
||||||
|
@@ -14,8 +14,8 @@ DAEMON_LDFLAGS = @DAEMON_LDFLAGS@
|
||||||
|
# Glibc < 2.17 requires librt for clock_gettime()
|
||||||
|
LIBCLOCK_GETTIME = @LIBCLOCK_GETTIME@
|
||||||
|
|
||||||
|
-# Special parameters for glibc (libc 6)
|
||||||
|
-LIBNSL = @LIBNSL@
|
||||||
|
+NSLLIB = @NSL_LIBS@
|
||||||
|
+NSLCFLAGS = @NSL_CFLAGS@
|
||||||
|
LIBRESOLV = @LIBRESOLV@
|
||||||
|
|
||||||
|
# Hesiod support: yes (1) no (0)
|
||||||
|
diff --git a/Makefile.rules b/Makefile.rules
|
||||||
|
index 0edf9bfe..2bfa043c 100644
|
||||||
|
--- a/Makefile.rules
|
||||||
|
+++ b/Makefile.rules
|
||||||
|
@@ -54,8 +54,6 @@ ifdef DMALLOCLIB
|
||||||
|
LIBS += $(DMALLOCLIB)
|
||||||
|
endif
|
||||||
|
|
||||||
|
-LIBS += $(LIBNSL)
|
||||||
|
-
|
||||||
|
LIBS += $(LIBCLOCK_GETTIME)
|
||||||
|
|
||||||
|
# Standard rules
|
||||||
|
diff --git a/aclocal.m4 b/aclocal.m4
|
||||||
|
index 51772043..f1ed3870 100644
|
||||||
|
--- a/aclocal.m4
|
||||||
|
+++ b/aclocal.m4
|
||||||
|
@@ -417,3 +417,48 @@ fi
|
||||||
|
LIBS="$af_check_ldap_parse_page_control_save_libs"
|
||||||
|
])
|
||||||
|
|
||||||
|
+dnl --------------------------------------------------------------------------
|
||||||
|
+dnl AF_CHECK_YPCLNT_HEADER
|
||||||
|
+dnl
|
||||||
|
+dnl Check for include file rpcsvc/ypclnt.h for YellowPages support.
|
||||||
|
+dnl --------------------------------------------------------------------------
|
||||||
|
+AC_DEFUN([AF_CHECK_YPCLNT_HEADER],
|
||||||
|
+[
|
||||||
|
+# save current CFLAGS
|
||||||
|
+af_check_ypclnt_header_save_cflags="$CFLAGS"
|
||||||
|
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
|
||||||
|
+
|
||||||
|
+HAVE_YPCLNT=0
|
||||||
|
+AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1)
|
||||||
|
+AC_SUBST(HAVE_YPCLNT)
|
||||||
|
+if test "$HAVE_YPCLNT" = "1"; then
|
||||||
|
+ AC_DEFINE(HAVE_YPCLNT, 1,
|
||||||
|
+ [Define if using YellowPages])
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+# restore libs
|
||||||
|
+CFLAGS="$af_check_ypclnt_header_save_cflags"
|
||||||
|
+])
|
||||||
|
+
|
||||||
|
+dnl --------------------------------------------------------------------------
|
||||||
|
+dnl AF_CHECK_NIS_HEADER
|
||||||
|
+dnl
|
||||||
|
+dnl Check for include file rpcsvc/nis.h for NIS+ support.
|
||||||
|
+dnl --------------------------------------------------------------------------
|
||||||
|
+AC_DEFUN([AF_CHECK_NIS_HEADER],
|
||||||
|
+[
|
||||||
|
+# save current CFLAGS
|
||||||
|
+af_check_nis_header_save_cflags="$CFLAGS"
|
||||||
|
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
|
||||||
|
+
|
||||||
|
+HAVE_NISPLUS=0
|
||||||
|
+AC_CHECK_HEADER([rpcsvc/nis.h], HAVE_NISPLUS=1)
|
||||||
|
+AC_SUBST(HAVE_NISPLUS)
|
||||||
|
+if test "$HAVE_NISPLUS" = "1"; then
|
||||||
|
+ AC_DEFINE(HAVE_NISPLUS, 1,
|
||||||
|
+ [Define if using NIS+])
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+# restore libs
|
||||||
|
+CFLAGS="$af_check_nis_header_save_cflags"
|
||||||
|
+])
|
||||||
|
diff --git a/configure b/configure
|
||||||
|
index 476cea4b..2d517aac 100755
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -634,8 +634,8 @@ XML_FLAGS
|
||||||
|
LIBLDAP
|
||||||
|
HAVE_LDAP
|
||||||
|
LDAP_FLAGS
|
||||||
|
-HAVE_YPCLNT
|
||||||
|
HAVE_NISPLUS
|
||||||
|
+HAVE_YPCLNT
|
||||||
|
EGREP
|
||||||
|
GREP
|
||||||
|
CPP
|
||||||
|
@@ -643,7 +643,8 @@ HESIOD_FLAGS
|
||||||
|
LIBHESIOD
|
||||||
|
HAVE_HESIOD
|
||||||
|
LIBRESOLV
|
||||||
|
-LIBNSL
|
||||||
|
+NSL_LIBS
|
||||||
|
+NSL_CFLAGS
|
||||||
|
LIBCLOCK_GETTIME
|
||||||
|
KRB5_CONFIG
|
||||||
|
XML_CONFIG
|
||||||
|
@@ -764,6 +765,8 @@ CFLAGS
|
||||||
|
LDFLAGS
|
||||||
|
LIBS
|
||||||
|
CPPFLAGS
|
||||||
|
+NSL_CFLAGS
|
||||||
|
+NSL_LIBS
|
||||||
|
CPP'
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1417,6 +1420,8 @@ Some influential environment variables:
|
||||||
|
LIBS libraries to pass to the linker, e.g. -l<library>
|
||||||
|
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
|
||||||
|
you have headers in a nonstandard directory <include dir>
|
||||||
|
+ NSL_CFLAGS C compiler flags for NSL, overriding pkg-config
|
||||||
|
+ NSL_LIBS linker flags for NSL, overriding pkg-config
|
||||||
|
CPP C preprocessor
|
||||||
|
|
||||||
|
Use these variables to override the choices made by `configure' or to help
|
||||||
|
@@ -4500,9 +4505,186 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-#
|
||||||
|
-# glibc/libc 6 new libraries
|
||||||
|
-#
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
|
||||||
|
+ if test -n "$ac_tool_prefix"; then
|
||||||
|
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
|
||||||
|
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||||
|
+$as_echo_n "checking for $ac_word... " >&6; }
|
||||||
|
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ case $PKG_CONFIG in
|
||||||
|
+ [\\/]* | ?:[\\/]*)
|
||||||
|
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
|
||||||
|
+ ;;
|
||||||
|
+ *)
|
||||||
|
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||||
|
+for as_dir in $PATH
|
||||||
|
+do
|
||||||
|
+ IFS=$as_save_IFS
|
||||||
|
+ test -z "$as_dir" && as_dir=.
|
||||||
|
+ for ac_exec_ext in '' $ac_executable_extensions; do
|
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||||
|
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
|
||||||
|
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||||
|
+ break 2
|
||||||
|
+ fi
|
||||||
|
+done
|
||||||
|
+ done
|
||||||
|
+IFS=$as_save_IFS
|
||||||
|
+
|
||||||
|
+ ;;
|
||||||
|
+esac
|
||||||
|
+fi
|
||||||
|
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
|
||||||
|
+if test -n "$PKG_CONFIG"; then
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
|
||||||
|
+$as_echo "$PKG_CONFIG" >&6; }
|
||||||
|
+else
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
+$as_echo "no" >&6; }
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+if test -z "$ac_cv_path_PKG_CONFIG"; then
|
||||||
|
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
|
||||||
|
+ # Extract the first word of "pkg-config", so it can be a program name with args.
|
||||||
|
+set dummy pkg-config; ac_word=$2
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||||
|
+$as_echo_n "checking for $ac_word... " >&6; }
|
||||||
|
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ case $ac_pt_PKG_CONFIG in
|
||||||
|
+ [\\/]* | ?:[\\/]*)
|
||||||
|
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
|
||||||
|
+ ;;
|
||||||
|
+ *)
|
||||||
|
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||||
|
+for as_dir in $PATH
|
||||||
|
+do
|
||||||
|
+ IFS=$as_save_IFS
|
||||||
|
+ test -z "$as_dir" && as_dir=.
|
||||||
|
+ for ac_exec_ext in '' $ac_executable_extensions; do
|
||||||
|
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||||
|
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
|
||||||
|
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||||
|
+ break 2
|
||||||
|
+ fi
|
||||||
|
+done
|
||||||
|
+ done
|
||||||
|
+IFS=$as_save_IFS
|
||||||
|
+
|
||||||
|
+ ;;
|
||||||
|
+esac
|
||||||
|
+fi
|
||||||
|
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
|
||||||
|
+if test -n "$ac_pt_PKG_CONFIG"; then
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
|
||||||
|
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
|
||||||
|
+else
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
+$as_echo "no" >&6; }
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+ if test "x$ac_pt_PKG_CONFIG" = x; then
|
||||||
|
+ PKG_CONFIG=""
|
||||||
|
+ else
|
||||||
|
+ case $cross_compiling:$ac_tool_warned in
|
||||||
|
+yes:)
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
|
||||||
|
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
|
||||||
|
+ac_tool_warned=yes ;;
|
||||||
|
+esac
|
||||||
|
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
|
||||||
|
+ fi
|
||||||
|
+else
|
||||||
|
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+if test -n "$PKG_CONFIG"; then
|
||||||
|
+ _pkg_min_version=0.9.0
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
|
||||||
|
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
|
||||||
|
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
+$as_echo "yes" >&6; }
|
||||||
|
+ else
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
+$as_echo "no" >&6; }
|
||||||
|
+ PKG_CONFIG=""
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+pkg_failed=no
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NSL" >&5
|
||||||
|
+$as_echo_n "checking for NSL... " >&6; }
|
||||||
|
+
|
||||||
|
+if test -n "$NSL_CFLAGS"; then
|
||||||
|
+ pkg_cv_NSL_CFLAGS="$NSL_CFLAGS"
|
||||||
|
+ elif test -n "$PKG_CONFIG"; then
|
||||||
|
+ if test -n "$PKG_CONFIG" && \
|
||||||
|
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5
|
||||||
|
+ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5
|
||||||
|
+ ac_status=$?
|
||||||
|
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
|
+ test $ac_status = 0; }; then
|
||||||
|
+ pkg_cv_NSL_CFLAGS=`$PKG_CONFIG --cflags "libnsl" 2>/dev/null`
|
||||||
|
+ test "x$?" != "x0" && pkg_failed=yes
|
||||||
|
+else
|
||||||
|
+ pkg_failed=yes
|
||||||
|
+fi
|
||||||
|
+ else
|
||||||
|
+ pkg_failed=untried
|
||||||
|
+fi
|
||||||
|
+if test -n "$NSL_LIBS"; then
|
||||||
|
+ pkg_cv_NSL_LIBS="$NSL_LIBS"
|
||||||
|
+ elif test -n "$PKG_CONFIG"; then
|
||||||
|
+ if test -n "$PKG_CONFIG" && \
|
||||||
|
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5
|
||||||
|
+ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5
|
||||||
|
+ ac_status=$?
|
||||||
|
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||||
|
+ test $ac_status = 0; }; then
|
||||||
|
+ pkg_cv_NSL_LIBS=`$PKG_CONFIG --libs "libnsl" 2>/dev/null`
|
||||||
|
+ test "x$?" != "x0" && pkg_failed=yes
|
||||||
|
+else
|
||||||
|
+ pkg_failed=yes
|
||||||
|
+fi
|
||||||
|
+ else
|
||||||
|
+ pkg_failed=untried
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+if test $pkg_failed = yes; then
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
+$as_echo "no" >&6; }
|
||||||
|
+
|
||||||
|
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||||
|
+ _pkg_short_errors_supported=yes
|
||||||
|
+else
|
||||||
|
+ _pkg_short_errors_supported=no
|
||||||
|
+fi
|
||||||
|
+ if test $_pkg_short_errors_supported = yes; then
|
||||||
|
+ NSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libnsl" 2>&1`
|
||||||
|
+ else
|
||||||
|
+ NSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libnsl" 2>&1`
|
||||||
|
+ fi
|
||||||
|
+ # Put the nasty error message in config.log where it belongs
|
||||||
|
+ echo "$NSL_PKG_ERRORS" >&5
|
||||||
|
+
|
||||||
|
+
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5
|
||||||
|
$as_echo_n "checking for yp_match in -lnsl... " >&6; }
|
||||||
|
if ${ac_cv_lib_nsl_yp_match+:} false; then :
|
||||||
|
@@ -4540,10 +4722,66 @@ fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5
|
||||||
|
$as_echo "$ac_cv_lib_nsl_yp_match" >&6; }
|
||||||
|
if test "x$ac_cv_lib_nsl_yp_match" = xyes; then :
|
||||||
|
- LIBNSL="-lnsl"
|
||||||
|
+ NSL_LIBS="-lnsl"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
+NSL_CFLAGS=""
|
||||||
|
+
|
||||||
|
+elif test $pkg_failed = untried; then
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
+$as_echo "no" >&6; }
|
||||||
|
+
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5
|
||||||
|
+$as_echo_n "checking for yp_match in -lnsl... " >&6; }
|
||||||
|
+if ${ac_cv_lib_nsl_yp_match+:} false; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ ac_check_lib_save_LIBS=$LIBS
|
||||||
|
+LIBS="-lnsl $LIBS"
|
||||||
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+
|
||||||
|
+/* Override any GCC internal prototype to avoid an error.
|
||||||
|
+ Use char because int might match the return type of a GCC
|
||||||
|
+ builtin and then its argument prototype would still apply. */
|
||||||
|
+#ifdef __cplusplus
|
||||||
|
+extern "C"
|
||||||
|
+#endif
|
||||||
|
+char yp_match ();
|
||||||
|
+int
|
||||||
|
+main ()
|
||||||
|
+{
|
||||||
|
+return yp_match ();
|
||||||
|
+ ;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_link "$LINENO"; then :
|
||||||
|
+ ac_cv_lib_nsl_yp_match=yes
|
||||||
|
+else
|
||||||
|
+ ac_cv_lib_nsl_yp_match=no
|
||||||
|
+fi
|
||||||
|
+rm -f core conftest.err conftest.$ac_objext \
|
||||||
|
+ conftest$ac_exeext conftest.$ac_ext
|
||||||
|
+LIBS=$ac_check_lib_save_LIBS
|
||||||
|
+fi
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5
|
||||||
|
+$as_echo "$ac_cv_lib_nsl_yp_match" >&6; }
|
||||||
|
+if test "x$ac_cv_lib_nsl_yp_match" = xyes; then :
|
||||||
|
+ NSL_LIBS="-lnsl"
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+NSL_CFLAGS=""
|
||||||
|
+
|
||||||
|
+else
|
||||||
|
+ NSL_CFLAGS=$pkg_cv_NSL_CFLAGS
|
||||||
|
+ NSL_LIBS=$pkg_cv_NSL_LIBS
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
+$as_echo "yes" >&6; }
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query in -lresolv" >&5
|
||||||
|
$as_echo_n "checking for res_query in -lresolv... " >&6; }
|
||||||
|
@@ -4659,8 +4897,6 @@ fi
|
||||||
|
|
||||||
|
LDFLAGS="${AF_tmp_ldflags}"
|
||||||
|
|
||||||
|
-# NIS+ support?
|
||||||
|
-HAVE_NISPLUS=0
|
||||||
|
ac_ext=c
|
||||||
|
ac_cpp='$CPP $CPPFLAGS'
|
||||||
|
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||||
|
@@ -5058,15 +5294,11 @@ fi
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
-ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default"
|
||||||
|
-if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then :
|
||||||
|
- HAVE_NISPLUS=1
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
|
||||||
|
+# save current CFLAGS
|
||||||
|
+af_check_ypclnt_header_save_cflags="$CFLAGS"
|
||||||
|
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
|
||||||
|
|
||||||
|
-
|
||||||
|
-# YellowPages support?
|
||||||
|
HAVE_YPCLNT=0
|
||||||
|
ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/ypclnt.h" "ac_cv_header_rpcsvc_ypclnt_h" "$ac_includes_default"
|
||||||
|
if test "x$ac_cv_header_rpcsvc_ypclnt_h" = xyes; then :
|
||||||
|
@@ -5081,6 +5313,32 @@ $as_echo "#define HAVE_YPCLNT 1" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
+# restore libs
|
||||||
|
+CFLAGS="$af_check_ypclnt_header_save_cflags"
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+# save current CFLAGS
|
||||||
|
+af_check_nis_header_save_cflags="$CFLAGS"
|
||||||
|
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
|
||||||
|
+
|
||||||
|
+HAVE_NISPLUS=0
|
||||||
|
+ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default"
|
||||||
|
+if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then :
|
||||||
|
+ HAVE_NISPLUS=1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+if test "$HAVE_NISPLUS" = "1"; then
|
||||||
|
+
|
||||||
|
+$as_echo "#define HAVE_NISPLUS 1" >>confdefs.h
|
||||||
|
+
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+# restore libs
|
||||||
|
+CFLAGS="$af_check_nis_header_save_cflags"
|
||||||
|
+
|
||||||
|
+
|
||||||
|
#
|
||||||
|
# OpenLDAP support? Expect that this may have a special directory...
|
||||||
|
#
|
||||||
|
diff --git a/configure.in b/configure.in
|
||||||
|
index d3660923..d74775cc 100644
|
||||||
|
--- a/configure.in
|
||||||
|
+++ b/configure.in
|
||||||
|
@@ -209,11 +209,13 @@ fi
|
||||||
|
AC_CHECK_LIB(rt, clock_gettime, LIBCLOCK_GETTIME="-lrt")
|
||||||
|
AC_SUBST(LIBCLOCK_GETTIME)
|
||||||
|
|
||||||
|
-#
|
||||||
|
-# glibc/libc 6 new libraries
|
||||||
|
-#
|
||||||
|
-AC_CHECK_LIB(nsl, yp_match, LIBNSL="-lnsl")
|
||||||
|
-AC_SUBST(LIBNSL)
|
||||||
|
+PKG_PROG_PKG_CONFIG()
|
||||||
|
+PKG_CHECK_MODULES([NSL],[libnsl],,
|
||||||
|
+[
|
||||||
|
+AC_CHECK_LIB(nsl, yp_match, NSL_LIBS="-lnsl")
|
||||||
|
+AC_SUBST(NSL_LIBS)
|
||||||
|
+NSL_CFLAGS=""
|
||||||
|
+])
|
||||||
|
|
||||||
|
AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv")
|
||||||
|
AC_SUBST(LIBRESOLV)
|
||||||
|
@@ -254,19 +256,8 @@ AC_SUBST(LIBHESIOD)
|
||||||
|
AC_SUBST(HESIOD_FLAGS)
|
||||||
|
LDFLAGS="${AF_tmp_ldflags}"
|
||||||
|
|
||||||
|
-# NIS+ support?
|
||||||
|
-HAVE_NISPLUS=0
|
||||||
|
-AC_CHECK_HEADER(rpcsvc/nis.h, HAVE_NISPLUS=1)
|
||||||
|
-AC_SUBST(HAVE_NISPLUS)
|
||||||
|
-
|
||||||
|
-# YellowPages support?
|
||||||
|
-HAVE_YPCLNT=0
|
||||||
|
-AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1)
|
||||||
|
-AC_SUBST(HAVE_YPCLNT)
|
||||||
|
-if test "$HAVE_YPCLNT" = "1"; then
|
||||||
|
- AC_DEFINE(HAVE_YPCLNT, 1,
|
||||||
|
- [Define if using YellowPages])
|
||||||
|
-fi
|
||||||
|
+AF_CHECK_YPCLNT_HEADER()
|
||||||
|
+AF_CHECK_NIS_HEADER()
|
||||||
|
|
||||||
|
#
|
||||||
|
# OpenLDAP support? Expect that this may have a special directory...
|
||||||
|
diff --git a/include/config.h.in b/include/config.h.in
|
||||||
|
index 04873e8f..991a2bda 100644
|
||||||
|
--- a/include/config.h.in
|
||||||
|
+++ b/include/config.h.in
|
||||||
|
@@ -57,6 +57,9 @@
|
||||||
|
/* define if you have MOUNT_NFS */
|
||||||
|
#undef HAVE_MOUNT_NFS
|
||||||
|
|
||||||
|
+/* Define if using NIS+ */
|
||||||
|
+#undef HAVE_NISPLUS
|
||||||
|
+
|
||||||
|
/* define if the umount command supports the -c option */
|
||||||
|
#undef HAVE_NO_CANON_UMOUNT
|
||||||
|
|
||||||
|
diff --git a/modules/Makefile b/modules/Makefile
|
||||||
|
index d9ab06c5..0447559a 100644
|
||||||
|
--- a/modules/Makefile
|
||||||
|
+++ b/modules/Makefile
|
||||||
|
@@ -116,6 +116,16 @@ parse_amd.so: parse_amd.c amd_parse.tab.o amd_tok.o
|
||||||
|
#
|
||||||
|
# Ad hoc compilation rules for modules which need auxilliary libraries
|
||||||
|
#
|
||||||
|
+lookup_yp.so: lookup_yp.c
|
||||||
|
+ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_yp.so \
|
||||||
|
+ lookup_yp.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB)
|
||||||
|
+ $(STRIP) lookup_yp.so
|
||||||
|
+
|
||||||
|
+lookup_nisplus.so: lookup_nisplus.c
|
||||||
|
+ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_nisplus.so \
|
||||||
|
+ lookup_nisplus.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB)
|
||||||
|
+ $(STRIP) lookup_nisplus.so
|
||||||
|
+
|
||||||
|
lookup_hesiod.so: lookup_hesiod.c
|
||||||
|
$(CC) $(SOLDFLAGS) $(CFLAGS) $(HESIOD_FLAGS) -o lookup_hesiod.so \
|
||||||
|
lookup_hesiod.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBHESIOD) $(LIBRESOLV) $(LIBS)
|
@ -0,0 +1,34 @@
|
|||||||
|
autofs-5.1.4 - add NULL check in prepare_attempt_prefix()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
prepare_attempt_prefix() calls calloc(3) and continues without
|
||||||
|
checking if the allocation succeeded.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/log.c | 2 ++
|
||||||
|
2 files changed, 3 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -39,6 +39,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- better handle hesiod support not built in.
|
||||||
|
- fix hesiod string check in master_parse().
|
||||||
|
- remove autofs4 module load code.
|
||||||
|
+- add NULL check in prepare_attempt_prefix().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/log.c
|
||||||
|
+++ autofs-5.1.4/lib/log.c
|
||||||
|
@@ -44,6 +44,8 @@ static char *prepare_attempt_prefix(cons
|
||||||
|
|
||||||
|
snprintf(buffer, ATTEMPT_ID_SIZE, "%02lx", *attempt_id);
|
||||||
|
prefixed_msg = (char *) calloc(len, sizeof(char));
|
||||||
|
+ if (!prefixed_msg)
|
||||||
|
+ return NULL;
|
||||||
|
strcpy(prefixed_msg, buffer);
|
||||||
|
strcat(prefixed_msg, "|");
|
||||||
|
strcat(prefixed_msg, msg);
|
@ -0,0 +1,42 @@
|
|||||||
|
autofs-5.1.4 - add an example fedfs master map entry to the installed master map
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add an example of using the fedfs program map (to facilitate access
|
||||||
|
to fedfs domain mounts) to the installed master map.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
samples/auto.master | 6 ++++++
|
||||||
|
2 files changed, 7 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index bbe8019e..f771a433 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -18,6 +18,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add mount.fedfs.c.
|
||||||
|
- add fedfs-map-nfs4.c.
|
||||||
|
- add conditional inclusion of fedfs binaries.
|
||||||
|
+- add an example fedfs master map entry to the installed master map.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/samples/auto.master b/samples/auto.master
|
||||||
|
index 0f2c8ab0..9a9968a3 100644
|
||||||
|
--- a/samples/auto.master
|
||||||
|
+++ b/samples/auto.master
|
||||||
|
@@ -17,6 +17,12 @@
|
||||||
|
#
|
||||||
|
+dir:/etc/auto.master.d
|
||||||
|
#
|
||||||
|
+# If you have fedfs set up and the related binaries, either
|
||||||
|
+# built as part of autofs or installed from another package,
|
||||||
|
+# uncomment this line to use the fedfs program map to access
|
||||||
|
+# your fedfs mounts.
|
||||||
|
+#/nfs4 /usr/sbin/fedfs-map-nfs4 nobind
|
||||||
|
+#
|
||||||
|
# Include central master map if it can be found using
|
||||||
|
# nsswitch sources.
|
||||||
|
#
|
@ -0,0 +1,184 @@
|
|||||||
|
autofs-5.1.4 - add conditional inclusion of fedfs binaries
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add conditional inclusion of the fedfs binaries.
|
||||||
|
|
||||||
|
Using configure a --with-fedfs is needed to build and install
|
||||||
|
the fedfs binaries.
|
||||||
|
|
||||||
|
Using rpmbuild -tb <autofs tar> it's necessary to add the option
|
||||||
|
--without fedfs to exclude the fedfs binaries from the resulting
|
||||||
|
rpm package.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
Makefile.conf.in | 2 ++
|
||||||
|
Makefile.rules | 6 +++++-
|
||||||
|
autofs.spec | 12 +++++++++++-
|
||||||
|
configure | 16 ++++++++++++++++
|
||||||
|
configure.in | 9 +++++++++
|
||||||
|
6 files changed, 44 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 412e3382..bbe8019e 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -17,6 +17,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add fedfs-getsrvinfo.c.
|
||||||
|
- add mount.fedfs.c.
|
||||||
|
- add fedfs-map-nfs4.c.
|
||||||
|
+- add conditional inclusion of fedfs binaries.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/Makefile.conf.in b/Makefile.conf.in
|
||||||
|
index 85662654..3fe1a0a0 100644
|
||||||
|
--- a/Makefile.conf.in
|
||||||
|
+++ b/Makefile.conf.in
|
||||||
|
@@ -58,6 +58,8 @@ EXT3FS = @HAVE_E3FSCK@
|
||||||
|
# Support for calling e4fsck when mounting ext4 filesystems
|
||||||
|
EXT4FS = @HAVE_E4FSCK@
|
||||||
|
|
||||||
|
+FEDFS = @ENABLE_FEDFS@
|
||||||
|
+
|
||||||
|
LEX = @PATH_LEX@
|
||||||
|
YACC = @PATH_YACC@
|
||||||
|
RPCGEN = @PATH_RPCGEN@
|
||||||
|
diff --git a/Makefile.rules b/Makefile.rules
|
||||||
|
index fc9f6019..2ccb1f6e 100644
|
||||||
|
--- a/Makefile.rules
|
||||||
|
+++ b/Makefile.rules
|
||||||
|
@@ -3,12 +3,16 @@
|
||||||
|
#
|
||||||
|
|
||||||
|
# Root directory contents
|
||||||
|
-SUBDIRS = lib daemon fedfs modules man
|
||||||
|
+SUBDIRS = lib daemon modules man
|
||||||
|
INCDIRS = include
|
||||||
|
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
|
||||||
|
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
|
||||||
|
configure *.patch autofs.spec
|
||||||
|
|
||||||
|
+ifeq ($(FEDFS), 1)
|
||||||
|
+ SUBDIRS += fedfs
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
# Attempt to be friends with autotools
|
||||||
|
INSTALLROOT = $(DESTDIR)
|
||||||
|
|
||||||
|
diff --git a/autofs.spec b/autofs.spec
|
||||||
|
index 157c09b4..2cb09ef0 100644
|
||||||
|
--- a/autofs.spec
|
||||||
|
+++ b/autofs.spec
|
||||||
|
@@ -16,6 +16,10 @@
|
||||||
|
# disable them.
|
||||||
|
%define with_libtirpc %{?_without_libtirpc: 0} %{?!_without_libtirpc: 1}
|
||||||
|
|
||||||
|
+# Use --without fedfs in your rpmbuild command or force values to 0 to
|
||||||
|
+# disable them.
|
||||||
|
+%define with_fedfs %{?_without_fedfs: 0} %{?!_without_fedfs: 1}
|
||||||
|
+
|
||||||
|
Summary: A tool from automatically mounting and umounting filesystems.
|
||||||
|
Name: autofs
|
||||||
|
%define version 5.1.4
|
||||||
|
@@ -82,6 +86,9 @@ echo %{version}-%{release} > .version
|
||||||
|
%if %{with_libtirpc}
|
||||||
|
%define libtirpc_configure_arg --with-libtirpc
|
||||||
|
%endif
|
||||||
|
+%if %{with_fedfs}
|
||||||
|
+ %define fedfs_configure_arg --enable-fedfs
|
||||||
|
+%endif
|
||||||
|
|
||||||
|
%build
|
||||||
|
CFLAGS="$RPM_OPT_FLAGS -Wall" \
|
||||||
|
@@ -90,7 +97,8 @@ LDFLAGS="-Wl,-z,now" \
|
||||||
|
--disable-mount-locking \
|
||||||
|
--enable-ignore-busy \
|
||||||
|
%{?systemd_configure_arg:} \
|
||||||
|
- %{?libtirpc_configure_arg:}
|
||||||
|
+ %{?libtirpc_configure_arg:} \
|
||||||
|
+ %{?fedfs_configure_arg:}
|
||||||
|
CFLAGS="$RPM_OPT_FLAGS -Wall" LDFLAGS="-Wl,-z,now" make initdir=/etc/rc.d/init.d DONTSTRIP=1
|
||||||
|
|
||||||
|
%install
|
||||||
|
@@ -191,8 +199,10 @@ fi
|
||||||
|
%config(noreplace) /etc/sysconfig/autofs
|
||||||
|
%config(noreplace) /etc/autofs_ldap_auth.conf
|
||||||
|
%{_sbindir}/automount
|
||||||
|
+%if %{with_fedfs}
|
||||||
|
%{_sbindir}/mount.fedfs
|
||||||
|
%{_sbindir}/fedfs-map-nfs4
|
||||||
|
+%endif
|
||||||
|
%dir %{_libdir}/autofs
|
||||||
|
%{_libdir}/autofs/*
|
||||||
|
%{_mandir}/*/*
|
||||||
|
diff --git a/configure b/configure
|
||||||
|
index 5c8aae30..9682b36f 100755
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -648,6 +648,7 @@ NSL_CFLAGS
|
||||||
|
LIBCLOCK_GETTIME
|
||||||
|
KRB5_CONFIG
|
||||||
|
XML_CONFIG
|
||||||
|
+ENABLE_FEDFS
|
||||||
|
sssldir
|
||||||
|
HAVE_SSS_AUTOFS
|
||||||
|
PATH_RPCGEN
|
||||||
|
@@ -743,6 +744,7 @@ with_libtirpc
|
||||||
|
with_dmalloc
|
||||||
|
enable_sloppy_mount
|
||||||
|
enable_no_canon_umount
|
||||||
|
+enable_fedfs
|
||||||
|
with_hesiod
|
||||||
|
with_openldap
|
||||||
|
with_sasl
|
||||||
|
@@ -1377,6 +1379,7 @@ Optional Features:
|
||||||
|
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
||||||
|
--enable-sloppy-mount enable the use of the -s option to mount
|
||||||
|
--enable-no-canon-umount enable the use of the -c option to umount
|
||||||
|
+ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4
|
||||||
|
--disable-ext-env disable search in environment for substitution variable
|
||||||
|
--disable-mount-locking disable use of locking when spawning mount command
|
||||||
|
--enable-force-shutdown enable USR1 signal to force unlink umount of any
|
||||||
|
@@ -4246,6 +4249,19 @@ $as_echo "#define HAVE_NO_CANON_UMOUNT 1" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
+ENABLE_FEDFS=""
|
||||||
|
+# Check whether --enable-fedfs was given.
|
||||||
|
+if test "${enable_fedfs+set}" = set; then :
|
||||||
|
+ enableval=$enable_fedfs;
|
||||||
|
+else
|
||||||
|
+ enable_fedfs=no
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if test x$enable_fedfs = xyes; then
|
||||||
|
+ ENABLE_FEDFS="1"
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+
|
||||||
|
# LDAP SASL auth needs libxml and Kerberos
|
||||||
|
for ac_prog in xml2-config
|
||||||
|
do
|
||||||
|
diff --git a/configure.in b/configure.in
|
||||||
|
index 4d1208f5..de06a96d 100644
|
||||||
|
--- a/configure.in
|
||||||
|
+++ b/configure.in
|
||||||
|
@@ -195,6 +195,15 @@ if test x$enable_no_canon_umount = xyes; then
|
||||||
|
AC_DEFINE(HAVE_NO_CANON_UMOUNT, 1, [define if the umount command supports the -c option])
|
||||||
|
fi
|
||||||
|
|
||||||
|
+ENABLE_FEDFS=""
|
||||||
|
+AC_ARG_ENABLE(fedfs,
|
||||||
|
+[ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4],,
|
||||||
|
+ enable_fedfs=no)
|
||||||
|
+if test x$enable_fedfs = xyes; then
|
||||||
|
+ ENABLE_FEDFS="1"
|
||||||
|
+fi
|
||||||
|
+AC_SUBST(ENABLE_FEDFS)
|
||||||
|
+
|
||||||
|
# LDAP SASL auth needs libxml and Kerberos
|
||||||
|
AF_CHECK_LIBXML()
|
||||||
|
AF_CHECK_KRB5()
|
121
SOURCES/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch
Normal file
121
SOURCES/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
autofs-5.1.4 - add error handling for ext_mount_add()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add error handling (memory allocation failures) for ext_mount_add().
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/mounts.c | 5 +----
|
||||||
|
modules/parse_amd.c | 42 ++++++++++++++++++++++++++++++------------
|
||||||
|
3 files changed, 32 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index d0cfa19b..9d19c0a7 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -7,6 +7,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix prefix option handling in expand_entry().
|
||||||
|
- fix sublink option not set from defaults.
|
||||||
|
- fix error return in do_nfs_mount().
|
||||||
|
+- add error handling for ext_mount_add().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/lib/mounts.c b/lib/mounts.c
|
||||||
|
index 6fa304aa..f46fab2b 100644
|
||||||
|
--- a/lib/mounts.c
|
||||||
|
+++ b/lib/mounts.c
|
||||||
|
@@ -715,15 +715,12 @@ int ext_mount_add(struct list_head *entry, const char *path, unsigned int umount
|
||||||
|
}
|
||||||
|
|
||||||
|
em = malloc(sizeof(struct ext_mount));
|
||||||
|
- if (!em) {
|
||||||
|
- ret = -1;
|
||||||
|
+ if (!em)
|
||||||
|
goto done;
|
||||||
|
- }
|
||||||
|
|
||||||
|
em->mountpoint = strdup(path);
|
||||||
|
if (!em->mountpoint) {
|
||||||
|
free(em);
|
||||||
|
- ret = -1;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
em->umount = umount;
|
||||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||||
|
index 2a5d9a30..e7debc56 100644
|
||||||
|
--- a/modules/parse_amd.c
|
||||||
|
+++ b/modules/parse_amd.c
|
||||||
|
@@ -1080,7 +1080,14 @@ static int do_generic_mount(struct autofs_point *ap, const char *name,
|
||||||
|
umount = 1;
|
||||||
|
}
|
||||||
|
/* We have an external mount */
|
||||||
|
- ext_mount_add(&entry->ext_mount, entry->fs, umount);
|
||||||
|
+ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
|
||||||
|
+ umount_ent(ap, entry->fs);
|
||||||
|
+ error(ap->logopt, MODPREFIX
|
||||||
|
+ "error: could not add external mount %s",
|
||||||
|
+ entry->fs);
|
||||||
|
+ ret = 1;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
ret = do_link_mount(ap, name, entry, flags);
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
@@ -1124,7 +1131,13 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name,
|
||||||
|
umount = 1;
|
||||||
|
}
|
||||||
|
/* We might be using an external mount */
|
||||||
|
- ext_mount_add(&entry->ext_mount, entry->fs, umount);
|
||||||
|
+ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
|
||||||
|
+ umount_ent(ap, entry->fs);
|
||||||
|
+ error(ap->logopt, MODPREFIX
|
||||||
|
+ "error: could not add external mount %s", entry->fs);
|
||||||
|
+ ret = 1;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
ret = do_link_mount(ap, name, entry, flags);
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
@@ -1309,6 +1322,9 @@ static int do_program_mount(struct autofs_point *ap,
|
||||||
|
*/
|
||||||
|
if (ext_mount_inuse(entry->fs)) {
|
||||||
|
rv = 0;
|
||||||
|
+ /* An external mount with path entry->fs exists
|
||||||
|
+ * so ext_mount_add() won't fail.
|
||||||
|
+ */
|
||||||
|
ext_mount_add(&entry->ext_mount, entry->fs, 1);
|
||||||
|
} else {
|
||||||
|
rv = mkdir_path(entry->fs, mp_mode);
|
||||||
|
@@ -1325,17 +1341,19 @@ static int do_program_mount(struct autofs_point *ap,
|
||||||
|
|
||||||
|
rv = spawnv(ap->logopt, prog, (const char * const *) argv);
|
||||||
|
if (WIFEXITED(rv) && !WEXITSTATUS(rv)) {
|
||||||
|
- rv = 0;
|
||||||
|
- ext_mount_add(&entry->ext_mount, entry->fs, 1);
|
||||||
|
- debug(ap->logopt, MODPREFIX
|
||||||
|
- "%s: mounted %s", entry->type, entry->fs);
|
||||||
|
- } else {
|
||||||
|
- if (!ext_mount_inuse(entry->fs))
|
||||||
|
- rmdir_path(ap, entry->fs, ap->dev);
|
||||||
|
- error(ap->logopt, MODPREFIX
|
||||||
|
- "%s: failed to mount using: %s",
|
||||||
|
- entry->type, entry->mount);
|
||||||
|
+ if (ext_mount_add(&entry->ext_mount, entry->fs, 1)) {
|
||||||
|
+ rv = 0;
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "%s: mounted %s", entry->type, entry->fs);
|
||||||
|
+ goto do_free;
|
||||||
|
+ }
|
||||||
|
+ umount_ent(ap, entry->fs);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (!ext_mount_inuse(entry->fs))
|
||||||
|
+ rmdir_path(ap, entry->fs, ap->dev);
|
||||||
|
+ error(ap->logopt, MODPREFIX
|
||||||
|
+ "%s: failed to mount using %s", entry->type, entry->mount);
|
||||||
|
}
|
||||||
|
do_free:
|
||||||
|
free_argv(argc, (const char **) argv);
|
402
SOURCES/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch
Normal file
402
SOURCES/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch
Normal file
@ -0,0 +1,402 @@
|
|||||||
|
autofs-5.1.4 - add fedfs-getsrvinfo.c
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add the fedfs domain information discovery library functions.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
fedfs/fedfs-getsrvinfo.c | 311 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
fedfs/fedfs-getsrvinfo.h | 52 ++++++++
|
||||||
|
3 files changed, 364 insertions(+)
|
||||||
|
create mode 100644 fedfs/fedfs-getsrvinfo.c
|
||||||
|
create mode 100644 fedfs/fedfs-getsrvinfo.h
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index dbfb8389..8d6c737c 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -14,6 +14,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- Makefiles.rules: remove 'samples' from SUBDIRS.
|
||||||
|
- dont allow trailing slash in master map mount points.
|
||||||
|
- fix libresolv configure check.
|
||||||
|
+- add fedfs-getsrvinfo.c.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/fedfs/fedfs-getsrvinfo.c b/fedfs/fedfs-getsrvinfo.c
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..02ad16b5
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/fedfs/fedfs-getsrvinfo.c
|
||||||
|
@@ -0,0 +1,311 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright 2011 Oracle. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This file is part of fedfs-utils.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License version 2.0 as
|
||||||
|
+ * published by the Free Software Foundation.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
||||||
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License version 2.0 for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * version 2.0 along with fedfs-utils. If not, see:
|
||||||
|
+ *
|
||||||
|
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifdef HAVE_CONFIG_H
|
||||||
|
+#include <config.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#include <sys/types.h>
|
||||||
|
+#include <sys/socket.h>
|
||||||
|
+
|
||||||
|
+#include <stdbool.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <stdint.h>
|
||||||
|
+
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <netdb.h>
|
||||||
|
+#include <netinet/in.h>
|
||||||
|
+#include <arpa/inet.h>
|
||||||
|
+#include <arpa/nameser.h>
|
||||||
|
+#include <arpa/nameser_compat.h>
|
||||||
|
+#include <resolv.h>
|
||||||
|
+
|
||||||
|
+#include "fedfs-getsrvinfo.h"
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Parsing overlay for DNS query result record header. Fields are
|
||||||
|
+ * in network byte order.
|
||||||
|
+ */
|
||||||
|
+struct rechdr {
|
||||||
|
+ uint16_t type;
|
||||||
|
+ uint16_t class;
|
||||||
|
+ uint32_t ttl;
|
||||||
|
+ uint16_t length;
|
||||||
|
+} __attribute__((__packed__));
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Parsing overlay for DNS query result SRV record data. Fields
|
||||||
|
+ * are in network byte order.
|
||||||
|
+ */
|
||||||
|
+struct srv {
|
||||||
|
+ uint16_t priority;
|
||||||
|
+ uint16_t weight;
|
||||||
|
+ uint16_t port;
|
||||||
|
+ unsigned char *target;
|
||||||
|
+} __attribute__((__packed__));
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Return C string matching error value of "status"
|
||||||
|
+ *
|
||||||
|
+ * @param status error status returned by getsrvinfo
|
||||||
|
+ * @return pointer to static NUL-terminated C string containing error message
|
||||||
|
+ */
|
||||||
|
+const char *
|
||||||
|
+gsi_strerror(int status)
|
||||||
|
+{
|
||||||
|
+ static char buf[256];
|
||||||
|
+
|
||||||
|
+ switch (status) {
|
||||||
|
+ case ESI_SUCCESS:
|
||||||
|
+ return "Success";
|
||||||
|
+ case ESI_NONAME:
|
||||||
|
+ return "Name not found";
|
||||||
|
+ case ESI_AGAIN:
|
||||||
|
+ return "Temporary failure in name resolution";
|
||||||
|
+ case ESI_FAIL:
|
||||||
|
+ return "Non-recoverable failure in name resolution";
|
||||||
|
+ case ESI_NODATA:
|
||||||
|
+ return "No SRV record returned";
|
||||||
|
+ case ESI_SERVICE:
|
||||||
|
+ return "Service is not available";
|
||||||
|
+ case ESI_MEMORY:
|
||||||
|
+ return "Memory allocation failure";
|
||||||
|
+ case ESI_SYSTEM:
|
||||||
|
+ snprintf(buf, sizeof(buf), "System error (%d): %s",
|
||||||
|
+ status, strerror(errno));
|
||||||
|
+ return buf;
|
||||||
|
+ case ESI_PARSE:
|
||||||
|
+ return "Failed to parse server response";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ snprintf(buf, sizeof(buf), "Unknown error (%d)", status);
|
||||||
|
+ return buf;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Release a list of SRV records allocated by getsrvinfo()
|
||||||
|
+ *
|
||||||
|
+ * @param si pointer to first element of a list of struct srvinfo
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+void freesrvinfo(struct srvinfo *si)
|
||||||
|
+{
|
||||||
|
+ struct srvinfo *tmp;
|
||||||
|
+
|
||||||
|
+ while (si != NULL) {
|
||||||
|
+ tmp = si;
|
||||||
|
+ si = si->si_next;
|
||||||
|
+ free(tmp->si_target);
|
||||||
|
+ free(tmp);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Ordering predicate for srvinfo lists
|
||||||
|
+ *
|
||||||
|
+ * @param a a srvinfo list element to compare
|
||||||
|
+ * @param b another srvinfo list element to compare
|
||||||
|
+ * @return true if "b" should fall later in the list than "a"
|
||||||
|
+ *
|
||||||
|
+ * See RFC 2782. The list is ordered as follows:
|
||||||
|
+ *
|
||||||
|
+ * o Lowest priority first.
|
||||||
|
+ * o In each priority class, highest weight first.
|
||||||
|
+ */
|
||||||
|
+static _Bool
|
||||||
|
+srvinfo_is_after(const struct srvinfo *a, const struct srvinfo *b)
|
||||||
|
+{
|
||||||
|
+ if (a->si_priority > b->si_priority)
|
||||||
|
+ return true;
|
||||||
|
+ if (a->si_priority < b->si_priority)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ if (a->si_weight < b->si_weight)
|
||||||
|
+ return true;
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Insert a srvinfo element into a list
|
||||||
|
+ *
|
||||||
|
+ * @param head pointer to head of list of elements
|
||||||
|
+ * @param entry new list element to insert
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+static void
|
||||||
|
+insert_srvinfo(struct srvinfo **head, struct srvinfo *entry)
|
||||||
|
+{
|
||||||
|
+ entry->si_next = *head;
|
||||||
|
+ *head = entry;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Insert a srvinfo element into a list, in order
|
||||||
|
+ *
|
||||||
|
+ * @param head pointer to head of list of elements
|
||||||
|
+ * @param entry new list element to insert
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+static void
|
||||||
|
+insert_srvinfo_sorted(struct srvinfo **head, struct srvinfo *entry)
|
||||||
|
+{
|
||||||
|
+ struct srvinfo *spot, *back;
|
||||||
|
+
|
||||||
|
+ spot = *head;
|
||||||
|
+ back = NULL;
|
||||||
|
+ while (spot && srvinfo_is_after(spot, entry)) {
|
||||||
|
+ back = spot;
|
||||||
|
+ spot = spot->si_next;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (spot == (*head))
|
||||||
|
+ insert_srvinfo(head, entry);
|
||||||
|
+ else {
|
||||||
|
+ insert_srvinfo(&spot, entry);
|
||||||
|
+ /* off the end of the list? */
|
||||||
|
+ if (spot == entry)
|
||||||
|
+ back->si_next = entry;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Retrieve list of SRV records from DNS service
|
||||||
|
+ *
|
||||||
|
+ * @param srvname NUL-terminated C string containing record type to look up
|
||||||
|
+ * @param domainname NUL-terminated C string containing domain name to look up
|
||||||
|
+ * @param si OUT: list of SRV record information retrieved
|
||||||
|
+ * @return zero on success, or an ESI_ status code describing the error
|
||||||
|
+ *
|
||||||
|
+ * Caller must free list of records using freesrvinfo().
|
||||||
|
+ */
|
||||||
|
+int
|
||||||
|
+getsrvinfo(const char *srvname, const char *domainname, struct srvinfo **si)
|
||||||
|
+{
|
||||||
|
+ unsigned char *msg, *eom, *comp_dn;
|
||||||
|
+ struct srvinfo *results;
|
||||||
|
+ unsigned short count, i;
|
||||||
|
+ int status, len;
|
||||||
|
+ char *exp_dn;
|
||||||
|
+ HEADER *hdr;
|
||||||
|
+
|
||||||
|
+ msg = calloc(1, NS_MAXMSG);
|
||||||
|
+ exp_dn = calloc(1, NS_MAXDNAME);
|
||||||
|
+ if (msg == NULL || exp_dn == NULL) {
|
||||||
|
+ status = ESI_MEMORY;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ _res.options |= RES_AAONLY;
|
||||||
|
+ len = res_querydomain(srvname, domainname, C_IN, T_SRV, msg, NS_MAXMSG);
|
||||||
|
+ if (len == -1) {
|
||||||
|
+ switch (h_errno) {
|
||||||
|
+ case HOST_NOT_FOUND:
|
||||||
|
+ status = ESI_NONAME;
|
||||||
|
+ break;
|
||||||
|
+ case TRY_AGAIN:
|
||||||
|
+ status = ESI_AGAIN;
|
||||||
|
+ break;
|
||||||
|
+ case NO_RECOVERY:
|
||||||
|
+ status = ESI_FAIL;
|
||||||
|
+ break;
|
||||||
|
+ case NO_DATA:
|
||||||
|
+ status = ESI_NODATA;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ fprintf(stderr, "SRV query failed for %s.%s: %s\n",
|
||||||
|
+ srvname, domainname, hstrerror(h_errno));
|
||||||
|
+ status = ESI_FAIL;
|
||||||
|
+ }
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ hdr = (HEADER *)msg;
|
||||||
|
+ count = ntohs(hdr->ancount);
|
||||||
|
+ if (count == 0) {
|
||||||
|
+ status = ESI_NODATA;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ eom = msg + len;
|
||||||
|
+
|
||||||
|
+ comp_dn = &msg[HFIXEDSZ];
|
||||||
|
+ comp_dn += dn_skipname(comp_dn, eom) + QFIXEDSZ;
|
||||||
|
+
|
||||||
|
+ results = NULL;
|
||||||
|
+ for (i = 0; i < count; i++) {
|
||||||
|
+ struct srvinfo *new;
|
||||||
|
+ struct srv *record;
|
||||||
|
+ int l;
|
||||||
|
+
|
||||||
|
+ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME);
|
||||||
|
+ if (l == -1) {
|
||||||
|
+ status = ESI_PARSE;
|
||||||
|
+ goto out_free;
|
||||||
|
+ }
|
||||||
|
+ comp_dn += l;
|
||||||
|
+
|
||||||
|
+ record = (struct srv *)&comp_dn[10];
|
||||||
|
+ comp_dn += 16;
|
||||||
|
+
|
||||||
|
+ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME);
|
||||||
|
+ if (l == -1) {
|
||||||
|
+ status = ESI_PARSE;
|
||||||
|
+ goto out_free;
|
||||||
|
+ }
|
||||||
|
+ comp_dn += l;
|
||||||
|
+
|
||||||
|
+ if (count == 1 && strcmp(exp_dn, ".") == 0) {
|
||||||
|
+ status = ESI_SERVICE;
|
||||||
|
+ goto out_free;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ new = calloc(1, sizeof(*new));
|
||||||
|
+ if (new == NULL) {
|
||||||
|
+ status = ESI_MEMORY;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ new->si_target = strdup(exp_dn);
|
||||||
|
+ if (new->si_target == NULL) {
|
||||||
|
+ free(new);
|
||||||
|
+ status = ESI_MEMORY;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ new->si_priority = ntohs(record->priority);
|
||||||
|
+ new->si_weight = ntohs(record->weight);
|
||||||
|
+ new->si_port = ntohs(record->port);
|
||||||
|
+
|
||||||
|
+ insert_srvinfo_sorted(&results, new);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ status = ESI_SUCCESS;
|
||||||
|
+ *si = results;
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ free(exp_dn);
|
||||||
|
+ free(msg);
|
||||||
|
+ return status;
|
||||||
|
+
|
||||||
|
+out_free:
|
||||||
|
+ freesrvinfo(results);
|
||||||
|
+ goto out;
|
||||||
|
+}
|
||||||
|
diff --git a/fedfs/fedfs-getsrvinfo.h b/fedfs/fedfs-getsrvinfo.h
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..13170359
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/fedfs/fedfs-getsrvinfo.h
|
||||||
|
@@ -0,0 +1,52 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright 2011 Oracle. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This file is part of fedfs-utils.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License version 2.0 as
|
||||||
|
+ * published by the Free Software Foundation.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
||||||
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License version 2.0 for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * version 2.0 along with fedfs-utils. If not, see:
|
||||||
|
+ *
|
||||||
|
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _FEDFS_GETSRVINFO_H_
|
||||||
|
+#define _FEDFS_GETSRVINFO_H_
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Single list element containing SRV record data
|
||||||
|
+ */
|
||||||
|
+struct srvinfo {
|
||||||
|
+ struct srvinfo *si_next;
|
||||||
|
+ char *si_target;
|
||||||
|
+ unsigned short si_priority;
|
||||||
|
+ unsigned short si_weight;
|
||||||
|
+ unsigned short si_port;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+enum {
|
||||||
|
+ ESI_SUCCESS = 0,
|
||||||
|
+ ESI_NONAME = -2,
|
||||||
|
+ ESI_AGAIN = -3,
|
||||||
|
+ ESI_FAIL = -4,
|
||||||
|
+ ESI_NODATA = -5,
|
||||||
|
+ ESI_SERVICE = -8,
|
||||||
|
+ ESI_MEMORY = -10,
|
||||||
|
+ ESI_SYSTEM = -11,
|
||||||
|
+ ESI_PARSE = -1000,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+int getsrvinfo(const char *srvname, const char *domainname,
|
||||||
|
+ struct srvinfo **si);
|
||||||
|
+void freesrvinfo(struct srvinfo *si);
|
||||||
|
+const char *gsi_strerror(int status);
|
||||||
|
+
|
||||||
|
+#endif /* !_FEDFS_GETSRVINFO_H_ */
|
342
SOURCES/autofs-5.1.4-add-fedfs-map-nfs4_c.patch
Normal file
342
SOURCES/autofs-5.1.4-add-fedfs-map-nfs4_c.patch
Normal file
@ -0,0 +1,342 @@
|
|||||||
|
autofs-5.1.4 - add fedfs-map-nfs4.c
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add build (and install) of the fedfs program map, fedfs-map-nfs4.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
autofs.spec | 1
|
||||||
|
fedfs/Makefile | 12 ++-
|
||||||
|
fedfs/fedfs-map-nfs4.c | 204 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
fedfs/fedfs-token.h | 40 +++++++++
|
||||||
|
5 files changed, 256 insertions(+), 2 deletions(-)
|
||||||
|
create mode 100644 fedfs/fedfs-map-nfs4.c
|
||||||
|
create mode 100644 fedfs/fedfs-token.h
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 88992147..412e3382 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -16,6 +16,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix libresolv configure check.
|
||||||
|
- add fedfs-getsrvinfo.c.
|
||||||
|
- add mount.fedfs.c.
|
||||||
|
+- add fedfs-map-nfs4.c.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/autofs.spec b/autofs.spec
|
||||||
|
index 2cc0e38f..157c09b4 100644
|
||||||
|
--- a/autofs.spec
|
||||||
|
+++ b/autofs.spec
|
||||||
|
@@ -192,6 +192,7 @@ fi
|
||||||
|
%config(noreplace) /etc/autofs_ldap_auth.conf
|
||||||
|
%{_sbindir}/automount
|
||||||
|
%{_sbindir}/mount.fedfs
|
||||||
|
+%{_sbindir}/fedfs-map-nfs4
|
||||||
|
%dir %{_libdir}/autofs
|
||||||
|
%{_libdir}/autofs/*
|
||||||
|
%{_mandir}/*/*
|
||||||
|
diff --git a/fedfs/Makefile b/fedfs/Makefile
|
||||||
|
index cb325bed..dff749e4 100644
|
||||||
|
--- a/fedfs/Makefile
|
||||||
|
+++ b/fedfs/Makefile
|
||||||
|
@@ -6,11 +6,13 @@
|
||||||
|
include ../Makefile.rules
|
||||||
|
|
||||||
|
SRCS = mount.fedfs.c
|
||||||
|
-HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h
|
||||||
|
+HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h \
|
||||||
|
+ fedfs-token.h
|
||||||
|
|
||||||
|
fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o
|
||||||
|
|
||||||
|
mount_fedfs_OBJ = mount.fedfs.o
|
||||||
|
+fedfs-map-nfs4_OBJ = fedfs-map-nfs4.o
|
||||||
|
|
||||||
|
version := $(shell cat ../.version)
|
||||||
|
|
||||||
|
@@ -18,18 +20,24 @@ CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include
|
||||||
|
CFLAGS += -DVERSION_STRING=\"$(version)\"
|
||||||
|
LDFLAGS += -rdynamic
|
||||||
|
|
||||||
|
-all: mount.fedfs
|
||||||
|
+all: mount.fedfs fedfs-map-nfs4
|
||||||
|
|
||||||
|
mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
|
||||||
|
$(CC) -o mount.fedfs \
|
||||||
|
$(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \
|
||||||
|
$(LDFLAGS) $(LIBRESOLV) $(LIBS)
|
||||||
|
|
||||||
|
+fedfs-map-nfs4: $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
|
||||||
|
+ $(CC) -o fedfs-map-nfs4 \
|
||||||
|
+ $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) \
|
||||||
|
+ $(LDFLAGS) $(LIBRESOLV) $(LIBS)
|
||||||
|
+
|
||||||
|
clean:
|
||||||
|
rm -f *.o *.s *~ mount.fedfs
|
||||||
|
|
||||||
|
install: all
|
||||||
|
install -d -m 755 $(INSTALLROOT)$(sbindir)
|
||||||
|
+ install -c fedfs-map-nfs4 -m 755 $(INSTALLROOT)$(sbindir); \
|
||||||
|
if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \
|
||||||
|
then \
|
||||||
|
install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \
|
||||||
|
diff --git a/fedfs/fedfs-map-nfs4.c b/fedfs/fedfs-map-nfs4.c
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..9f831cd7
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/fedfs/fedfs-map-nfs4.c
|
||||||
|
@@ -0,0 +1,204 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright 2011 Oracle. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This file is part of fedfs-utils.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License version 2.0 as
|
||||||
|
+ * published by the Free Software Foundation.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
||||||
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License version 2.0 for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * version 2.0 along with fedfs-utils. If not, see:
|
||||||
|
+ *
|
||||||
|
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifdef HAVE_CONFIG_H
|
||||||
|
+#include <config.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#include <sys/types.h>
|
||||||
|
+#include <sys/stat.h>
|
||||||
|
+#include <sys/socket.h>
|
||||||
|
+#include <sys/mount.h>
|
||||||
|
+#include <sys/wait.h>
|
||||||
|
+
|
||||||
|
+#include <stdbool.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <libgen.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <getopt.h>
|
||||||
|
+#include <locale.h>
|
||||||
|
+#include <netdb.h>
|
||||||
|
+#include <langinfo.h>
|
||||||
|
+
|
||||||
|
+#include "fedfs-nls.h"
|
||||||
|
+#include "fedfs-token.h"
|
||||||
|
+#include "fedfs-getsrvinfo.h"
|
||||||
|
+#include "fedfs-gpl-boiler.h"
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Name of SRV record containing NFSv4 FedFS root
|
||||||
|
+ */
|
||||||
|
+#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp"
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Export pathname of NFSv4 FedFS root
|
||||||
|
+ */
|
||||||
|
+#define FEDFS_NFS_EXPORTPATH "/.domainroot"
|
||||||
|
+
|
||||||
|
+static char *progname;
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Display usage message
|
||||||
|
+ */
|
||||||
|
+static void
|
||||||
|
+fedfs_map_usage(void)
|
||||||
|
+{
|
||||||
|
+ printf(_("\nUsage: %s [domain]\n\n"), progname);
|
||||||
|
+
|
||||||
|
+ printf("%s", fedfs_gpl_boilerplate);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Construct an NFSv4 map entry for "domainname" with one server
|
||||||
|
+ *
|
||||||
|
+ * @param si single-entry list of SRV records
|
||||||
|
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
|
||||||
|
+ * @return command exit status
|
||||||
|
+ */
|
||||||
|
+static int fedfs_map_nfs4_oneserver(struct srvinfo *si, const char *domainname)
|
||||||
|
+{
|
||||||
|
+ printf("-fstype=nfs,vers=4,fg");
|
||||||
|
+ if (si->si_port != 2049)
|
||||||
|
+ printf(",port=%u", si->si_port);
|
||||||
|
+ printf(" %s:%s/%s\n", si->si_target, FEDFS_NFS_EXPORTPATH, domainname);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Construct an NFSv4 map entry for "domainname" with multiple servers
|
||||||
|
+ *
|
||||||
|
+ * @param si list of SRV records for requested FedFS domain
|
||||||
|
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
|
||||||
|
+ * @return command exit status
|
||||||
|
+ */
|
||||||
|
+static int fedfs_map_nfs4_replicas(struct srvinfo *si, const char *domainname)
|
||||||
|
+{
|
||||||
|
+ struct srvinfo *cur;
|
||||||
|
+ unsigned short port;
|
||||||
|
+ _Bool comma;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Unfortunately our automounter can't handle a list of
|
||||||
|
+ * replicas where the various servers live on different
|
||||||
|
+ * ports from one another.
|
||||||
|
+ */
|
||||||
|
+ port = si->si_port;
|
||||||
|
+ for (cur = si; cur != NULL; cur = cur->si_next)
|
||||||
|
+ if (cur->si_port != port) {
|
||||||
|
+ fprintf(stderr, _("%s: Replicas on different ports not supported\n"),
|
||||||
|
+ progname);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (port != 2049)
|
||||||
|
+ printf("-fstype=nfs,vers=4,fg,port=%u ", port);
|
||||||
|
+ else
|
||||||
|
+ printf("-fstype=nfs,vers=4,fg ");
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Note that the export path is required to be indentical
|
||||||
|
+ * for all domain root servers for this domain.
|
||||||
|
+ */
|
||||||
|
+ for (comma = false, cur = si; cur != NULL; cur = cur->si_next) {
|
||||||
|
+ if (comma)
|
||||||
|
+ printf(",");
|
||||||
|
+ printf("%s(%u)", cur->si_target, cur->si_weight);
|
||||||
|
+ comma = true;
|
||||||
|
+ }
|
||||||
|
+ printf(":%s/%s\n", FEDFS_NFS_EXPORTPATH, domainname);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Construct an NFSv4 map entry for "domainname"
|
||||||
|
+ *
|
||||||
|
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
|
||||||
|
+ * @return command exit status
|
||||||
|
+ */
|
||||||
|
+static int fedfs_map_nfs4(const char *domainname)
|
||||||
|
+{
|
||||||
|
+ struct srvinfo *cur, *si = NULL;
|
||||||
|
+ unsigned int count;
|
||||||
|
+ int error, result;
|
||||||
|
+
|
||||||
|
+ result = 1;
|
||||||
|
+ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si);
|
||||||
|
+ switch (error) {
|
||||||
|
+ case ESI_SUCCESS:
|
||||||
|
+ break;
|
||||||
|
+ case ESI_NONAME:
|
||||||
|
+ fprintf(stderr, _("%s: Domain name %s not found\n"),
|
||||||
|
+ progname, domainname);
|
||||||
|
+ goto out;
|
||||||
|
+ case ESI_SERVICE:
|
||||||
|
+ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"),
|
||||||
|
+ progname, domainname);
|
||||||
|
+ goto out;
|
||||||
|
+ default:
|
||||||
|
+ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"),
|
||||||
|
+ progname, domainname, gsi_strerror(error));
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (count = 0, cur = si; cur != NULL; cur = cur->si_next)
|
||||||
|
+ count++;
|
||||||
|
+ if (count == 1)
|
||||||
|
+ result = fedfs_map_nfs4_oneserver(si, domainname);
|
||||||
|
+ else
|
||||||
|
+ result = fedfs_map_nfs4_replicas(si, domainname);
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ freesrvinfo(si);
|
||||||
|
+ return result;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Program entry point
|
||||||
|
+ *
|
||||||
|
+ * @param argc count of command line arguments
|
||||||
|
+ * @param argv array of NUL-terminated C strings containing command line arguments
|
||||||
|
+ * @return program exit status
|
||||||
|
+ */
|
||||||
|
+int main(int argc, char *argv[])
|
||||||
|
+{
|
||||||
|
+ (void)setlocale(LC_ALL, "");
|
||||||
|
+
|
||||||
|
+ progname = basename(argv[0]);
|
||||||
|
+
|
||||||
|
+ if (argc != 2) {
|
||||||
|
+ fedfs_map_usage();
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (strcmp(progname, "fedfs-map-nfs4") == 0)
|
||||||
|
+ return fedfs_map_nfs4(argv[1]);
|
||||||
|
+#ifdef EXAMPLE
|
||||||
|
+ /* CIFS support might plug in here */
|
||||||
|
+ else if (strcmp(progname, "fedfs-map-cifs") == 0)
|
||||||
|
+ return fedfs_map_cifs(argv[1]);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+ fprintf(stderr, _("%s: Unsupported file system type\n"), progname);
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
diff --git a/fedfs/fedfs-token.h b/fedfs/fedfs-token.h
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..5651409d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/fedfs/fedfs-token.h
|
||||||
|
@@ -0,0 +1,40 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright (C) 2007 Oracle. All rights reserved.
|
||||||
|
+ * Copyright (C) 2007 Chuck Lever <chuck.lever@oracle.com>
|
||||||
|
+ *
|
||||||
|
+ * This file is part of fedfs-utils.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License version 2.0 as
|
||||||
|
+ * published by the Free Software Foundation.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
||||||
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License version 2.0 for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * version 2.0 along with fedfs-utils. If not, see:
|
||||||
|
+ *
|
||||||
|
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _FEDFS_UTILS_TOKEN_H
|
||||||
|
+#define _FEDFS_UTILS_TOKEN_H
|
||||||
|
+
|
||||||
|
+#include <sys/cdefs.h>
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Private tokenizer state object
|
||||||
|
+ */
|
||||||
|
+struct tokenizer;
|
||||||
|
+
|
||||||
|
+__attribute_malloc__
|
||||||
|
+struct tokenizer *tk_new_tokenizer(const char *string,
|
||||||
|
+ const char delimiter);
|
||||||
|
+__attribute_malloc__
|
||||||
|
+char *tk_next_token(struct tokenizer *state);
|
||||||
|
+void tk_free_tokenizer(struct tokenizer *state);
|
||||||
|
+int tk_tokenizer_error(const struct tokenizer *state);
|
||||||
|
+
|
||||||
|
+#endif /* !_FEDFS_UTILS_TOKEN_H */
|
@ -0,0 +1,40 @@
|
|||||||
|
autofs-5.1.4 - add-man page note about extra slashes in paths
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Make note of the effect unnecessary multiple slashes can have in map
|
||||||
|
paths in auto.master(5).
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
man/auto.master.5.in | 8 ++++++++
|
||||||
|
2 files changed, 9 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -25,6 +25,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use systemd sd_notify() at startup.
|
||||||
|
- fix NFS version mask usage.
|
||||||
|
- fix fd leak in rpc_do_create_client().
|
||||||
|
+- add-man page note about extra slashes in paths.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/man/auto.master.5.in
|
||||||
|
+++ autofs-5.1.4/man/auto.master.5.in
|
||||||
|
@@ -66,6 +66,14 @@ will process the map according to the sp
|
||||||
|
map entries. Indirect map entries must be unique in the master map so
|
||||||
|
second and subsequent entries for an indirect mount point are ignored by
|
||||||
|
.BR automount (8).
|
||||||
|
+.TP
|
||||||
|
+.B NOTE:
|
||||||
|
+autofs currently does not collapse multiple slashes in paths, so it is
|
||||||
|
+important to ensure paths used in maps are correct. If unnecessary multiple
|
||||||
|
+slashes are present in a path it can lead to unexpected failures such as
|
||||||
|
+an inability to expire automounts. An exception to this is a trailing slash
|
||||||
|
+at the end of the automount point path in the master map which will be
|
||||||
|
+removed if present.
|
||||||
|
.SH "FORMAT"
|
||||||
|
Master map entries have three fields separated by an arbitrary number
|
||||||
|
of spaces or tabs. Lines beginning with # are comments. The first field
|
@ -0,0 +1,179 @@
|
|||||||
|
autofs-5.1.4 - add master map pseudo options for mount propagation
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add master map entry pseudo mount option of "slave" or "private" to
|
||||||
|
allow mount propagation of bind mounts to be set to either "slave" or
|
||||||
|
"private".
|
||||||
|
|
||||||
|
This option may be needed when using multi-mounts that have bind mounts
|
||||||
|
that bind to a file system that is propagation shared. This is becuase
|
||||||
|
the bind mount will have the same properties as its target which causes
|
||||||
|
problems for offset mounts. When this happens an unwanted offset mount
|
||||||
|
is propagated back to the target file system resulting in a deadlock
|
||||||
|
when attempting to access the offset.
|
||||||
|
|
||||||
|
By default bind mounts will inherit the mount propagation of the target
|
||||||
|
file system.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
include/automount.h | 4 ++++
|
||||||
|
lib/master_parse.y | 13 +++++++++++++
|
||||||
|
lib/master_tok.l | 2 ++
|
||||||
|
man/auto.master.5.in | 12 ++++++++++++
|
||||||
|
modules/mount_bind.c | 30 +++++++++++++++++++-----------
|
||||||
|
6 files changed, 51 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -31,6 +31,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix update_negative_cache() map source usage.
|
||||||
|
- mark removed cache entry negative.
|
||||||
|
- set bind mount as propagation slave.
|
||||||
|
+- add master map pseudo options for mount propagation.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -549,6 +549,10 @@ struct kernel_mod_version {
|
||||||
|
/* Read amd map even if it's not to be ghosted (browsable) */
|
||||||
|
#define MOUNT_FLAG_AMD_CACHE_ALL 0x0080
|
||||||
|
|
||||||
|
+/* Set mount propagation for bind mounts */
|
||||||
|
+#define MOUNT_FLAG_SLAVE 0x0100
|
||||||
|
+#define MOUNT_FLAG_PRIVATE 0x0200
|
||||||
|
+
|
||||||
|
struct autofs_point {
|
||||||
|
pthread_t thid;
|
||||||
|
char *path; /* Mount point name */
|
||||||
|
--- autofs-5.1.4.orig/lib/master_parse.y
|
||||||
|
+++ autofs-5.1.4/lib/master_parse.y
|
||||||
|
@@ -58,6 +58,8 @@ static char *format;
|
||||||
|
static long timeout;
|
||||||
|
static long negative_timeout;
|
||||||
|
static unsigned symlnk;
|
||||||
|
+static unsigned slave;
|
||||||
|
+static unsigned private;
|
||||||
|
static unsigned nobind;
|
||||||
|
static unsigned ghost;
|
||||||
|
extern unsigned global_selection_options;
|
||||||
|
@@ -103,6 +105,7 @@ static int master_fprintf(FILE *, char *
|
||||||
|
%token MAP
|
||||||
|
%token OPT_TIMEOUT OPT_NTIMEOUT OPT_NOBIND OPT_NOGHOST OPT_GHOST OPT_VERBOSE
|
||||||
|
%token OPT_DEBUG OPT_RANDOM OPT_USE_WEIGHT OPT_SYMLINK OPT_MODE
|
||||||
|
+%token OPT_SLAVE OPT_PRIVATE
|
||||||
|
%token COLON COMMA NL DDASH
|
||||||
|
%type <strtype> map
|
||||||
|
%type <strtype> options
|
||||||
|
@@ -196,6 +199,8 @@ line:
|
||||||
|
| PATH OPT_DEBUG { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_SYMLINK { master_notify($1); YYABORT; }
|
||||||
|
+ | PATH OPT_SLAVE { master_notify($1); YYABORT; }
|
||||||
|
+ | PATH OPT_PRIVATE { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_NOBIND { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_GHOST { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_NOGHOST { master_notify($1); YYABORT; }
|
||||||
|
@@ -600,6 +605,8 @@ option: daemon_option
|
||||||
|
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; }
|
||||||
|
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; }
|
||||||
|
| OPT_SYMLINK { symlnk = 1; }
|
||||||
|
+ | OPT_SLAVE { slave = 1; }
|
||||||
|
+ | OPT_PRIVATE { private = 1; }
|
||||||
|
| OPT_NOBIND { nobind = 1; }
|
||||||
|
| OPT_NOGHOST { ghost = 0; }
|
||||||
|
| OPT_GHOST { ghost = 1; }
|
||||||
|
@@ -672,6 +679,8 @@ static void local_init_vars(void)
|
||||||
|
timeout = -1;
|
||||||
|
negative_timeout = 0;
|
||||||
|
symlnk = 0;
|
||||||
|
+ slave = 0;
|
||||||
|
+ private = 0;
|
||||||
|
nobind = 0;
|
||||||
|
ghost = defaults_get_browse_mode();
|
||||||
|
random_selection = global_selection_options & MOUNT_FLAG_RANDOM_SELECT;
|
||||||
|
@@ -878,6 +887,10 @@ int master_parse_entry(const char *buffe
|
||||||
|
entry->ap->flags |= MOUNT_FLAG_USE_WEIGHT_ONLY;
|
||||||
|
if (symlnk)
|
||||||
|
entry->ap->flags |= MOUNT_FLAG_SYMLINK;
|
||||||
|
+ if (slave)
|
||||||
|
+ entry->ap->flags |= MOUNT_FLAG_SLAVE;
|
||||||
|
+ if (private)
|
||||||
|
+ entry->ap->flags |= MOUNT_FLAG_PRIVATE;
|
||||||
|
if (negative_timeout)
|
||||||
|
entry->ap->negative_timeout = negative_timeout;
|
||||||
|
if (mode && mode < LONG_MAX)
|
||||||
|
--- autofs-5.1.4.orig/lib/master_tok.l
|
||||||
|
+++ autofs-5.1.4/lib/master_tok.l
|
||||||
|
@@ -389,6 +389,8 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTW
|
||||||
|
-?symlink { return(OPT_SYMLINK); }
|
||||||
|
-?nobind { return(OPT_NOBIND); }
|
||||||
|
-?nobrowse { return(OPT_NOGHOST); }
|
||||||
|
+ -?slave { return(OPT_SLAVE); }
|
||||||
|
+ -?private { return(OPT_PRIVATE); }
|
||||||
|
-g|--ghost|-?browse { return(OPT_GHOST); }
|
||||||
|
-v|--verbose { return(OPT_VERBOSE); }
|
||||||
|
-d|--debug { return(OPT_DEBUG); }
|
||||||
|
--- autofs-5.1.4.orig/man/auto.master.5.in
|
||||||
|
+++ autofs-5.1.4/man/auto.master.5.in
|
||||||
|
@@ -199,6 +199,18 @@ entries only, either in the master map (
|
||||||
|
or with individual map entries. The option is ignored for direct mounts
|
||||||
|
and non-root offest mount entries.
|
||||||
|
.TP
|
||||||
|
+.I slave \fPor\fI private
|
||||||
|
+This option allows mount propagation of bind mounts to be set to
|
||||||
|
+either \fIslave\fP or \fIprivate\fP. This option may be needed when using
|
||||||
|
+multi-mounts that have bind mounts that bind to a file system that is
|
||||||
|
+propagation shared. This is becuase the bind mount will have the same
|
||||||
|
+properties as its target which causes problems for offset mounts. When
|
||||||
|
+this happens an unwanted offset mount is propagated back to the target
|
||||||
|
+file system resulting in a deadlock when attempting to access the offset.
|
||||||
|
+This option is a an autofs pseudo mount option that can be used in the
|
||||||
|
+master map only. By default bind mounts will inherit the mount propagation
|
||||||
|
+of the target file system.
|
||||||
|
+.TP
|
||||||
|
.I "\-r, \-\-random-multimount-selection"
|
||||||
|
Enables the use of random selection when choosing a host from a
|
||||||
|
list of replicated servers. This option is applied to this mount
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_bind.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_bind.c
|
||||||
|
@@ -186,17 +186,25 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
what, fstype, fullpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* The bind mount has succeeded but if the target
|
||||||
|
- * mount is propagation shared propagation of child
|
||||||
|
- * mounts (autofs offset mounts for example) back to
|
||||||
|
- * the target of the bind mount must be avoided or
|
||||||
|
- * autofs trigger mounts will deadlock.
|
||||||
|
- */
|
||||||
|
- err = mount(NULL, fullpath, NULL, MS_SLAVE, NULL);
|
||||||
|
- if (err)
|
||||||
|
- warn(ap->logopt,
|
||||||
|
- "failed to set propagation type for %s",
|
||||||
|
- fullpath);
|
||||||
|
+ if (ap->flags & (MOUNT_FLAG_SLAVE | MOUNT_FLAG_PRIVATE)) {
|
||||||
|
+ int flags = MS_SLAVE;
|
||||||
|
+
|
||||||
|
+ if (ap->flags & MOUNT_FLAG_PRIVATE)
|
||||||
|
+ flags = MS_PRIVATE;
|
||||||
|
+
|
||||||
|
+ /* The bind mount has succeeded but if the target
|
||||||
|
+ * mount is propagation shared propagation of child
|
||||||
|
+ * mounts (autofs offset mounts for example) back to
|
||||||
|
+ * the target of the bind mount must be avoided or
|
||||||
|
+ * autofs trigger mounts will deadlock.
|
||||||
|
+ */
|
||||||
|
+ err = mount(NULL, fullpath, NULL, flags, NULL);
|
||||||
|
+ if (err) {
|
||||||
|
+ warn(ap->logopt,
|
||||||
|
+ "failed to set propagation for %s",
|
||||||
|
+ fullpath, root);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} else {
|
696
SOURCES/autofs-5.1.4-add-mount_fedfs_c.patch
Normal file
696
SOURCES/autofs-5.1.4-add-mount_fedfs_c.patch
Normal file
@ -0,0 +1,696 @@
|
|||||||
|
autofs-5.1.4 - add mount.fedfs.c
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add build and install of the mount.fedfs binary.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
Makefile | 3
|
||||||
|
Makefile.rules | 2
|
||||||
|
autofs.spec | 1
|
||||||
|
fedfs/Makefile | 36 +++
|
||||||
|
fedfs/fedfs-gpl-boiler.h | 40 ++++
|
||||||
|
fedfs/fedfs-nls.h | 38 ++++
|
||||||
|
fedfs/mount.fedfs.c | 485 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
8 files changed, 605 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 fedfs/Makefile
|
||||||
|
create mode 100644 fedfs/fedfs-gpl-boiler.h
|
||||||
|
create mode 100644 fedfs/fedfs-nls.h
|
||||||
|
create mode 100644 fedfs/mount.fedfs.c
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 8d6c737c..88992147 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -15,6 +15,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- dont allow trailing slash in master map mount points.
|
||||||
|
- fix libresolv configure check.
|
||||||
|
- add fedfs-getsrvinfo.c.
|
||||||
|
+- add mount.fedfs.c.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index e560a7cb..99db2c75 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -19,6 +19,9 @@ kernel:
|
||||||
|
samples:
|
||||||
|
set -e; if [ -d samples ]; then $(MAKE) -C samples all; fi
|
||||||
|
|
||||||
|
+fedfs:
|
||||||
|
+ set -e; if [ -d fedfs ]; then $(MAKE) -C fedfs all; fi
|
||||||
|
+
|
||||||
|
clean:
|
||||||
|
for i in $(SUBDIRS) samples; do \
|
||||||
|
if [ -d $$i ]; then $(MAKE) -C $$i clean; fi; done
|
||||||
|
diff --git a/Makefile.rules b/Makefile.rules
|
||||||
|
index 4deab3b9..fc9f6019 100644
|
||||||
|
--- a/Makefile.rules
|
||||||
|
+++ b/Makefile.rules
|
||||||
|
@@ -3,7 +3,7 @@
|
||||||
|
#
|
||||||
|
|
||||||
|
# Root directory contents
|
||||||
|
-SUBDIRS = lib daemon modules man
|
||||||
|
+SUBDIRS = lib daemon fedfs modules man
|
||||||
|
INCDIRS = include
|
||||||
|
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
|
||||||
|
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
|
||||||
|
diff --git a/autofs.spec b/autofs.spec
|
||||||
|
index 2464e741..2cc0e38f 100644
|
||||||
|
--- a/autofs.spec
|
||||||
|
+++ b/autofs.spec
|
||||||
|
@@ -191,6 +191,7 @@ fi
|
||||||
|
%config(noreplace) /etc/sysconfig/autofs
|
||||||
|
%config(noreplace) /etc/autofs_ldap_auth.conf
|
||||||
|
%{_sbindir}/automount
|
||||||
|
+%{_sbindir}/mount.fedfs
|
||||||
|
%dir %{_libdir}/autofs
|
||||||
|
%{_libdir}/autofs/*
|
||||||
|
%{_mandir}/*/*
|
||||||
|
diff --git a/fedfs/Makefile b/fedfs/Makefile
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..cb325bed
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/fedfs/Makefile
|
||||||
|
@@ -0,0 +1,36 @@
|
||||||
|
+#
|
||||||
|
+# Makefile for mount.fedfs
|
||||||
|
+#
|
||||||
|
+
|
||||||
|
+-include ../Makefile.conf
|
||||||
|
+include ../Makefile.rules
|
||||||
|
+
|
||||||
|
+SRCS = mount.fedfs.c
|
||||||
|
+HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h
|
||||||
|
+
|
||||||
|
+fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o
|
||||||
|
+
|
||||||
|
+mount_fedfs_OBJ = mount.fedfs.o
|
||||||
|
+
|
||||||
|
+version := $(shell cat ../.version)
|
||||||
|
+
|
||||||
|
+CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include
|
||||||
|
+CFLAGS += -DVERSION_STRING=\"$(version)\"
|
||||||
|
+LDFLAGS += -rdynamic
|
||||||
|
+
|
||||||
|
+all: mount.fedfs
|
||||||
|
+
|
||||||
|
+mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
|
||||||
|
+ $(CC) -o mount.fedfs \
|
||||||
|
+ $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \
|
||||||
|
+ $(LDFLAGS) $(LIBRESOLV) $(LIBS)
|
||||||
|
+
|
||||||
|
+clean:
|
||||||
|
+ rm -f *.o *.s *~ mount.fedfs
|
||||||
|
+
|
||||||
|
+install: all
|
||||||
|
+ install -d -m 755 $(INSTALLROOT)$(sbindir)
|
||||||
|
+ if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \
|
||||||
|
+ then \
|
||||||
|
+ install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \
|
||||||
|
+ fi
|
||||||
|
diff --git a/fedfs/fedfs-gpl-boiler.h b/fedfs/fedfs-gpl-boiler.h
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..1353e736
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/fedfs/fedfs-gpl-boiler.h
|
||||||
|
@@ -0,0 +1,40 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright 2011 Oracle. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This file is part of fedfs-utils.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License version 2.0 as
|
||||||
|
+ * published by the Free Software Foundation.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
||||||
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License version 2.0 for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * version 2.0 along with fedfs-utils. If not, see:
|
||||||
|
+ *
|
||||||
|
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _GPL_BOILER_H_
|
||||||
|
+#define _GPL_BOILER_H_
|
||||||
|
+
|
||||||
|
+#ifdef HAVE_CONFIG_H
|
||||||
|
+#include <config.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * GPLv2 boilerplate for usage messages
|
||||||
|
+ */
|
||||||
|
+static const char *fedfs_gpl_boilerplate =
|
||||||
|
+ "\nCopyright 2010, 2011, 2012, 2013 Oracle. "
|
||||||
|
+ "All rights reserved.\n\n"
|
||||||
|
+ "License GPLv2: "
|
||||||
|
+ "<http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>\n"
|
||||||
|
+ "This is free software. "
|
||||||
|
+ "You are free to change and redistribute it.\n"
|
||||||
|
+ "There is NO WARRANTY, to the extent permitted by law.\n";
|
||||||
|
+
|
||||||
|
+#endif /* !_GPL_BOILER_H_ */
|
||||||
|
diff --git a/fedfs/fedfs-nls.h b/fedfs/fedfs-nls.h
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..92f968d3
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/fedfs/fedfs-nls.h
|
||||||
|
@@ -0,0 +1,38 @@
|
||||||
|
+/*
|
||||||
|
+ * From util-linux/include/nls.h (GPLv2)
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef UTIL_LINUX_NLS_H
|
||||||
|
+#define UTIL_LINUX_NLS_H
|
||||||
|
+
|
||||||
|
+int main(int argc, char *argv[]);
|
||||||
|
+
|
||||||
|
+#ifndef LOCALEDIR
|
||||||
|
+#define LOCALEDIR "/usr/share/locale"
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifdef HAVE_LOCALE_H
|
||||||
|
+# include <locale.h>
|
||||||
|
+#else
|
||||||
|
+# undef setlocale
|
||||||
|
+# define setlocale(Category, Locale) ({}) /* empty */
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#ifdef ENABLE_NLS
|
||||||
|
+# include <libintl.h>
|
||||||
|
+# define _(Text) gettext (Text)
|
||||||
|
+# ifdef gettext_noop
|
||||||
|
+# define N_(String) gettext_noop (String)
|
||||||
|
+# else
|
||||||
|
+# define N_(String) (String)
|
||||||
|
+# endif
|
||||||
|
+#else
|
||||||
|
+# undef bindtextdomain
|
||||||
|
+# define bindtextdomain(Domain, Directory) /* empty */
|
||||||
|
+# undef textdomain
|
||||||
|
+# define textdomain(Domain) /* empty */
|
||||||
|
+# define _(Text) (Text)
|
||||||
|
+# define N_(Text) (Text)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+#endif /* UTIL_LINUX_NLS_H */
|
||||||
|
diff --git a/fedfs/mount.fedfs.c b/fedfs/mount.fedfs.c
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..bd434395
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/fedfs/mount.fedfs.c
|
||||||
|
@@ -0,0 +1,485 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright 2011 Oracle. All rights reserved.
|
||||||
|
+ *
|
||||||
|
+ * This file is part of fedfs-utils.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License version 2.0 as
|
||||||
|
+ * published by the Free Software Foundation.
|
||||||
|
+ *
|
||||||
|
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
||||||
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License version 2.0 for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * version 2.0 along with fedfs-utils. If not, see:
|
||||||
|
+ *
|
||||||
|
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <sys/types.h>
|
||||||
|
+#include <sys/stat.h>
|
||||||
|
+#include <sys/socket.h>
|
||||||
|
+#include <sys/mount.h>
|
||||||
|
+#include <sys/wait.h>
|
||||||
|
+
|
||||||
|
+#include <stdbool.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <libgen.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <getopt.h>
|
||||||
|
+#include <locale.h>
|
||||||
|
+#include <netdb.h>
|
||||||
|
+#include <langinfo.h>
|
||||||
|
+
|
||||||
|
+#include "fedfs-nls.h"
|
||||||
|
+#include "fedfs-getsrvinfo.h"
|
||||||
|
+#include "fedfs-gpl-boiler.h"
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Top-level directory on client under which we mount NFSv4 domain roots
|
||||||
|
+ */
|
||||||
|
+#define FEDFS_NFS4_TLDIR "nfs4"
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Name of SRV record containing NFSv4 FedFS root
|
||||||
|
+ */
|
||||||
|
+#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp"
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Export path of NFSv4 FedFS root
|
||||||
|
+ */
|
||||||
|
+#define FEDFS_NFS_EXPORTPATH "/.domainroot"
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Pathname to mount.nfs
|
||||||
|
+ */
|
||||||
|
+#define MOUNT_NFS_EXECUTABLE "/sbin/mount.nfs"
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Mount status values, lifted from util-linux
|
||||||
|
+ */
|
||||||
|
+enum {
|
||||||
|
+ EX_SUCCESS = 0,
|
||||||
|
+ EX_USAGE = 1,
|
||||||
|
+ EX_FAIL = 32,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static char *progname;
|
||||||
|
+static int nomtab;
|
||||||
|
+static int verbose;
|
||||||
|
+static _Bool readonly;
|
||||||
|
+static _Bool sloppy;
|
||||||
|
+static _Bool fake;
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Short form command line options
|
||||||
|
+ */
|
||||||
|
+static const char fedfs_opts[] = "fhno:rsvVw";
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Long form command line options
|
||||||
|
+ */
|
||||||
|
+static const struct option fedfs_longopts[] =
|
||||||
|
+{
|
||||||
|
+ { "fake", 0, NULL, 'f' },
|
||||||
|
+ { "help", 0, NULL, 'h' },
|
||||||
|
+ { "no-mtab", 0, NULL, 'n' },
|
||||||
|
+ { "options", 1, NULL, 'o' },
|
||||||
|
+ { "read-only", 0, NULL, 'r' },
|
||||||
|
+ { "read-write", 0, NULL, 'w' },
|
||||||
|
+ { "ro", 0, NULL, 'r' },
|
||||||
|
+ { "rw", 0, NULL, 'w' },
|
||||||
|
+ { "sloppy", 0, NULL, 's' },
|
||||||
|
+ { "verbose", 0, NULL, 'v' },
|
||||||
|
+ { "version", 0, NULL, 'V' },
|
||||||
|
+ { NULL, 0, NULL, 0 }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Display mount.fedfs usage message
|
||||||
|
+ */
|
||||||
|
+static void
|
||||||
|
+mount_usage(void)
|
||||||
|
+{
|
||||||
|
+ printf(_("\nUsage: %s remotedir localdir [-fhnrsvVw]\n\n"), progname);
|
||||||
|
+ printf(_("options:\n"));
|
||||||
|
+ printf(_("\t-f\t\tFake mount, do not actually mount\n"));
|
||||||
|
+ printf(_("\t-h\t\tPrint this help\n"));
|
||||||
|
+ printf(_("\t-n\t\tDo not update /etc/mtab\n"));
|
||||||
|
+ printf(_("\t-r\t\tMount file system readonly\n"));
|
||||||
|
+ printf(_("\t-s\t\tTolerate sloppy mount options\n"));
|
||||||
|
+ printf(_("\t-v\t\tVerbose\n"));
|
||||||
|
+ printf(_("\t-V\t\tPrint version\n"));
|
||||||
|
+ printf(_("\t-w\t\tMount file system read-write\n"));
|
||||||
|
+
|
||||||
|
+ printf("%s", fedfs_gpl_boilerplate);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Concatenate three strings
|
||||||
|
+ *
|
||||||
|
+ * @param s NUL-terminated C string
|
||||||
|
+ * @param t NUL-terminated C string
|
||||||
|
+ * @param u NUL-terminated C string
|
||||||
|
+ * @return pointer to NUL-terminated C string or NULL
|
||||||
|
+ *
|
||||||
|
+ * Caller must free the returned string with free(3). Always frees
|
||||||
|
+ * its first arg - typical use: s = xstrconcat3(s,t,u);
|
||||||
|
+ *
|
||||||
|
+ * Lifted from util-linux.
|
||||||
|
+ */
|
||||||
|
+static char *
|
||||||
|
+xstrconcat3(char *s, const char *t, const char *u)
|
||||||
|
+{
|
||||||
|
+ _Bool free_s = true;
|
||||||
|
+ char *result;
|
||||||
|
+
|
||||||
|
+ if (s == NULL) {
|
||||||
|
+ s = "";
|
||||||
|
+ free_s = false;
|
||||||
|
+ }
|
||||||
|
+ if (t == NULL)
|
||||||
|
+ t = "";
|
||||||
|
+ if (u == NULL)
|
||||||
|
+ u = "";
|
||||||
|
+ result = malloc(strlen(s) + strlen(t) + strlen(u) + 1);
|
||||||
|
+ if (result == NULL)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ strcpy(result, s);
|
||||||
|
+ strcat(result, t);
|
||||||
|
+ strcat(result, u);
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ if (free_s)
|
||||||
|
+ free(s);
|
||||||
|
+ return result;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Exec mount.nfs
|
||||||
|
+ *
|
||||||
|
+ * @param server NUL-terminated C string containing name of NFS server
|
||||||
|
+ * @param port server port to use when mounting
|
||||||
|
+ * @param domainname NUL-terminated C string containing FedFS domain name
|
||||||
|
+ * @param export_path NUL-terminated C string containing server export path
|
||||||
|
+ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory
|
||||||
|
+ * @param text_options NUL-terminated C string containing user's mount options
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+static void
|
||||||
|
+exec_mount_nfs4(const char *server, unsigned short port,
|
||||||
|
+ const char *domainname, const char *export_path,
|
||||||
|
+ const char *mounted_on_dir, const char *text_options)
|
||||||
|
+{
|
||||||
|
+ static char special[2048];
|
||||||
|
+ static char options[2048];
|
||||||
|
+ char *args[16];
|
||||||
|
+ int count = 0;
|
||||||
|
+
|
||||||
|
+ snprintf(special, sizeof(special), "%s:%s/%s%s", server,
|
||||||
|
+ FEDFS_NFS_EXPORTPATH, domainname, export_path);
|
||||||
|
+
|
||||||
|
+ if (text_options != NULL && strcmp(text_options, "") != 0)
|
||||||
|
+ snprintf(options, sizeof(options), "%s,vers=4,fg,port=%u",
|
||||||
|
+ text_options, port);
|
||||||
|
+ else
|
||||||
|
+ snprintf(options, sizeof(options), "vers=4,fg,port=%u", port);
|
||||||
|
+
|
||||||
|
+ if (verbose) {
|
||||||
|
+ printf(_("%s: Special device: %s\n"),
|
||||||
|
+ progname, special);
|
||||||
|
+ printf(_("%s: Mounted-on directory: %s\n"),
|
||||||
|
+ progname, mounted_on_dir);
|
||||||
|
+ printf(_("%s: Mount options: %s\n"),
|
||||||
|
+ progname, options);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ args[count++] = MOUNT_NFS_EXECUTABLE;
|
||||||
|
+ args[count++] = special;
|
||||||
|
+ args[count++] = (char *)mounted_on_dir;
|
||||||
|
+ if (verbose)
|
||||||
|
+ args[count++] = "-v";
|
||||||
|
+ if (fake)
|
||||||
|
+ args[count++] = "-f";
|
||||||
|
+ if (nomtab)
|
||||||
|
+ args[count++] = "-n";
|
||||||
|
+ if (readonly)
|
||||||
|
+ args[count++] = "-r";
|
||||||
|
+ if (sloppy)
|
||||||
|
+ args[count++] = "-s";
|
||||||
|
+ args[count++] = "-o";
|
||||||
|
+ args[count++] = options;
|
||||||
|
+
|
||||||
|
+ args[count] = NULL;
|
||||||
|
+ execv(args[0], args);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Mount a FedFS domain root via NFSv4
|
||||||
|
+ *
|
||||||
|
+ * @param domainname NUL-terminated C string containing FedFS domain name
|
||||||
|
+ * @param export_path NUL-terminated C string containing server export path
|
||||||
|
+ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory
|
||||||
|
+ * @param text_options NUL-terminated C string containing user's mount options
|
||||||
|
+ * @return exit status code from the mount.nfs command
|
||||||
|
+ *
|
||||||
|
+ * Construct the server:/export string and the mounted-on directory string
|
||||||
|
+ * based on the DNS SRV query results, then fork and exec mount.nfs to do
|
||||||
|
+ * the actual mount request.
|
||||||
|
+ */
|
||||||
|
+static int
|
||||||
|
+nfs4_mount(const char *domainname, const char *export_path,
|
||||||
|
+ const char *mounted_on_dir, const char *text_options)
|
||||||
|
+{
|
||||||
|
+ struct srvinfo *tmp, *si = NULL;
|
||||||
|
+ int error, status;
|
||||||
|
+
|
||||||
|
+ status = EX_FAIL;
|
||||||
|
+
|
||||||
|
+ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si);
|
||||||
|
+ switch (error) {
|
||||||
|
+ case ESI_SUCCESS:
|
||||||
|
+ break;
|
||||||
|
+ case ESI_NONAME:
|
||||||
|
+ fprintf(stderr, _("%s: Domain name %s not found\n"),
|
||||||
|
+ progname, domainname);
|
||||||
|
+ goto out;
|
||||||
|
+ case ESI_SERVICE:
|
||||||
|
+ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"),
|
||||||
|
+ progname, domainname);
|
||||||
|
+ goto out;
|
||||||
|
+ default:
|
||||||
|
+ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"),
|
||||||
|
+ progname, domainname, gsi_strerror(error));
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * The srvinfo list is already in RFC 2782 sorted order. Try each
|
||||||
|
+ * SRV record once, in the foreground. Go with the first one that
|
||||||
|
+ * works.
|
||||||
|
+ */
|
||||||
|
+ for (tmp = si; tmp != NULL; tmp = tmp->si_next) {
|
||||||
|
+ pid_t pid;
|
||||||
|
+
|
||||||
|
+ pid = fork();
|
||||||
|
+ switch (pid) {
|
||||||
|
+ case 0:
|
||||||
|
+ exec_mount_nfs4(tmp->si_target, tmp->si_port,
|
||||||
|
+ domainname, export_path, mounted_on_dir,
|
||||||
|
+ text_options);
|
||||||
|
+ /*NOTREACHED*/
|
||||||
|
+ fprintf(stderr, _("%s: Failed to exec: %s\n"),
|
||||||
|
+ progname, strerror(errno));
|
||||||
|
+ exit(EX_FAIL);
|
||||||
|
+ case -1:
|
||||||
|
+ fprintf(stderr, _("%s: Failed to fork: %s\n"),
|
||||||
|
+ progname, strerror(errno));
|
||||||
|
+ goto out;
|
||||||
|
+ default:
|
||||||
|
+ waitpid(pid, &status, 0);
|
||||||
|
+ if (status == EX_SUCCESS)
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ freesrvinfo(si);
|
||||||
|
+ return status;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Try one mount request
|
||||||
|
+ *
|
||||||
|
+ * @param source NUL-terminated C string containing name of "special device"
|
||||||
|
+ * @param target NUL-terminated C string containing local mounted-on directory
|
||||||
|
+ * @param text_options NUL-terminated C string containing user's mount options
|
||||||
|
+ * @return an exit status code
|
||||||
|
+ *
|
||||||
|
+ * Parse the pathname in "source." It contains the file system protocol
|
||||||
|
+ * and FedFS domain name. Then pass these arguments to the appropriate
|
||||||
|
+ * mount helper subcommand.
|
||||||
|
+ */
|
||||||
|
+static int
|
||||||
|
+try_mount(const char *source, const char *target, const char *text_options)
|
||||||
|
+{
|
||||||
|
+ char *global_name, *topdir, *domainname, *remaining;
|
||||||
|
+ int result;
|
||||||
|
+
|
||||||
|
+ remaining = NULL;
|
||||||
|
+ result = EX_FAIL;
|
||||||
|
+
|
||||||
|
+ global_name = strdup(source);
|
||||||
|
+ if (global_name == NULL) {
|
||||||
|
+ fprintf(stderr, _("%s: Unable to parse globally useful name\n"),
|
||||||
|
+ progname);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ topdir = strtok(global_name, "/");
|
||||||
|
+ if (topdir == NULL) {
|
||||||
|
+ fprintf(stderr, _("%s: Invalid globally useful name: %s\n"),
|
||||||
|
+ progname, source);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ if (verbose)
|
||||||
|
+ printf(_("%s: Top-level directory: %s\n"),
|
||||||
|
+ progname, topdir);
|
||||||
|
+
|
||||||
|
+ domainname = strtok(NULL, "/");
|
||||||
|
+ if (domainname == NULL) {
|
||||||
|
+ fprintf(stderr, _("%s: Missing domain name in globally "
|
||||||
|
+ "useful name: %s\n"), progname, source);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ if (verbose)
|
||||||
|
+ printf(_("%s: Domain name: %s\n"),
|
||||||
|
+ progname, domainname);
|
||||||
|
+
|
||||||
|
+ remaining = strtok(NULL, "/");
|
||||||
|
+ if (remaining == NULL) {
|
||||||
|
+ remaining = strdup("/");
|
||||||
|
+ if (remaining == NULL) {
|
||||||
|
+ fprintf(stderr, _("%s: No memory\n"), progname);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ char *tmp;
|
||||||
|
+
|
||||||
|
+ tmp = malloc(strlen(remaining) + 1);
|
||||||
|
+ if (tmp == NULL) {
|
||||||
|
+ fprintf(stderr, _("%s: No memory\n"), progname);
|
||||||
|
+ remaining = NULL;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ strcpy(tmp, "/");
|
||||||
|
+ strcat(tmp, remaining);
|
||||||
|
+ remaining = tmp;
|
||||||
|
+ }
|
||||||
|
+ if (verbose)
|
||||||
|
+ printf(_("%s: Export path: %s\n"),
|
||||||
|
+ progname, remaining);
|
||||||
|
+
|
||||||
|
+ if (strcmp(topdir, FEDFS_NFS4_TLDIR) == 0)
|
||||||
|
+ result = nfs4_mount(domainname, remaining, target, text_options);
|
||||||
|
+#if 0
|
||||||
|
+ /* example: SMB support plugs in here */
|
||||||
|
+ else if (strcmp(topdir, FEDFS_SMB_TLDIR) == 0)
|
||||||
|
+ result = smb_mount(domainname, remaining, target, text_options);
|
||||||
|
+#endif
|
||||||
|
+ else
|
||||||
|
+ fprintf(stderr, _("%s: Unrecognized file system protocol\n"), progname);
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ free(global_name);
|
||||||
|
+ free(remaining);
|
||||||
|
+
|
||||||
|
+ return result;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Program entry point
|
||||||
|
+ *
|
||||||
|
+ * @param argc count of command line arguments
|
||||||
|
+ * @param argv array of NUL-terminated C strings containing command line arguments
|
||||||
|
+ * @return program exit status
|
||||||
|
+ */
|
||||||
|
+int main(int argc, char *argv[])
|
||||||
|
+{
|
||||||
|
+ char *source, *target, *text_options;
|
||||||
|
+ int c, mnt_err;
|
||||||
|
+
|
||||||
|
+ (void)setlocale(LC_ALL, "");
|
||||||
|
+
|
||||||
|
+ progname = basename(argv[0]);
|
||||||
|
+
|
||||||
|
+ if (argv[1] && argv[1][0] == '-') {
|
||||||
|
+ if(argv[1][1] == 'V')
|
||||||
|
+ printf("%s (VERSION_STRING)\n", progname);
|
||||||
|
+ else
|
||||||
|
+ mount_usage();
|
||||||
|
+ exit(EX_SUCCESS);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (argc < 3) {
|
||||||
|
+ mount_usage();
|
||||||
|
+ exit(EX_USAGE);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ source = argv[1];
|
||||||
|
+ target = argv[2];
|
||||||
|
+
|
||||||
|
+ mnt_err = EX_USAGE;
|
||||||
|
+ text_options = NULL;
|
||||||
|
+ readonly = false;
|
||||||
|
+ sloppy = false;
|
||||||
|
+ fake = false;
|
||||||
|
+ argv[2] = argv[0]; /* so that getopt error messages are correct */
|
||||||
|
+ while ((c = getopt_long(argc - 2, argv + 2, fedfs_opts,
|
||||||
|
+ fedfs_longopts, NULL)) != -1) {
|
||||||
|
+ switch (c) {
|
||||||
|
+ case 'f':
|
||||||
|
+ fake = true;
|
||||||
|
+ break;
|
||||||
|
+ case 'n':
|
||||||
|
+ ++nomtab;
|
||||||
|
+ break;
|
||||||
|
+ case 'o':
|
||||||
|
+ /* Ugh. */
|
||||||
|
+ if (text_options != NULL)
|
||||||
|
+ text_options = xstrconcat3(text_options, ",", optarg);
|
||||||
|
+ else
|
||||||
|
+ text_options = strdup(optarg);
|
||||||
|
+ if (text_options == NULL) {
|
||||||
|
+ fprintf(stderr, _("%s: No memory\n"), progname);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ case 'r':
|
||||||
|
+ readonly = true;
|
||||||
|
+ break;
|
||||||
|
+ case 's':
|
||||||
|
+ sloppy = true;
|
||||||
|
+ break;
|
||||||
|
+ case 'v':
|
||||||
|
+ ++verbose;
|
||||||
|
+ break;
|
||||||
|
+ case 'V':
|
||||||
|
+ printf("%s: (VERSION_STRING)\n", progname);
|
||||||
|
+ mnt_err = EX_SUCCESS;
|
||||||
|
+ goto out;
|
||||||
|
+ case 'w':
|
||||||
|
+ readonly = false;
|
||||||
|
+ break;
|
||||||
|
+ case 'h':
|
||||||
|
+ default:
|
||||||
|
+ mount_usage();
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Extra non-option words at the end are bogus... */
|
||||||
|
+ if (optind != argc - 2) {
|
||||||
|
+ mount_usage();
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (getuid() != 0 && geteuid() != 0) {
|
||||||
|
+ fprintf(stderr, _("%s: Not installed setuid - "
|
||||||
|
+ "\"user\" FedFS mounts are not supported\n"), progname);
|
||||||
|
+ mnt_err = EX_FAIL;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mnt_err = try_mount(source, target, text_options);
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ free(text_options);
|
||||||
|
+ exit(mnt_err);
|
||||||
|
+}
|
@ -0,0 +1,137 @@
|
|||||||
|
autofs-5.1.4 - add systemd service command line option
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
When run as a systemd service using the systemd notification method to
|
||||||
|
synchronise startup, logging should be done to syslog so the log entry
|
||||||
|
format is consistent between daemon and systemd usage.
|
||||||
|
|
||||||
|
So, rather than run use the forground option, add an option to tell
|
||||||
|
the automounter it's being run as a systemd service and use syslog
|
||||||
|
for logging when its present on the command line.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 22 +++++++++++++++++++---
|
||||||
|
include/automount.h | 1 +
|
||||||
|
man/automount.8 | 4 ++++
|
||||||
|
samples/autofs.service.in | 2 +-
|
||||||
|
5 files changed, 26 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -43,6 +43,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- update build info with systemd.
|
||||||
|
- use flags for startup boolean options.
|
||||||
|
- move close stdio descriptors to become_daemon().
|
||||||
|
+- add systemd service command line option.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -1210,13 +1210,21 @@ static void become_daemon(unsigned int f
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Detach from foreground process */
|
||||||
|
- if (flags & DAEMON_FLAGS_FOREGROUND) {
|
||||||
|
+ if (flags & DAEMON_FLAGS_FOREGROUND &&
|
||||||
|
+ !(flags & DAEMON_FLAGS_SYSTEMD_SERVICE)) {
|
||||||
|
if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
||||||
|
fprintf(stderr, "%s: program is already running.\n",
|
||||||
|
program);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
log_to_stderr();
|
||||||
|
+ } else if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE) {
|
||||||
|
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
||||||
|
+ fprintf(stderr, "%s: program is already running.\n",
|
||||||
|
+ program);
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+ open_log();
|
||||||
|
} else {
|
||||||
|
int nullfd;
|
||||||
|
|
||||||
|
@@ -1925,6 +1933,8 @@ static void usage(void)
|
||||||
|
" -d --debug log debuging info\n"
|
||||||
|
" -Dvariable=value, --define variable=value\n"
|
||||||
|
" define global macro variable\n"
|
||||||
|
+ " -S --systemd-service\n"
|
||||||
|
+ " run automounter as a systemd service\n"
|
||||||
|
" -f --foreground do not fork into background\n"
|
||||||
|
" -r --random-multimount-selection\n"
|
||||||
|
" use ramdom replicated server selection\n"
|
||||||
|
@@ -2190,7 +2200,7 @@ int main(int argc, char *argv[])
|
||||||
|
time_t timeout;
|
||||||
|
time_t age = monotonic_time(NULL);
|
||||||
|
struct rlimit rlim;
|
||||||
|
- const char *options = "+hp:t:vmdD:fVrO:l:n:CFM";
|
||||||
|
+ const char *options = "+hp:t:vmdD:SfVrO:l:n:CFM";
|
||||||
|
static const struct option long_options[] = {
|
||||||
|
{"help", 0, 0, 'h'},
|
||||||
|
{"pid-file", 1, 0, 'p'},
|
||||||
|
@@ -2198,6 +2208,7 @@ int main(int argc, char *argv[])
|
||||||
|
{"verbose", 0, 0, 'v'},
|
||||||
|
{"debug", 0, 0, 'd'},
|
||||||
|
{"define", 1, 0, 'D'},
|
||||||
|
+ {"systemd-service", 0, 0, 'S'},
|
||||||
|
{"foreground", 0, 0, 'f'},
|
||||||
|
{"random-multimount-selection", 0, 0, 'r'},
|
||||||
|
{"negative-timeout", 1, 0, 'n'},
|
||||||
|
@@ -2266,6 +2277,10 @@ int main(int argc, char *argv[])
|
||||||
|
macro_parse_globalvar(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case 'S':
|
||||||
|
+ flags |= DAEMON_FLAGS_SYSTEMD_SERVICE;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
case 'f':
|
||||||
|
flags |= DAEMON_FLAGS_FOREGROUND;
|
||||||
|
break;
|
||||||
|
@@ -2653,7 +2668,8 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_SYSTEMD
|
||||||
|
- sd_notify(1, "READY=1");
|
||||||
|
+ if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE)
|
||||||
|
+ sd_notify(1, "READY=1");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
state_mach_thid = pthread_self();
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -67,6 +67,7 @@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DAEMON_FLAGS_FOREGROUND 0x0001
|
||||||
|
+#define DAEMON_FLAGS_SYSTEMD_SERVICE 0x0002
|
||||||
|
#define DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS 0x0004
|
||||||
|
#define DAEMON_FLAGS_GHOST 0x0008
|
||||||
|
#define DAEMON_FLAGS_CHECK_DAEMON 0x0010
|
||||||
|
--- autofs-5.1.4.orig/man/automount.8
|
||||||
|
+++ autofs-5.1.4/man/automount.8
|
||||||
|
@@ -57,6 +57,10 @@ Define a global macro substitution varia
|
||||||
|
are over-ridden macro definitions of the same name specified in
|
||||||
|
mount entries.
|
||||||
|
.TP
|
||||||
|
+.I \-S, \-\-systemd-service
|
||||||
|
+Used when running the automounter as a systemd service to ensure log entry
|
||||||
|
+format is consistent with the log entry format when running as a daemon.
|
||||||
|
+.TP
|
||||||
|
.I "\-f, \-\-foreground"
|
||||||
|
Run the daemon in the foreground and log to stderr instead of syslog."
|
||||||
|
.TP
|
||||||
|
--- autofs-5.1.4.orig/samples/autofs.service.in
|
||||||
|
+++ autofs-5.1.4/samples/autofs.service.in
|
||||||
|
@@ -6,7 +6,7 @@ Wants=network-online.target rpc-statd.se
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
EnvironmentFile=-@@autofsconfdir@@/autofs
|
||||||
|
-ExecStart=@@sbindir@@/automount $OPTIONS --foreground --dont-check-daemon
|
||||||
|
+ExecStart=@@sbindir@@/automount $OPTIONS --systemd-service --dont-check-daemon
|
||||||
|
ExecReload=/usr/bin/kill -HUP $MAINPID
|
||||||
|
KillMode=process
|
||||||
|
TimeoutSec=180
|
@ -0,0 +1,39 @@
|
|||||||
|
autofs-5.1.4 - add units After line to include statd service
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
autofs needs to ensure statd is started before any NFS mounts
|
||||||
|
are attempted. This is because if the first NFS mount starts
|
||||||
|
the service and the mount is an automounted directory that is
|
||||||
|
included in the PATH used by systemctl (eg. /usr/local/bin)
|
||||||
|
the mount cannot complete.
|
||||||
|
|
||||||
|
Add rpc-statd.service to the unit "After=" line to try and
|
||||||
|
ensure it is started before automount.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
samples/autofs.service.in | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -21,6 +21,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add an example fedfs master map entry to the installed master map.
|
||||||
|
- improve hostname lookup error logging.
|
||||||
|
- tiny patch for autofs typo and possible bug.
|
||||||
|
+- add units After line to include statd service.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/samples/autofs.service.in
|
||||||
|
+++ autofs-5.1.4/samples/autofs.service.in
|
||||||
|
@@ -1,6 +1,6 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Automounts filesystems on demand
|
||||||
|
-After=network.target ypbind.service sssd.service network-online.target remote-fs.target
|
||||||
|
+After=network.target ypbind.service sssd.service network-online.target remote-fs.target rpc-statd.service rpcbind.service
|
||||||
|
Wants=network-online.target rpc-statd.service rpcbind.service
|
||||||
|
|
||||||
|
[Service]
|
@ -0,0 +1,130 @@
|
|||||||
|
autofs-5.1.4 - better handle hesiod support not built in
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The configure option --without-hesiod is not handled well.
|
||||||
|
|
||||||
|
If this option is given and hesiod is seen in the master
|
||||||
|
map parser or the amd map parser issue a message telling
|
||||||
|
the user hesiod support isn't built in.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/master_parse.y | 18 ++++++++++++++++--
|
||||||
|
modules/amd_parse.y | 7 +++++++
|
||||||
|
modules/parse_amd.c | 28 +++++++++++++++++++++++++---
|
||||||
|
4 files changed, 49 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -36,6 +36,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix use after free in parse_ldap_config().
|
||||||
|
- fix incorrect locking in sss lookup.
|
||||||
|
- fix amd parser opts option handling.
|
||||||
|
+- better handle hesiod support not built in.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/master_parse.y
|
||||||
|
+++ autofs-5.1.4/lib/master_parse.y
|
||||||
|
@@ -171,7 +171,14 @@ line:
|
||||||
|
|
||||||
|
if ((tmp = strchr($2, ',')))
|
||||||
|
*tmp++ = '\0';
|
||||||
|
-
|
||||||
|
+#ifndef WITH_HESIOD
|
||||||
|
+ /* Map type or or map type parser is hesiod */
|
||||||
|
+ if (!strcmp($2, "hesiod") || !strcmp(tmp, "hesiod")) {
|
||||||
|
+ master_error("hesiod support not built in");
|
||||||
|
+ local_free_vars();
|
||||||
|
+ YYABORT;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
if (type)
|
||||||
|
free(type);
|
||||||
|
type = master_strdup($2);
|
||||||
|
@@ -352,7 +359,14 @@ map: PATH
|
||||||
|
|
||||||
|
if ((tmp = strchr($1, ',')))
|
||||||
|
*tmp++ = '\0';
|
||||||
|
-
|
||||||
|
+#ifndef WITH_HESIOD
|
||||||
|
+ /* Map type or or map type parser is hesiod */
|
||||||
|
+ if (!strcmp($1, "hesiod") || !strcmp(tmp, "hesiod")) {
|
||||||
|
+ master_error("hesiod support not built in");
|
||||||
|
+ local_free_vars();
|
||||||
|
+ YYABORT;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
if (type)
|
||||||
|
free(type);
|
||||||
|
if (strcmp($1, "exec"))
|
||||||
|
--- autofs-5.1.4.orig/modules/amd_parse.y
|
||||||
|
+++ autofs-5.1.4/modules/amd_parse.y
|
||||||
|
@@ -574,6 +574,13 @@ static int match_map_option_map_type(cha
|
||||||
|
!strcmp(map_type, "nisplus") ||
|
||||||
|
!strcmp(map_type, "ldap") ||
|
||||||
|
!strcmp(map_type, "hesiod")) {
|
||||||
|
+#ifndef WITH_HESIOD
|
||||||
|
+ if (!strcmp(map_type, "hesiod")) {
|
||||||
|
+ amd_msg("hesiod support not built in");
|
||||||
|
+ free(map_type);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
amd_set_value(&entry.map_type, map_type);
|
||||||
|
} else if (!strcmp(map_type, "exec")) {
|
||||||
|
/* autofs uses "program" for "exec" map type */
|
||||||
|
--- autofs-5.1.4.orig/modules/parse_amd.c
|
||||||
|
+++ autofs-5.1.4/modules/parse_amd.c
|
||||||
|
@@ -1871,15 +1871,25 @@ struct amd_entry *make_default_entry(str
|
||||||
|
if (amd_parse_list(ap, defaults, &dflts, &sv))
|
||||||
|
return NULL;
|
||||||
|
defaults_entry = list_entry(dflts.next, struct amd_entry, list);
|
||||||
|
- list_del_init(&defaults_entry->list);
|
||||||
|
/*
|
||||||
|
* If map type isn't given try to inherit from
|
||||||
|
* parent. A NULL map type is valid and means
|
||||||
|
* use configured nss sources.
|
||||||
|
*/
|
||||||
|
map_type = conf_amd_get_map_type(ap->path);
|
||||||
|
- if (map_type)
|
||||||
|
+ if (map_type) {
|
||||||
|
defaults_entry->map_type = map_type;
|
||||||
|
+#ifndef HAVE_HESIOD
|
||||||
|
+ if (!strcmp(map_type, "hesiod")) {
|
||||||
|
+ warn(ap->logopt, MODPREFIX
|
||||||
|
+ "hesiod support not built in, "
|
||||||
|
+ "defaults map entry not set");
|
||||||
|
+ defaults_entry = NULL;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+ }
|
||||||
|
+ if (defaults_entry)
|
||||||
|
+ list_del_init(&defaults_entry->list);
|
||||||
|
/* The list should now be empty .... */
|
||||||
|
free_amd_entry_list(&dflts);
|
||||||
|
return defaults_entry;
|
||||||
|
@@ -2005,8 +2015,20 @@ static struct amd_entry *get_defaults_en
|
||||||
|
* use configured nss sources.
|
||||||
|
*/
|
||||||
|
char *map_type = conf_amd_get_map_type(ap->path);
|
||||||
|
- if (map_type)
|
||||||
|
+ if (map_type) {
|
||||||
|
entry->map_type = map_type;
|
||||||
|
+#ifndef HAVE_HESIOD
|
||||||
|
+ if (!strcmp(map_type, "hesiod")) {
|
||||||
|
+ warn(ap->logopt, MODPREFIX
|
||||||
|
+ "hesiod support not built in, "
|
||||||
|
+ "attempting to use internal "
|
||||||
|
+ "default");
|
||||||
|
+ free_amd_entry(entry);
|
||||||
|
+ free(expand);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
free(expand);
|
||||||
|
}
|
@ -0,0 +1,136 @@
|
|||||||
|
autofs-5.1.4 - change expire type naming to better reflect usage
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Expires can request different types of expire, currently normal or
|
||||||
|
immediate (and later force).
|
||||||
|
|
||||||
|
Change the naming used in the expire functions to better indicate
|
||||||
|
usage.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 8 ++++----
|
||||||
|
daemon/indirect.c | 8 ++++----
|
||||||
|
daemon/state.c | 4 ++--
|
||||||
|
include/state.h | 2 +-
|
||||||
|
5 files changed, 12 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -54,6 +54,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- allow period following macro in selector value.
|
||||||
|
- fix macro expansion in selector values.
|
||||||
|
- also use strictexpire for offsets.
|
||||||
|
+- change expire type naming to better reflect usage.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -861,7 +861,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
struct expire_args ec;
|
||||||
|
struct autofs_point *ap;
|
||||||
|
struct mapent *me = NULL;
|
||||||
|
- unsigned int now;
|
||||||
|
+ unsigned int how;
|
||||||
|
int ioctlfd, cur_state;
|
||||||
|
int status, ret, left;
|
||||||
|
|
||||||
|
@@ -872,7 +872,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
fatal(status);
|
||||||
|
|
||||||
|
ap = ec.ap = ea->ap;
|
||||||
|
- now = ea->when;
|
||||||
|
+ how = ea->how;
|
||||||
|
ec.status = -1;
|
||||||
|
|
||||||
|
ea->signaled = 1;
|
||||||
|
@@ -966,7 +966,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
|
||||||
|
ioctlfd = me->ioctlfd;
|
||||||
|
|
||||||
|
- ret = ops->expire(ap->logopt, ioctlfd, next->path, now);
|
||||||
|
+ ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
|
||||||
|
if (ret) {
|
||||||
|
left++;
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
@@ -992,7 +992,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
debug(ap->logopt, "send expire to trigger %s", next->path);
|
||||||
|
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
||||||
|
- ret = ops->expire(ap->logopt, ioctlfd, next->path, now);
|
||||||
|
+ ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
|
||||||
|
if (ret)
|
||||||
|
left++;
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -402,7 +402,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
struct mnt_list *mnts = NULL, *next;
|
||||||
|
struct expire_args *ea;
|
||||||
|
struct expire_args ec;
|
||||||
|
- unsigned int now;
|
||||||
|
+ unsigned int how;
|
||||||
|
int offsets, submnts, count;
|
||||||
|
int retries;
|
||||||
|
int ioctlfd, cur_state;
|
||||||
|
@@ -415,7 +415,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
fatal(status);
|
||||||
|
|
||||||
|
ap = ec.ap = ea->ap;
|
||||||
|
- now = ea->when;
|
||||||
|
+ how = ea->how;
|
||||||
|
ec.status = -1;
|
||||||
|
|
||||||
|
ea->signaled = 1;
|
||||||
|
@@ -540,7 +540,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
debug(ap->logopt, "expire %s", next->path);
|
||||||
|
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
||||||
|
- ret = ops->expire(ap->logopt, ioctlfd, next->path, now);
|
||||||
|
+ ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
|
||||||
|
if (ret)
|
||||||
|
left++;
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
@@ -554,7 +554,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
||||||
|
retries = (count_mounts(ap, ap->path, ap->dev) + 1);
|
||||||
|
while (retries--) {
|
||||||
|
- ret = ops->expire(ap->logopt, ap->ioctlfd, ap->path, now);
|
||||||
|
+ ret = ops->expire(ap->logopt, ap->ioctlfd, ap->path, how);
|
||||||
|
if (ret)
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
--- autofs-5.1.4.orig/daemon/state.c
|
||||||
|
+++ autofs-5.1.4/daemon/state.c
|
||||||
|
@@ -267,7 +267,7 @@ void expire_proc_cleanup(void *arg)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static enum expire expire_proc(struct autofs_point *ap, int now)
|
||||||
|
+static enum expire expire_proc(struct autofs_point *ap, int how)
|
||||||
|
{
|
||||||
|
pthread_t thid;
|
||||||
|
struct expire_args *ea;
|
||||||
|
@@ -295,7 +295,7 @@ static enum expire expire_proc(struct au
|
||||||
|
fatal(status);
|
||||||
|
|
||||||
|
ea->ap = ap;
|
||||||
|
- ea->when = now;
|
||||||
|
+ ea->how = how;
|
||||||
|
ea->status = 1;
|
||||||
|
|
||||||
|
if (ap->type == LKP_INDIRECT)
|
||||||
|
--- autofs-5.1.4.orig/include/state.h
|
||||||
|
+++ autofs-5.1.4/include/state.h
|
||||||
|
@@ -55,7 +55,7 @@ struct expire_args {
|
||||||
|
unsigned int signaled;
|
||||||
|
struct autofs_point *ap; /* autofs mount we are working on */
|
||||||
|
enum states state; /* State prune or expire */
|
||||||
|
- unsigned int when; /* Immediate expire ? */
|
||||||
|
+ unsigned int how; /* Normal, immediate expire ? */
|
||||||
|
int status; /* Return status */
|
||||||
|
};
|
||||||
|
|
425
SOURCES/autofs-5.1.4-covarity-fixes-1.patch
Normal file
425
SOURCES/autofs-5.1.4-covarity-fixes-1.patch
Normal file
@ -0,0 +1,425 @@
|
|||||||
|
autofs-5.1.4 - covarity fixes 1
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
* remove conditional close of nullfd.
|
||||||
|
* fix memory leak of local_domain in lib/macros.c:macro_init().
|
||||||
|
* check for NULL prior to several assignments in lib/master_parse.y.
|
||||||
|
* fix memory leak in lib/mounts.c:add_std_amd_vars().
|
||||||
|
* add missing break in lib/rpc_subs.c:rpc_get_netid().
|
||||||
|
* fix variable scope problem in modules/amd_parse.c:make_selector().
|
||||||
|
* fix selector itself not freed in lib/parse_subs.c:free_selector().
|
||||||
|
* fix possible memory leak in modules/lookup_ldap.c:parse_ldap_config().
|
||||||
|
* fix possible memory leak in modules/lookup_ldap.c:decode_percent_hack().
|
||||||
|
* fix usage of decode_percent_hack() in modules/lookup_ldap.c.
|
||||||
|
* initialize enc_key1 and enc_key2 in modules/lookup_ldap.c:lookup_one().
|
||||||
|
* fix double alloc of map_type in modules/parse_amd.c:make_default_entry().
|
||||||
|
* fix double alloc of map_type in modules/parse_amd.c:get_defaults_entry().
|
||||||
|
* fix possible memory leak in modules/parse_sun.c:parse_reinit().
|
||||||
|
* initialize myoptions and ro_loc in modules/parse_sun.c:mount_subtree().
|
||||||
|
* initialize myoptions and loc in modules/parse_sun.c:parse_mount().
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/log.c | 3 +--
|
||||||
|
lib/macros.c | 1 +
|
||||||
|
lib/master_parse.y | 28 ++++++++++++++++++++++++++++
|
||||||
|
lib/mounts.c | 4 +++-
|
||||||
|
lib/parse_subs.c | 1 +
|
||||||
|
lib/rpc_subs.c | 1 +
|
||||||
|
modules/amd_parse.y | 4 ++--
|
||||||
|
modules/lookup_ldap.c | 27 ++++++++++++++++++++++-----
|
||||||
|
modules/parse_amd.c | 4 ++--
|
||||||
|
modules/parse_sun.c | 10 +++++++++-
|
||||||
|
11 files changed, 71 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/lib/log.c
|
||||||
|
+++ autofs-5.1.4/lib/log.c
|
||||||
|
@@ -336,8 +336,7 @@ void log_to_syslog(void)
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (nullfd > 2)
|
||||||
|
- close(nullfd);
|
||||||
|
+ close(nullfd);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
--- autofs-5.1.4.orig/lib/macros.c
|
||||||
|
+++ autofs-5.1.4/lib/macros.c
|
||||||
|
@@ -137,6 +137,7 @@ void macro_init(void)
|
||||||
|
|
||||||
|
macro_init_done = 1;
|
||||||
|
macro_unlock();
|
||||||
|
+ free(local_domain);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/lib/master_parse.y
|
||||||
|
+++ autofs-5.1.4/lib/master_parse.y
|
||||||
|
@@ -157,6 +157,8 @@ line:
|
||||||
|
|
||||||
|
trim_maptype($2);
|
||||||
|
|
||||||
|
+ if (path)
|
||||||
|
+ free(path);
|
||||||
|
path = master_strdup($1);
|
||||||
|
if (!path) {
|
||||||
|
master_error("memory allocation error");
|
||||||
|
@@ -167,6 +169,8 @@ line:
|
||||||
|
if ((tmp = strchr($2, ',')))
|
||||||
|
*tmp++ = '\0';
|
||||||
|
|
||||||
|
+ if (type)
|
||||||
|
+ free(type);
|
||||||
|
type = master_strdup($2);
|
||||||
|
if (!type) {
|
||||||
|
master_error("memory allocation error");
|
||||||
|
@@ -174,6 +178,8 @@ line:
|
||||||
|
YYABORT;
|
||||||
|
}
|
||||||
|
if (tmp) {
|
||||||
|
+ if (format)
|
||||||
|
+ free(format);
|
||||||
|
format = master_strdup(tmp);
|
||||||
|
if (!format) {
|
||||||
|
master_error("memory allocation error");
|
||||||
|
@@ -204,6 +210,8 @@ line:
|
||||||
|
|
||||||
|
mapspec: map
|
||||||
|
{
|
||||||
|
+ if (local_argv)
|
||||||
|
+ free_argv(local_argc, (const char **) local_argv);
|
||||||
|
local_argc = tmp_argc;
|
||||||
|
local_argv = tmp_argv;
|
||||||
|
tmp_argc = 0;
|
||||||
|
@@ -211,6 +219,8 @@ mapspec: map
|
||||||
|
}
|
||||||
|
| map options
|
||||||
|
{
|
||||||
|
+ if (local_argv)
|
||||||
|
+ free_argv(local_argc, (const char **) local_argv);
|
||||||
|
local_argc = tmp_argc;
|
||||||
|
local_argv = tmp_argv;
|
||||||
|
tmp_argc = 0;
|
||||||
|
@@ -288,6 +298,8 @@ map: PATH
|
||||||
|
}
|
||||||
|
| MAPHOSTS
|
||||||
|
{
|
||||||
|
+ if (type)
|
||||||
|
+ free(type);
|
||||||
|
type = master_strdup($1 + 1);
|
||||||
|
if (!type) {
|
||||||
|
local_free_vars();
|
||||||
|
@@ -302,6 +314,8 @@ map: PATH
|
||||||
|
}
|
||||||
|
| MAPNULL
|
||||||
|
{
|
||||||
|
+ if (type)
|
||||||
|
+ free(type);
|
||||||
|
type = master_strdup($1 + 1);
|
||||||
|
if (!type) {
|
||||||
|
local_free_vars();
|
||||||
|
@@ -310,6 +324,8 @@ map: PATH
|
||||||
|
}
|
||||||
|
| dnattrs
|
||||||
|
{
|
||||||
|
+ if (type)
|
||||||
|
+ free(type);
|
||||||
|
type = master_strdup("ldap");
|
||||||
|
if (!type) {
|
||||||
|
local_free_vars();
|
||||||
|
@@ -332,6 +348,8 @@ map: PATH
|
||||||
|
if ((tmp = strchr($1, ',')))
|
||||||
|
*tmp++ = '\0';
|
||||||
|
|
||||||
|
+ if (type)
|
||||||
|
+ free(type);
|
||||||
|
if (strcmp($1, "exec"))
|
||||||
|
type = master_strdup($1);
|
||||||
|
else
|
||||||
|
@@ -342,6 +360,8 @@ map: PATH
|
||||||
|
YYABORT;
|
||||||
|
}
|
||||||
|
if (tmp) {
|
||||||
|
+ if (format)
|
||||||
|
+ free(format);
|
||||||
|
format = master_strdup(tmp);
|
||||||
|
if (!format) {
|
||||||
|
master_error("memory allocation error");
|
||||||
|
@@ -366,6 +386,8 @@ map: PATH
|
||||||
|
if ((tmp = strchr($1, ',')))
|
||||||
|
*tmp++ = '\0';
|
||||||
|
|
||||||
|
+ if (type)
|
||||||
|
+ free(type);
|
||||||
|
if (strcmp($1, "exec"))
|
||||||
|
type = master_strdup($1);
|
||||||
|
else
|
||||||
|
@@ -376,6 +398,8 @@ map: PATH
|
||||||
|
YYABORT;
|
||||||
|
}
|
||||||
|
if (tmp) {
|
||||||
|
+ if (format)
|
||||||
|
+ free(format);
|
||||||
|
format = master_strdup(tmp);
|
||||||
|
if (!format) {
|
||||||
|
master_error("memory allocation error");
|
||||||
|
@@ -400,6 +424,8 @@ map: PATH
|
||||||
|
if ((tmp = strchr($1, ',')))
|
||||||
|
*tmp++ = '\0';
|
||||||
|
|
||||||
|
+ if (type)
|
||||||
|
+ free(type);
|
||||||
|
if (strcmp($1, "exec"))
|
||||||
|
type = master_strdup($1);
|
||||||
|
else
|
||||||
|
@@ -410,6 +436,8 @@ map: PATH
|
||||||
|
YYABORT;
|
||||||
|
}
|
||||||
|
if (tmp) {
|
||||||
|
+ if (format)
|
||||||
|
+ free(format);
|
||||||
|
format = master_strdup(tmp);
|
||||||
|
if (!format) {
|
||||||
|
master_error("memory allocation error");
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -489,8 +489,10 @@ void add_std_amd_vars(struct substvar *s
|
||||||
|
const struct substvar *v = macro_findvar(sv, "domain", 4);
|
||||||
|
if (v && *v->val) {
|
||||||
|
tmp = strdup(v->val);
|
||||||
|
- if (tmp)
|
||||||
|
+ if (tmp) {
|
||||||
|
macro_global_addvar("cluster", 7, tmp);
|
||||||
|
+ free(tmp);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/lib/parse_subs.c
|
||||||
|
+++ autofs-5.1.4/lib/parse_subs.c
|
||||||
|
@@ -189,6 +189,7 @@ void free_selector(struct selector *sele
|
||||||
|
free(s->func.arg2);
|
||||||
|
s = next;
|
||||||
|
}
|
||||||
|
+ free(selector);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/lib/rpc_subs.c
|
||||||
|
+++ autofs-5.1.4/lib/rpc_subs.c
|
||||||
|
@@ -389,6 +389,7 @@ static enum clnt_stat rpc_get_netid(cons
|
||||||
|
}
|
||||||
|
|
||||||
|
*netid = nc_netid;
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
endnetconfig(handle);
|
||||||
|
free(nc_proto);
|
||||||
|
--- autofs-5.1.4.orig/modules/amd_parse.y
|
||||||
|
+++ autofs-5.1.4/modules/amd_parse.y
|
||||||
|
@@ -822,13 +822,13 @@ static int make_selector(char *name,
|
||||||
|
if (!value1)
|
||||||
|
tmp = NULL;
|
||||||
|
else {
|
||||||
|
- char *tmp = amd_strdup(value1);
|
||||||
|
+ tmp = amd_strdup(value1);
|
||||||
|
if (!tmp)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
s->func.arg1 = tmp;
|
||||||
|
} else if (s->sel->flags & SEL_FLAG_FUNC2) {
|
||||||
|
- char *tmp = amd_strdup(value1);
|
||||||
|
+ tmp = amd_strdup(value1);
|
||||||
|
if (!tmp)
|
||||||
|
goto error;
|
||||||
|
s->func.arg1 = tmp;
|
||||||
|
--- autofs-5.1.4.orig/modules/lookup_ldap.c
|
||||||
|
+++ autofs-5.1.4/modules/lookup_ldap.c
|
||||||
|
@@ -1137,6 +1137,7 @@ int parse_ldap_config(unsigned logopt, s
|
||||||
|
error(logopt,
|
||||||
|
MODPREFIX "stat(2) failed with error %s.",
|
||||||
|
strerror(errno));
|
||||||
|
+ free(auth_conf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1148,6 +1149,7 @@ int parse_ldap_config(unsigned logopt, s
|
||||||
|
"Please make sure that it is owned by root, group "
|
||||||
|
"is root, and the mode is 0600.",
|
||||||
|
auth_conf);
|
||||||
|
+ free(auth_conf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1182,9 +1184,11 @@ int parse_ldap_config(unsigned logopt, s
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!usetls || ctxt->port == LDAPS_PORT)
|
||||||
|
+ if (!usetls || ctxt->port == LDAPS_PORT) {
|
||||||
|
use_tls = LDAP_TLS_DONT_USE;
|
||||||
|
- else {
|
||||||
|
+ if (usetls)
|
||||||
|
+ free(usetls);
|
||||||
|
+ } else {
|
||||||
|
if (!strcasecmp(usetls, "yes"))
|
||||||
|
use_tls = LDAP_TLS_INIT;
|
||||||
|
else if (!strcasecmp(usetls, "no"))
|
||||||
|
@@ -1194,6 +1198,7 @@ int parse_ldap_config(unsigned logopt, s
|
||||||
|
MODPREFIX
|
||||||
|
"The usetls property must have value "
|
||||||
|
"\"yes\" or \"no\".");
|
||||||
|
+ free(usetls);
|
||||||
|
ret = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
@@ -1221,6 +1226,7 @@ int parse_ldap_config(unsigned logopt, s
|
||||||
|
MODPREFIX
|
||||||
|
"The tlsrequired property must have value "
|
||||||
|
"\"yes\" or \"no\".");
|
||||||
|
+ free(tlsrequired);
|
||||||
|
ret = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
@@ -1252,6 +1258,7 @@ int parse_ldap_config(unsigned logopt, s
|
||||||
|
MODPREFIX
|
||||||
|
"The authrequired property must have value "
|
||||||
|
"\"yes\", \"no\", \"autodetect\", or \"simple\".");
|
||||||
|
+ free(authrequired);
|
||||||
|
ret = -1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
@@ -1338,6 +1345,7 @@ auth_fail:
|
||||||
|
(void)get_property(logopt, root, "credentialcache", &client_cc);
|
||||||
|
|
||||||
|
ctxt->auth_conf = auth_conf;
|
||||||
|
+ auth_conf = NULL;
|
||||||
|
ctxt->use_tls = use_tls;
|
||||||
|
ctxt->tls_required = tls_required;
|
||||||
|
ctxt->auth_required = auth_required;
|
||||||
|
@@ -1375,8 +1383,12 @@ auth_fail:
|
||||||
|
user, secret ? "specified" : "unspecified",
|
||||||
|
client_princ, client_cc);
|
||||||
|
}
|
||||||
|
+ if (authtype)
|
||||||
|
+ free(authtype);
|
||||||
|
out:
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
+ if (auth_conf)
|
||||||
|
+ free(auth_conf);
|
||||||
|
|
||||||
|
if (fallback)
|
||||||
|
return 0;
|
||||||
|
@@ -1986,7 +1998,7 @@ int lookup_read_master(struct master *ma
|
||||||
|
}
|
||||||
|
} else if (count == 1) {
|
||||||
|
dec_len = decode_percent_hack(keyValue[0], &key);
|
||||||
|
- if (dec_len < 0) {
|
||||||
|
+ if (dec_len <= 0) {
|
||||||
|
error(logopt, MODPREFIX
|
||||||
|
"invalid map key %s - ignoring",
|
||||||
|
*keyValue);
|
||||||
|
@@ -1994,7 +2006,7 @@ int lookup_read_master(struct master *ma
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dec_len = decode_percent_hack(keyValue[0], &key);
|
||||||
|
- if (dec_len < 0) {
|
||||||
|
+ if (dec_len <= 0) {
|
||||||
|
error(logopt, MODPREFIX
|
||||||
|
"invalid map key %s - ignoring",
|
||||||
|
*keyValue);
|
||||||
|
@@ -2004,7 +2016,7 @@ int lookup_read_master(struct master *ma
|
||||||
|
for (i = 1; i < count; i++) {
|
||||||
|
char *k;
|
||||||
|
dec_len = decode_percent_hack(keyValue[i], &k);
|
||||||
|
- if (dec_len < 0) {
|
||||||
|
+ if (dec_len <= 0) {
|
||||||
|
error(logopt, MODPREFIX
|
||||||
|
"invalid map key %s - ignoring",
|
||||||
|
*keyValue);
|
||||||
|
@@ -2159,6 +2171,8 @@ static int decode_percent_hack(const cha
|
||||||
|
*key = NULL;
|
||||||
|
|
||||||
|
len = get_percent_decoded_len(name);
|
||||||
|
+ if (!len)
|
||||||
|
+ return 0;
|
||||||
|
new = malloc(len + 1);
|
||||||
|
if (!new)
|
||||||
|
return -1;
|
||||||
|
@@ -2998,6 +3012,9 @@ static int lookup_one(struct autofs_poin
|
||||||
|
attrs[1] = info;
|
||||||
|
attrs[2] = NULL;
|
||||||
|
|
||||||
|
+ enc_key1 = NULL;
|
||||||
|
+ enc_key2 = NULL;
|
||||||
|
+
|
||||||
|
if (*qKey == '*' && qKey_len == 1)
|
||||||
|
*qKey = '/';
|
||||||
|
else if (!strcasecmp(class, "nisObject")) {
|
||||||
|
--- autofs-5.1.4.orig/modules/parse_amd.c
|
||||||
|
+++ autofs-5.1.4/modules/parse_amd.c
|
||||||
|
@@ -1879,7 +1879,7 @@ struct amd_entry *make_default_entry(str
|
||||||
|
*/
|
||||||
|
map_type = conf_amd_get_map_type(ap->path);
|
||||||
|
if (map_type)
|
||||||
|
- defaults_entry->map_type = strdup(map_type);
|
||||||
|
+ defaults_entry->map_type = map_type;
|
||||||
|
/* The list should now be empty .... */
|
||||||
|
free_amd_entry_list(&dflts);
|
||||||
|
return defaults_entry;
|
||||||
|
@@ -2006,7 +2006,7 @@ static struct amd_entry *get_defaults_en
|
||||||
|
*/
|
||||||
|
char *map_type = conf_amd_get_map_type(ap->path);
|
||||||
|
if (map_type)
|
||||||
|
- entry->map_type = strdup(map_type);
|
||||||
|
+ entry->map_type = map_type;
|
||||||
|
}
|
||||||
|
free(expand);
|
||||||
|
}
|
||||||
|
--- autofs-5.1.4.orig/modules/parse_sun.c
|
||||||
|
+++ autofs-5.1.4/modules/parse_sun.c
|
||||||
|
@@ -443,8 +443,10 @@ int parse_reinit(int argc, const char *c
|
||||||
|
|
||||||
|
*new = default_context;
|
||||||
|
|
||||||
|
- if (do_init(argc, argv, new))
|
||||||
|
+ if (do_init(argc, argv, new)) {
|
||||||
|
+ free(new);
|
||||||
|
return 1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
kill_context(ctxt);
|
||||||
|
|
||||||
|
@@ -1143,6 +1145,9 @@ static int mount_subtree(struct autofs_p
|
||||||
|
const char *root;
|
||||||
|
int ro_len;
|
||||||
|
|
||||||
|
+ myoptions = NULL;
|
||||||
|
+ ro_loc = NULL;
|
||||||
|
+
|
||||||
|
rv = parse_mapent(ro->mapent,
|
||||||
|
options, &myoptions, &ro_loc, ap->logopt);
|
||||||
|
if (!rv) {
|
||||||
|
@@ -1524,6 +1529,9 @@ dont_expand:
|
||||||
|
p += l;
|
||||||
|
p = skipspace(p);
|
||||||
|
|
||||||
|
+ myoptions = NULL;
|
||||||
|
+ loc = NULL;
|
||||||
|
+
|
||||||
|
l = parse_mapent(p, options, &myoptions, &loc, ap->logopt);
|
||||||
|
if (!l) {
|
||||||
|
cache_delete_offset_list(mc, name);
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -26,6 +26,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix NFS version mask usage.
|
||||||
|
- fix fd leak in rpc_do_create_client().
|
||||||
|
- add-man page note about extra slashes in paths.
|
||||||
|
+- covarity fixes.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
@ -0,0 +1,48 @@
|
|||||||
|
autofs-5.1.4 - dont allow trailing slash in master map mount points
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
If a master map mount point path has a trailing '/' this can cause
|
||||||
|
problems so remove them at parse time.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/master_parse.y | 5 +++++
|
||||||
|
2 files changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 1e5ec15b..a7bb89dc 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -12,6 +12,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use_hostname_for_mounts shouldn't prevent selection among replicas.
|
||||||
|
- fix monotonic_elapsed.
|
||||||
|
- Makefiles.rules: remove 'samples' from SUBDIRS.
|
||||||
|
+- dont allow trailing slash in master map mount points.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/lib/master_parse.y b/lib/master_parse.y
|
||||||
|
index 42e03c2d..761ade9b 100644
|
||||||
|
--- a/lib/master_parse.y
|
||||||
|
+++ b/lib/master_parse.y
|
||||||
|
@@ -749,6 +749,7 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
|
||||||
|
struct map_source *source;
|
||||||
|
unsigned int logopt = logging;
|
||||||
|
unsigned int m_logopt = master->logopt;
|
||||||
|
+ size_t mp_len;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
local_init_vars();
|
||||||
|
@@ -763,6 +764,10 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ mp_len = strlen(path);
|
||||||
|
+ while (mp_len && path[--mp_len] == '/')
|
||||||
|
+ path[mp_len] = 0;
|
||||||
|
+
|
||||||
|
nc = master->nc;
|
||||||
|
|
||||||
|
/* Add null map entries to the null map cache */
|
@ -0,0 +1,56 @@
|
|||||||
|
autofs-5.1.4 - dont use array for path when not necessary
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
In parse_amd.c:do_link_mount() a character array is used to construct
|
||||||
|
a path when a pointer to the relevant amd entry field is sufficient.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/parse_amd.c | 6 +++---
|
||||||
|
2 files changed, 4 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 0f30596f..13f01397 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -3,6 +3,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix directory create permission.
|
||||||
|
- fix use after free in do_master_list_reset().
|
||||||
|
- fix deadlock in dumpmaps.
|
||||||
|
+- dont use array for path when not necessary.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||||
|
index c4b3ef0b..2cce5417 100644
|
||||||
|
--- a/modules/parse_amd.c
|
||||||
|
+++ b/modules/parse_amd.c
|
||||||
|
@@ -967,8 +967,8 @@ static int do_auto_mount(struct autofs_point *ap, const char *name,
|
||||||
|
static int do_link_mount(struct autofs_point *ap, const char *name,
|
||||||
|
struct amd_entry *entry, unsigned int flags)
|
||||||
|
{
|
||||||
|
- char target[PATH_MAX + 1];
|
||||||
|
const char *opts = (entry->opts && *entry->opts) ? entry->opts : NULL;
|
||||||
|
+ char *target;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (entry->sublink) {
|
||||||
|
@@ -977,14 +977,14 @@ static int do_link_mount(struct autofs_point *ap, const char *name,
|
||||||
|
"error: sublink option length is too long");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
- strcpy(target, entry->sublink);
|
||||||
|
+ target = entry->sublink;
|
||||||
|
} else {
|
||||||
|
if (strlen(entry->fs) > PATH_MAX) {
|
||||||
|
error(ap->logopt, MODPREFIX
|
||||||
|
"error: fs option length is too long");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
- strcpy(target, entry->fs);
|
||||||
|
+ target = entry->fs;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(flags & CONF_AUTOFS_USE_LOFS))
|
69
SOURCES/autofs-5.1.4-fix-NFS-version-mask-usage.patch
Normal file
69
SOURCES/autofs-5.1.4-fix-NFS-version-mask-usage.patch
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
autofs-5.1.4 - fix NFS version mask usage
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Upstream commit a8af65195 changed NFS_VERS_MASK to exclude NFSv2
|
||||||
|
so NFSv2 would be excluded in the default availability probe.
|
||||||
|
|
||||||
|
But NFS_VERS_MASK is used like a mask elsewhere and causes NFSv2
|
||||||
|
to be cleared for the availability probe even when it is requested.
|
||||||
|
|
||||||
|
So add a macro to NFS_VERS_DEFAULT (and accompanying macros) to be
|
||||||
|
used to set initial defaults and restore NFS_VERS_MASK to what it
|
||||||
|
should be when used as a mask.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
include/replicated.h | 5 ++++-
|
||||||
|
modules/mount_nfs.c | 6 +++---
|
||||||
|
3 files changed, 8 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -23,6 +23,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- tiny patch for autofs typo and possible bug.
|
||||||
|
- add units After line to include statd service.
|
||||||
|
- use systemd sd_notify() at startup.
|
||||||
|
+- fix NFS version mask usage.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/include/replicated.h
|
||||||
|
+++ autofs-5.1.4/include/replicated.h
|
||||||
|
@@ -26,7 +26,9 @@
|
||||||
|
#define NFS2_SUPPORTED 0x0010
|
||||||
|
#define NFS3_SUPPORTED 0x0020
|
||||||
|
#define NFS4_SUPPORTED 0x0040
|
||||||
|
-#define NFS_VERS_MASK (NFS3_SUPPORTED)
|
||||||
|
+#define NFS_VERS_DEFAULT (NFS3_SUPPORTED)
|
||||||
|
+#define NFS_VERS_MASK (NFS2_SUPPORTED|NFS3_SUPPORTED)
|
||||||
|
+#define NFS4_VERS_DEFAULT (NFS4_SUPPORTED)
|
||||||
|
#define NFS4_VERS_MASK (NFS4_SUPPORTED)
|
||||||
|
|
||||||
|
#define NFS2_REQUESTED NFS2_SUPPORTED
|
||||||
|
@@ -39,6 +41,7 @@
|
||||||
|
#define UDP_REQUESTED UDP_SUPPORTED
|
||||||
|
#define TCP6_REQUESTED 0x0100
|
||||||
|
#define UDP6_REQUESTED 0x0200
|
||||||
|
+#define NFS_PROTO_DEFAULT (TCP_SUPPORTED|UDP_SUPPORTED)
|
||||||
|
#define NFS_PROTO_MASK (TCP_SUPPORTED|UDP_SUPPORTED)
|
||||||
|
|
||||||
|
#define NFS2_TCP_SUPPORTED NFS2_SUPPORTED
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_nfs.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_nfs.c
|
||||||
|
@@ -86,11 +86,11 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
root, name, what, fstype, options);
|
||||||
|
|
||||||
|
mount_default_proto = defaults_get_mount_nfs_default_proto();
|
||||||
|
- vers = NFS_VERS_MASK | NFS_PROTO_MASK;
|
||||||
|
+ vers = NFS_VERS_DEFAULT | NFS_PROTO_DEFAULT;
|
||||||
|
if (strcmp(fstype, "nfs4") == 0)
|
||||||
|
- vers = NFS4_VERS_MASK | TCP_SUPPORTED;
|
||||||
|
+ vers = NFS4_VERS_DEFAULT | TCP_SUPPORTED;
|
||||||
|
else if (mount_default_proto == 4)
|
||||||
|
- vers = vers | NFS4_VERS_MASK;
|
||||||
|
+ vers = vers | NFS4_VERS_DEFAULT;
|
||||||
|
|
||||||
|
/* Extract "nosymlink" pseudo-option which stops local filesystems
|
||||||
|
* from being symlinked.
|
42
SOURCES/autofs-5.1.4-fix-age-setting-at-startup.patch
Normal file
42
SOURCES/autofs-5.1.4-fix-age-setting-at-startup.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
autofs-5.1.4 - fix age setting at startup
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Commit 2b567ace7d, which resets the master map list on startup
|
||||||
|
before retrying a read, incorrectly sets age using time() when
|
||||||
|
it should use monotonic_time().
|
||||||
|
|
||||||
|
This causes lookup failures for submounts in cases where a master
|
||||||
|
map read retry was needed.
|
||||||
|
|
||||||
|
The failure happens because the mount entry age is greater than
|
||||||
|
the map entry age which is meant to indicate the map is no longer
|
||||||
|
valid which is not the case.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -32,6 +32,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- mark removed cache entry negative.
|
||||||
|
- set bind mount as propagation slave.
|
||||||
|
- add master map pseudo options for mount propagation.
|
||||||
|
+- fix age setting at startup.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -2610,7 +2610,7 @@ int main(int argc, char *argv[])
|
||||||
|
* we have anyway.
|
||||||
|
*/
|
||||||
|
do_master_list_reset(master_list);
|
||||||
|
- age = time(NULL);
|
||||||
|
+ age = monotonic_time(NULL);
|
||||||
|
master_read_master(master_list, age, 1);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
autofs-5.1.4 - fix amd parser opts option handling
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The recent implementation of the amd map program mount feature
|
||||||
|
introduced a regression in the amd parser where only the first
|
||||||
|
option of a comma separated list of is applied to a mount entry.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/amd_parse.y | 4 ++--
|
||||||
|
modules/parse_amd.c | 4 +++-
|
||||||
|
3 files changed, 6 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -35,6 +35,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix age setting at startup.
|
||||||
|
- fix use after free in parse_ldap_config().
|
||||||
|
- fix incorrect locking in sss lookup.
|
||||||
|
+- fix amd parser opts option handling.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/modules/amd_parse.y
|
||||||
|
+++ autofs-5.1.4/modules/amd_parse.y
|
||||||
|
@@ -401,7 +401,7 @@ option_assignment: MAP_OPTION OPTION_ASS
|
||||||
|
}
|
||||||
|
| MNT_OPTION OPTION_ASSIGN options
|
||||||
|
{
|
||||||
|
- if (!match_mnt_option_options($1, $3)) {
|
||||||
|
+ if (!match_mnt_option_options($1, opts)) {
|
||||||
|
amd_notify($1);
|
||||||
|
YYABORT;
|
||||||
|
}
|
||||||
|
@@ -409,7 +409,7 @@ option_assignment: MAP_OPTION OPTION_ASS
|
||||||
|
}
|
||||||
|
| MNT_OPTION OPTION_ASSIGN QUOTE options QUOTE
|
||||||
|
{
|
||||||
|
- if (!match_mnt_option_options($1, $4)) {
|
||||||
|
+ if (!match_mnt_option_options($1, opts)) {
|
||||||
|
amd_notify($1);
|
||||||
|
YYABORT;
|
||||||
|
}
|
||||||
|
--- autofs-5.1.4.orig/modules/parse_amd.c
|
||||||
|
+++ autofs-5.1.4/modules/parse_amd.c
|
||||||
|
@@ -2136,6 +2136,7 @@ int parse_mount(struct autofs_point *ap,
|
||||||
|
list_del_init(&this->list);
|
||||||
|
cur_defaults = this;
|
||||||
|
update_with_defaults(defaults_entry, cur_defaults, sv);
|
||||||
|
+ debug(ap->logopt, "merged /defaults entry with defaults");
|
||||||
|
continue;
|
||||||
|
} else if (this->flags & AMD_DEFAULTS_RESET) {
|
||||||
|
struct amd_entry *nd, *new;
|
||||||
|
@@ -2174,8 +2175,9 @@ int parse_mount(struct autofs_point *ap,
|
||||||
|
|
||||||
|
at_least_one = 1;
|
||||||
|
|
||||||
|
- debug(ap->logopt, "expand mount entry");
|
||||||
|
+ debug(ap->logopt, "update mount entry with defaults");
|
||||||
|
update_with_defaults(cur_defaults, this, sv);
|
||||||
|
+ debug(ap->logopt, "expand mount entry");
|
||||||
|
sv = expand_entry(ap, this, flags, sv);
|
||||||
|
sv = merge_entry_options(ap, this, sv);
|
||||||
|
normalize_sublink(ap->logopt, this, sv);
|
40
SOURCES/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch
Normal file
40
SOURCES/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
autofs-5.1.4 - fix deadlock in dumpmaps
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Commit a223d11fa8e (autofs-5.1.3 - serialize calls to open_xxxx()
|
||||||
|
functions) introduces a deadlock when using the dumpmaps function.
|
||||||
|
|
||||||
|
In this case the open fd mutex needs to be unlocked in the forked
|
||||||
|
child process of the do_spawn() function.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/spawn.c | 1 +
|
||||||
|
2 files changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 2747327b..0f30596f 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -2,6 +2,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix flag file permission.
|
||||||
|
- fix directory create permission.
|
||||||
|
- fix use after free in do_master_list_reset().
|
||||||
|
+- fix deadlock in dumpmaps.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/daemon/spawn.c b/daemon/spawn.c
|
||||||
|
index fabe577e..dbbca7fa 100644
|
||||||
|
--- a/daemon/spawn.c
|
||||||
|
+++ b/daemon/spawn.c
|
||||||
|
@@ -338,6 +338,7 @@ static int do_spawn(unsigned logopt, unsigned int wait,
|
||||||
|
dup2(pipefd[1], STDOUT_FILENO);
|
||||||
|
dup2(pipefd[1], STDERR_FILENO);
|
||||||
|
close(pipefd[1]);
|
||||||
|
+ open_mutex_unlock();
|
||||||
|
|
||||||
|
/* what to mount must always be second last */
|
||||||
|
while (*pargv++)
|
207
SOURCES/autofs-5.1.4-fix-directory-create-permission.patch
Normal file
207
SOURCES/autofs-5.1.4-fix-directory-create-permission.patch
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
autofs-5.1.4 - fix directory create permission
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
autofs mount point directory creation is done using a permission of
|
||||||
|
0555.
|
||||||
|
|
||||||
|
But it is necessary to create directories within autofs mount points
|
||||||
|
for some map entry types so write access should be set for the owner
|
||||||
|
on mount point directories.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 2 ++
|
||||||
|
daemon/direct.c | 4 ++--
|
||||||
|
daemon/indirect.c | 2 +-
|
||||||
|
daemon/lookup.c | 2 +-
|
||||||
|
include/automount.h | 1 +
|
||||||
|
modules/mount_bind.c | 6 +++---
|
||||||
|
modules/mount_changer.c | 2 +-
|
||||||
|
modules/mount_ext2.c | 2 +-
|
||||||
|
modules/mount_generic.c | 2 +-
|
||||||
|
modules/mount_nfs.c | 2 +-
|
||||||
|
modules/parse_amd.c | 2 +-
|
||||||
|
12 files changed, 16 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index d07d88ce..4faab510 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -1,5 +1,6 @@
|
||||||
|
xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix flag file permission.
|
||||||
|
+- fix directory create permission.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/daemon/automount.c b/daemon/automount.c
|
||||||
|
index 5c739617..dcdc19fb 100644
|
||||||
|
--- a/daemon/automount.c
|
||||||
|
+++ b/daemon/automount.c
|
||||||
|
@@ -51,6 +51,8 @@ const char *libdir = AUTOFS_LIB_DIR; /* Location of library modules */
|
||||||
|
const char *mapdir = AUTOFS_MAP_DIR; /* Location of mount maps */
|
||||||
|
const char *confdir = AUTOFS_CONF_DIR; /* Location of autofs config file */
|
||||||
|
|
||||||
|
+unsigned int mp_mode = 0755;
|
||||||
|
+
|
||||||
|
unsigned int nfs_mount_uses_string_options = 0;
|
||||||
|
static struct nfs_mount_vers vers, check = {1, 1, 1};
|
||||||
|
|
||||||
|
diff --git a/daemon/direct.c b/daemon/direct.c
|
||||||
|
index 9a134351..3fdecdb8 100644
|
||||||
|
--- a/daemon/direct.c
|
||||||
|
+++ b/daemon/direct.c
|
||||||
|
@@ -424,7 +424,7 @@ int do_mount_autofs_direct(struct autofs_point *ap,
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||||||
|
- if (mkdir_path(me->key, 0555) < 0) {
|
||||||
|
+ if (mkdir_path(me->key, mp_mode) < 0) {
|
||||||
|
if (errno != EEXIST && errno != EROFS) {
|
||||||
|
crit(ap->logopt,
|
||||||
|
"failed to create mount directory %s", me->key);
|
||||||
|
@@ -739,7 +739,7 @@ int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, const char *
|
||||||
|
strcat(mountpoint, offset);
|
||||||
|
|
||||||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||||||
|
- if (mkdir_path(mountpoint, 0555) < 0) {
|
||||||
|
+ if (mkdir_path(mountpoint, mp_mode) < 0) {
|
||||||
|
if (errno == EEXIST) {
|
||||||
|
/*
|
||||||
|
* If the mount point directory is a real mount
|
||||||
|
diff --git a/daemon/indirect.c b/daemon/indirect.c
|
||||||
|
index ffb11b8c..03c081ed 100644
|
||||||
|
--- a/daemon/indirect.c
|
||||||
|
+++ b/daemon/indirect.c
|
||||||
|
@@ -133,7 +133,7 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||||||
|
- if (mkdir_path(root, 0555) < 0) {
|
||||||
|
+ if (mkdir_path(root, mp_mode) < 0) {
|
||||||
|
if (errno != EEXIST && errno != EROFS) {
|
||||||
|
crit(ap->logopt,
|
||||||
|
"failed to create autofs directory %s",
|
||||||
|
diff --git a/daemon/lookup.c b/daemon/lookup.c
|
||||||
|
index cb67e7d9..6a722b3b 100644
|
||||||
|
--- a/daemon/lookup.c
|
||||||
|
+++ b/daemon/lookup.c
|
||||||
|
@@ -802,7 +802,7 @@ int lookup_ghost(struct autofs_point *ap, const char *root)
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = mkdir_path(fullpath, 0555);
|
||||||
|
+ ret = mkdir_path(fullpath, mp_mode);
|
||||||
|
if (ret < 0 && errno != EEXIST) {
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
warn(ap->logopt,
|
||||||
|
diff --git a/include/automount.h b/include/automount.h
|
||||||
|
index 2e2c2b02..e5c19d23 100644
|
||||||
|
--- a/include/automount.h
|
||||||
|
+++ b/include/automount.h
|
||||||
|
@@ -269,6 +269,7 @@ void reset_signals(void);
|
||||||
|
int do_mount(struct autofs_point *ap, const char *root, const char *name,
|
||||||
|
int name_len, const char *what, const char *fstype,
|
||||||
|
const char *options);
|
||||||
|
+extern unsigned int mp_mode;
|
||||||
|
int mkdir_path(const char *path, mode_t mode);
|
||||||
|
int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev);
|
||||||
|
|
||||||
|
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
|
||||||
|
index 4864ea51..5effa880 100644
|
||||||
|
--- a/modules/mount_bind.c
|
||||||
|
+++ b/modules/mount_bind.c
|
||||||
|
@@ -151,7 +151,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
|
||||||
|
|
||||||
|
- status = mkdir_path(fullpath, 0555);
|
||||||
|
+ status = mkdir_path(fullpath, mp_mode);
|
||||||
|
if (status && errno != EEXIST) {
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
error(ap->logopt,
|
||||||
|
@@ -203,7 +203,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
||||||
|
} else {
|
||||||
|
debug(ap->logopt,
|
||||||
|
MODPREFIX "calling mkdir_path %s", basepath);
|
||||||
|
- if (mkdir_path(basepath, 0555) && errno != EEXIST) {
|
||||||
|
+ if (mkdir_path(basepath, mp_mode) && errno != EEXIST) {
|
||||||
|
char *estr;
|
||||||
|
estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
error(ap->logopt,
|
||||||
|
@@ -219,7 +219,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
||||||
|
"failed to create symlink %s -> %s",
|
||||||
|
fullpath, what);
|
||||||
|
if ((ap->flags & MOUNT_FLAG_GHOST) && !status) {
|
||||||
|
- if (mkdir_path(fullpath, 0555) && errno != EEXIST) {
|
||||||
|
+ if (mkdir_path(fullpath, mp_mode) && errno != EEXIST) {
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
error(ap->logopt,
|
||||||
|
MODPREFIX "mkdir_path %s failed: %s",
|
||||||
|
diff --git a/modules/mount_changer.c b/modules/mount_changer.c
|
||||||
|
index 798f23b2..7d44a720 100644
|
||||||
|
--- a/modules/mount_changer.c
|
||||||
|
+++ b/modules/mount_changer.c
|
||||||
|
@@ -87,7 +87,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
|
||||||
|
|
||||||
|
- status = mkdir_path(fullpath, 0555);
|
||||||
|
+ status = mkdir_path(fullpath, mp_mode);
|
||||||
|
if (status && errno != EEXIST) {
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
error(ap->logopt,
|
||||||
|
diff --git a/modules/mount_ext2.c b/modules/mount_ext2.c
|
||||||
|
index 90fc0876..3bbea95a 100644
|
||||||
|
--- a/modules/mount_ext2.c
|
||||||
|
+++ b/modules/mount_ext2.c
|
||||||
|
@@ -69,7 +69,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
|
||||||
|
|
||||||
|
- status = mkdir_path(fullpath, 0555);
|
||||||
|
+ status = mkdir_path(fullpath, mp_mode);
|
||||||
|
if (status && errno != EEXIST) {
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
error(ap->logopt,
|
||||||
|
diff --git a/modules/mount_generic.c b/modules/mount_generic.c
|
||||||
|
index ae637875..b1a3adbf 100644
|
||||||
|
--- a/modules/mount_generic.c
|
||||||
|
+++ b/modules/mount_generic.c
|
||||||
|
@@ -68,7 +68,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
|
||||||
|
|
||||||
|
- status = mkdir_path(fullpath, 0555);
|
||||||
|
+ status = mkdir_path(fullpath, mp_mode);
|
||||||
|
if (status && errno != EEXIST) {
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
error(ap->logopt,
|
||||||
|
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
|
||||||
|
index bf712a93..77166544 100644
|
||||||
|
--- a/modules/mount_nfs.c
|
||||||
|
+++ b/modules/mount_nfs.c
|
||||||
|
@@ -277,7 +277,7 @@ dont_probe:
|
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
|
||||||
|
|
||||||
|
- status = mkdir_path(fullpath, 0555);
|
||||||
|
+ status = mkdir_path(fullpath, mp_mode);
|
||||||
|
if (status && errno != EEXIST) {
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
error(ap->logopt,
|
||||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||||
|
index b40c1ad1..c4b3ef0b 100644
|
||||||
|
--- a/modules/parse_amd.c
|
||||||
|
+++ b/modules/parse_amd.c
|
||||||
|
@@ -1288,7 +1288,7 @@ static int do_program_mount(struct autofs_point *ap,
|
||||||
|
rv = 0;
|
||||||
|
ext_mount_add(&entry->ext_mount, entry->fs, 1);
|
||||||
|
} else {
|
||||||
|
- rv = mkdir_path(entry->fs, 0555);
|
||||||
|
+ rv = mkdir_path(entry->fs, mp_mode);
|
||||||
|
if (rv && errno != EEXIST) {
|
||||||
|
char buf[MAX_ERR_BUF];
|
||||||
|
char *estr;
|
35
SOURCES/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch
Normal file
35
SOURCES/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
autofs-5.1.4 - fix error return in do_nfs_mount()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Fix incorrect error return in modules/parse_amd.c:do_nfs_mount().
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/parse_amd.c | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 756ef927..d0cfa19b 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -6,6 +6,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- dont use array for path when not necessary.
|
||||||
|
- fix prefix option handling in expand_entry().
|
||||||
|
- fix sublink option not set from defaults.
|
||||||
|
+- fix error return in do_nfs_mount().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||||
|
index 1c962fff..2a5d9a30 100644
|
||||||
|
--- a/modules/parse_amd.c
|
||||||
|
+++ b/modules/parse_amd.c
|
||||||
|
@@ -1099,7 +1099,7 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name,
|
||||||
|
if (strlen(entry->rhost) + strlen(entry->rfs) + 1 > PATH_MAX) {
|
||||||
|
error(ap->logopt, MODPREFIX
|
||||||
|
"error: rhost + rfs options length is too long");
|
||||||
|
- return 0;
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(target, entry->rhost);
|
@ -0,0 +1,46 @@
|
|||||||
|
autofs-5.1.4 - fix fd leak in rpc_do_create_client()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Commit 94f87e203a (fix create_client() RPC client handling) fixed
|
||||||
|
possible use of an invalid RPC client handle but the change neglected
|
||||||
|
to account for a check in rpc_do_create_client() that would open a new
|
||||||
|
file descriptor without checking if the passed in descriptor was
|
||||||
|
already opened.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/rpc_subs.c | 4 ++--
|
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -24,6 +24,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add units After line to include statd service.
|
||||||
|
- use systemd sd_notify() at startup.
|
||||||
|
- fix NFS version mask usage.
|
||||||
|
+- fix fd leak in rpc_do_create_client().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/rpc_subs.c
|
||||||
|
+++ autofs-5.1.4/lib/rpc_subs.c
|
||||||
|
@@ -183,7 +183,7 @@ static int rpc_do_create_client(struct s
|
||||||
|
in4_laddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
slen = sizeof(struct sockaddr_in);
|
||||||
|
|
||||||
|
- if (!info->client) {
|
||||||
|
+ if (!info->client && *fd == RPC_ANYSOCK) {
|
||||||
|
struct sockaddr *laddr;
|
||||||
|
|
||||||
|
*fd = open_sock(addr->sa_family, type, proto);
|
||||||
|
@@ -296,7 +296,7 @@ static int rpc_do_create_client(struct s
|
||||||
|
* it would bind to a reserved port, which has been shown to
|
||||||
|
* exhaust the reserved port range in some situations.
|
||||||
|
*/
|
||||||
|
- if (!info->client) {
|
||||||
|
+ if (!info->client && *fd == RPC_ANYSOCK) {
|
||||||
|
*fd = open_sock(addr->sa_family, type, proto);
|
||||||
|
if (*fd < 0) {
|
||||||
|
ret = -errno;
|
41
SOURCES/autofs-5.1.4-fix-flag-file-permission.patch
Normal file
41
SOURCES/autofs-5.1.4-fix-flag-file-permission.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
autofs-5.1.4 - fix flag file permission
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The flag file used to check if automount(8) is running was being
|
||||||
|
created with mode 0 which caused unnecessary dac_override AVC
|
||||||
|
failures.
|
||||||
|
|
||||||
|
There's no reason to protect this file so just use 0644 as the
|
||||||
|
file permission.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 3 +++
|
||||||
|
daemon/flag.c | 2 +-
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 246279ae..d07d88ce 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -1,3 +1,6 @@
|
||||||
|
+xx/xx/2018 autofs-5.1.5
|
||||||
|
+- fix flag file permission.
|
||||||
|
+
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
- fix unset tsd group name handling.
|
||||||
|
diff --git a/daemon/flag.c b/daemon/flag.c
|
||||||
|
index 99f26847..ff9858c8 100644
|
||||||
|
--- a/daemon/flag.c
|
||||||
|
+++ b/daemon/flag.c
|
||||||
|
@@ -164,7 +164,7 @@ int aquire_flag_file(void)
|
||||||
|
while (!we_created_flagfile) {
|
||||||
|
int errsv, i, j;
|
||||||
|
|
||||||
|
- i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0);
|
||||||
|
+ i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0644);
|
||||||
|
if (i < 0) {
|
||||||
|
release_flag_file();
|
||||||
|
return 0;
|
@ -0,0 +1,40 @@
|
|||||||
|
autofs-5.1.4 - fix incorrect locking in sss lookup
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Commit 766e0f6c4, autofs-5.0.7 - fix fix wildcard multi map regression,
|
||||||
|
introduced a deadlock during restart when the sss modules is used.
|
||||||
|
|
||||||
|
Looking at the comment above the code which takes the lock it clearly
|
||||||
|
does this incorrectly.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/lookup_sss.c | 4 ++--
|
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -34,6 +34,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add master map pseudo options for mount propagation.
|
||||||
|
- fix age setting at startup.
|
||||||
|
- fix use after free in parse_ldap_config().
|
||||||
|
+- fix incorrect locking in sss lookup.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/modules/lookup_sss.c
|
||||||
|
+++ autofs-5.1.4/modules/lookup_sss.c
|
||||||
|
@@ -786,9 +786,9 @@ int lookup_mount(struct autofs_point *ap
|
||||||
|
* when we're starting up so just take the readlock in that
|
||||||
|
*/
|
||||||
|
if (ap->flags & MOUNT_FLAG_REMOUNT)
|
||||||
|
- cache_writelock(mc);
|
||||||
|
- else
|
||||||
|
cache_readlock(mc);
|
||||||
|
+ else
|
||||||
|
+ cache_writelock(mc);
|
||||||
|
me = cache_lookup(mc, key);
|
||||||
|
/* Stale mapent => check for entry in alternate source or wildcard */
|
||||||
|
if (me && !me->mapent) {
|
94
SOURCES/autofs-5.1.4-fix-libresolv-configure-check.patch
Normal file
94
SOURCES/autofs-5.1.4-fix-libresolv-configure-check.patch
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
autofs-5.1.4 - fix libresolv configure check
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The libresolv functions are not found by AC_CHECK_LIB() unless
|
||||||
|
they are prefixed with "__".
|
||||||
|
|
||||||
|
So change the library check to also look for __<function> during
|
||||||
|
the check.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
configure | 41 +++++++++++++++++++++++++++++++++++++++++
|
||||||
|
configure.in | 2 +-
|
||||||
|
3 files changed, 43 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index a7bb89dc..dbfb8389 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -13,6 +13,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix monotonic_elapsed.
|
||||||
|
- Makefiles.rules: remove 'samples' from SUBDIRS.
|
||||||
|
- dont allow trailing slash in master map mount points.
|
||||||
|
+- fix libresolv configure check.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/configure b/configure
|
||||||
|
index 2d517aac..5c8aae30 100755
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -4821,6 +4821,47 @@ fi
|
||||||
|
$as_echo "$ac_cv_lib_resolv_res_query" >&6; }
|
||||||
|
if test "x$ac_cv_lib_resolv_res_query" = xyes; then :
|
||||||
|
LIBRESOLV="-lresolv"
|
||||||
|
+else
|
||||||
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __res_query in -lresolv" >&5
|
||||||
|
+$as_echo_n "checking for __res_query in -lresolv... " >&6; }
|
||||||
|
+if ${ac_cv_lib_resolv___res_query+:} false; then :
|
||||||
|
+ $as_echo_n "(cached) " >&6
|
||||||
|
+else
|
||||||
|
+ ac_check_lib_save_LIBS=$LIBS
|
||||||
|
+LIBS="-lresolv $LIBS"
|
||||||
|
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
+/* end confdefs.h. */
|
||||||
|
+
|
||||||
|
+/* Override any GCC internal prototype to avoid an error.
|
||||||
|
+ Use char because int might match the return type of a GCC
|
||||||
|
+ builtin and then its argument prototype would still apply. */
|
||||||
|
+#ifdef __cplusplus
|
||||||
|
+extern "C"
|
||||||
|
+#endif
|
||||||
|
+char __res_query ();
|
||||||
|
+int
|
||||||
|
+main ()
|
||||||
|
+{
|
||||||
|
+return __res_query ();
|
||||||
|
+ ;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+_ACEOF
|
||||||
|
+if ac_fn_c_try_link "$LINENO"; then :
|
||||||
|
+ ac_cv_lib_resolv___res_query=yes
|
||||||
|
+else
|
||||||
|
+ ac_cv_lib_resolv___res_query=no
|
||||||
|
+fi
|
||||||
|
+rm -f core conftest.err conftest.$ac_objext \
|
||||||
|
+ conftest$ac_exeext conftest.$ac_ext
|
||||||
|
+LIBS=$ac_check_lib_save_LIBS
|
||||||
|
+fi
|
||||||
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv___res_query" >&5
|
||||||
|
+$as_echo "$ac_cv_lib_resolv___res_query" >&6; }
|
||||||
|
+if test "x$ac_cv_lib_resolv___res_query" = xyes; then :
|
||||||
|
+ LIBRESOLV="-lresolv"
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/configure.in b/configure.in
|
||||||
|
index d74775cc..4d1208f5 100644
|
||||||
|
--- a/configure.in
|
||||||
|
+++ b/configure.in
|
||||||
|
@@ -217,7 +217,7 @@ AC_SUBST(NSL_LIBS)
|
||||||
|
NSL_CFLAGS=""
|
||||||
|
])
|
||||||
|
|
||||||
|
-AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv")
|
||||||
|
+AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv", AC_CHECK_LIB(resolv, __res_query, LIBRESOLV="-lresolv"))
|
||||||
|
AC_SUBST(LIBRESOLV)
|
||||||
|
|
||||||
|
#
|
49
SOURCES/autofs-5.1.4-fix-monotonic_elapsed.patch
Normal file
49
SOURCES/autofs-5.1.4-fix-monotonic_elapsed.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
autofs-5.1.4 - fix monotonic_elapsed
|
||||||
|
|
||||||
|
From: NeilBrown <neilb@suse.com>
|
||||||
|
|
||||||
|
When automount probes multiple hosts to find the one which
|
||||||
|
responds most quickly, it currently ignores the nanoseconds.
|
||||||
|
This often makes the cost "0", which makes weights ineffective.
|
||||||
|
|
||||||
|
The cause is that monotonic_elapsed() casts tv_nsec to a
|
||||||
|
double *after* dividing by 1 billion, rather than before.
|
||||||
|
|
||||||
|
With this change, weights become effective for choosing
|
||||||
|
between hosts which respond in under one second.
|
||||||
|
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.com>
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/rpc_subs.c | 4 ++--
|
||||||
|
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 104fca90..313730b1 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -10,6 +10,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add error handling for ext_mount_add().
|
||||||
|
- account for recent libnsl changes.
|
||||||
|
- use_hostname_for_mounts shouldn't prevent selection among replicas.
|
||||||
|
+- fix monotonic_elapsed.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
|
||||||
|
index 73097c9d..60ede9f8 100644
|
||||||
|
--- a/lib/rpc_subs.c
|
||||||
|
+++ b/lib/rpc_subs.c
|
||||||
|
@@ -1093,9 +1093,9 @@ double monotonic_elapsed(struct timespec start, struct timespec end)
|
||||||
|
double t1, t2;
|
||||||
|
|
||||||
|
t1 = (double) start.tv_sec +
|
||||||
|
- (double) (start.tv_nsec/(1000*1000*1000));
|
||||||
|
+ ((double) start.tv_nsec/(1000*1000*1000));
|
||||||
|
t2 = (double) end.tv_sec +
|
||||||
|
- (double) (end.tv_nsec/(1000*1000*1000));
|
||||||
|
+ ((double) end.tv_nsec/(1000*1000*1000));
|
||||||
|
return t2 - t1;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,55 @@
|
|||||||
|
autofs-5.1.4 - fix prefix option handling in expand_entry()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The changes to fix the defaults handling in the amd map parser caused
|
||||||
|
the prefix option to not be expanded and also to not be propagated to
|
||||||
|
submounts in some cases.
|
||||||
|
|
||||||
|
But the prefix should be expanded in modules/parse_amd.c:expand_entry()
|
||||||
|
along with the reset of the amd map entry fields.
|
||||||
|
|
||||||
|
Just adding this to modules/parse_amd.c:expand_entry() (where it should
|
||||||
|
be) fixes the amd map entry expansion and also fixes the propagation
|
||||||
|
of the prefix to submounts.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/parse_amd.c | 11 +++++++++++
|
||||||
|
2 files changed, 12 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 13f01397..19aec2ae 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -4,6 +4,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix use after free in do_master_list_reset().
|
||||||
|
- fix deadlock in dumpmaps.
|
||||||
|
- dont use array for path when not necessary.
|
||||||
|
+- fix prefix option handling in expand_entry().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||||
|
index 2cce5417..1a5a2960 100644
|
||||||
|
--- a/modules/parse_amd.c
|
||||||
|
+++ b/modules/parse_amd.c
|
||||||
|
@@ -725,6 +725,17 @@ static struct substvar *expand_entry(struct autofs_point *ap,
|
||||||
|
entry->rhost = host;
|
||||||
|
}
|
||||||
|
next:
|
||||||
|
+ if (entry->pref) {
|
||||||
|
+ if (expand_selectors(ap, entry->pref, &expand, sv)) {
|
||||||
|
+ debug(logopt, MODPREFIX
|
||||||
|
+ "pref expand(\"%s\") -> %s",
|
||||||
|
+ entry->pref, expand);
|
||||||
|
+ free(entry->pref);
|
||||||
|
+ entry->pref = expand;
|
||||||
|
+ }
|
||||||
|
+ sv = macro_addvar(sv, "pref", 4, entry->pref);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (entry->sublink) {
|
||||||
|
if (expand_selectors(ap, entry->sublink, &expand, sv)) {
|
||||||
|
debug(logopt, MODPREFIX
|
40
SOURCES/autofs-5.1.4-fix-program-usage-message.patch
Normal file
40
SOURCES/autofs-5.1.4-fix-program-usage-message.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
autofs-5.1.4 - fix program usage message
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
There is a discrepancy between the list of options in the usage
|
||||||
|
message of automount(8) and the options listed in the man page.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 6 +++++-
|
||||||
|
2 files changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -27,6 +27,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix fd leak in rpc_do_create_client().
|
||||||
|
- add-man page note about extra slashes in paths.
|
||||||
|
- covarity fixes.
|
||||||
|
+- fix program usage message.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -1893,9 +1893,13 @@ static void usage(void)
|
||||||
|
" -h --help this text\n"
|
||||||
|
" -p --pid-file f write process id to file f\n"
|
||||||
|
" -t --timeout n auto-unmount in n seconds (0-disable)\n"
|
||||||
|
+ " -M --master-wait n\n"
|
||||||
|
+ " maximum wait time (seconds) for master\n"
|
||||||
|
+ " map to become available\n"
|
||||||
|
" -v --verbose be verbose\n"
|
||||||
|
" -d --debug log debuging info\n"
|
||||||
|
- " -D --define define global macro variable\n"
|
||||||
|
+ " -Dvariable=value, --define variable=value\n"
|
||||||
|
+ " define global macro variable\n"
|
||||||
|
" -f --foreground do not fork into background\n"
|
||||||
|
" -r --random-multimount-selection\n"
|
||||||
|
" use ramdom replicated server selection\n"
|
@ -0,0 +1,48 @@
|
|||||||
|
autofs-5.1.4 - fix sublink option not set from defaults
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
If the amd entry sublink option is given in a defaults entry
|
||||||
|
it isn't merged into the current entry during parsing.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/parse_amd.c | 12 ++++++++++++
|
||||||
|
2 files changed, 13 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 19aec2ae..756ef927 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -5,6 +5,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix deadlock in dumpmaps.
|
||||||
|
- dont use array for path when not necessary.
|
||||||
|
- fix prefix option handling in expand_entry().
|
||||||
|
+- fix sublink option not set from defaults.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||||
|
index 1a5a2960..1c962fff 100644
|
||||||
|
--- a/modules/parse_amd.c
|
||||||
|
+++ b/modules/parse_amd.c
|
||||||
|
@@ -645,6 +645,18 @@ static void update_with_defaults(struct amd_entry *defaults,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (!entry->sublink) {
|
||||||
|
+ if (defaults->sublink) {
|
||||||
|
+ tmp = strdup(defaults->sublink);
|
||||||
|
+ if (tmp)
|
||||||
|
+ entry->sublink = tmp;
|
||||||
|
+ } else {
|
||||||
|
+ v = macro_findvar(sv, "sublink", 2);
|
||||||
|
+ if (v)
|
||||||
|
+ entry->sublink = strdup(v->val);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,98 @@
|
|||||||
|
autofs-5.1.4 - fix update_negative_cache() map source usage
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
File map sources can be either plain text or executable.
|
||||||
|
|
||||||
|
When the map path is specified without a type (eg. when a
|
||||||
|
full path is used) an instance map source is used and the
|
||||||
|
original map is left unchanged.
|
||||||
|
|
||||||
|
But update_negative_cache() fails to take this into account
|
||||||
|
causing it to update the wrong map cache.
|
||||||
|
|
||||||
|
When a map reload is done the map entry appears to not exist
|
||||||
|
so the new map entry is added.
|
||||||
|
|
||||||
|
This could go unnoticed except that, after a map read, the
|
||||||
|
map entry cache cleans stale map entries and the existence
|
||||||
|
of this negative entry causes the new map entry to be deleted
|
||||||
|
and map lookups continue to fail.
|
||||||
|
|
||||||
|
In hindsite the use of an instance map source for this is
|
||||||
|
probably uneccessary but changing it will be risky so, for
|
||||||
|
now, just make update_negative_cache() use the correct map.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/lookup.c | 38 ++++++++++++++++++++++++++++++++++++--
|
||||||
|
2 files changed, 37 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -28,6 +28,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add-man page note about extra slashes in paths.
|
||||||
|
- covarity fixes.
|
||||||
|
- fix program usage message.
|
||||||
|
+- fix update_negative_cache() map source usage.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/lookup.c
|
||||||
|
+++ autofs-5.1.4/daemon/lookup.c
|
||||||
|
@@ -1100,6 +1100,37 @@ static enum nsswitch_status lookup_map_n
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static struct map_source *lookup_get_map_source(struct master_mapent *entry)
|
||||||
|
+{
|
||||||
|
+ struct map_source *map = entry->maps;
|
||||||
|
+ struct stat st;
|
||||||
|
+ char *type;
|
||||||
|
+
|
||||||
|
+ if (map->type || *map->argv[0] != '/')
|
||||||
|
+ return map;
|
||||||
|
+
|
||||||
|
+ if (*(map->argv[0] + 1) == '/')
|
||||||
|
+ return map;
|
||||||
|
+
|
||||||
|
+ if (stat(map->argv[0], &st) == -1)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ if (!S_ISREG(st.st_mode))
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ if (st.st_mode & __S_IEXEC)
|
||||||
|
+ type = "program";
|
||||||
|
+ else
|
||||||
|
+ type = "file";
|
||||||
|
+
|
||||||
|
+ /* This is a file source with a path starting with "/".
|
||||||
|
+ * But file maps can be either plain text or executable
|
||||||
|
+ * so they use a map instance and the actual map source
|
||||||
|
+ * remains untouched.
|
||||||
|
+ */
|
||||||
|
+ return master_find_source_instance(map, type, map->format, 0, NULL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void update_negative_cache(struct autofs_point *ap, struct map_source *source, const char *name)
|
||||||
|
{
|
||||||
|
struct master_mapent *entry = ap->entry;
|
||||||
|
@@ -1133,11 +1164,14 @@ static void update_negative_cache(struct
|
||||||
|
logmsg("key \"%s\" not found in map source(s).", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Doesn't exist in any source, just add it somewhere */
|
||||||
|
+ /* Doesn't exist in any source, just add it somewhere.
|
||||||
|
+ * Also take care to use the same map source used by
|
||||||
|
+ * map reads and key lookups for the update.
|
||||||
|
+ */
|
||||||
|
if (source)
|
||||||
|
map = source;
|
||||||
|
else
|
||||||
|
- map = entry->maps;
|
||||||
|
+ map = lookup_get_map_source(entry);
|
||||||
|
if (map) {
|
||||||
|
time_t now = monotonic_time(NULL);
|
||||||
|
int rv = CHE_FAIL;
|
@ -0,0 +1,55 @@
|
|||||||
|
autofs-5.1.4 - fix use after free in do_master_list_reset()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Umm ... list_for_each() can't be used in do_master_list_reset() because
|
||||||
|
the subject entry of the loop is removed for the list within the loop
|
||||||
|
body. Therefore it can't be used to calculate the next pointer within a
|
||||||
|
for (...) loop.
|
||||||
|
|
||||||
|
There is no list_for_each_safe() macro in the list.h of autofs so it
|
||||||
|
needs to be done manually.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 8 ++++++--
|
||||||
|
2 files changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 4faab510..2747327b 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix flag file permission.
|
||||||
|
- fix directory create permission.
|
||||||
|
+- fix use after free in do_master_list_reset().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/daemon/automount.c b/daemon/automount.c
|
||||||
|
index dcdc19fb..28b3f2f5 100644
|
||||||
|
--- a/daemon/automount.c
|
||||||
|
+++ b/daemon/automount.c
|
||||||
|
@@ -2070,14 +2070,18 @@ static void remove_empty_args(char **argv, int *argc)
|
||||||
|
|
||||||
|
static void do_master_list_reset(struct master *master)
|
||||||
|
{
|
||||||
|
- struct list_head *head, *p;
|
||||||
|
+ struct list_head *head, *p, *n;
|
||||||
|
|
||||||
|
master_mutex_lock();
|
||||||
|
|
||||||
|
head = &master->mounts;
|
||||||
|
- list_for_each(p, head) {
|
||||||
|
+ n = head->next;
|
||||||
|
+ while (n != head) {
|
||||||
|
struct master_mapent *entry;
|
||||||
|
|
||||||
|
+ p = n;
|
||||||
|
+ n = p->next;
|
||||||
|
+
|
||||||
|
entry = list_entry(p, struct master_mapent, list);
|
||||||
|
|
||||||
|
if (!list_empty(&entry->list))
|
@ -0,0 +1,34 @@
|
|||||||
|
autofs-5.1.4 - fix use after free in parse_ldap_config()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Commit a4a2af5f30 (covarity fixes) incorrecly frees local variable
|
||||||
|
authtype after assigning it to a lookup context structure member.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/lookup_ldap.c | 2 --
|
||||||
|
2 files changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -33,6 +33,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- set bind mount as propagation slave.
|
||||||
|
- add master map pseudo options for mount propagation.
|
||||||
|
- fix age setting at startup.
|
||||||
|
+- fix use after free in parse_ldap_config().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/modules/lookup_ldap.c
|
||||||
|
+++ autofs-5.1.4/modules/lookup_ldap.c
|
||||||
|
@@ -1383,8 +1383,6 @@ auth_fail:
|
||||||
|
user, secret ? "specified" : "unspecified",
|
||||||
|
client_princ, client_cc);
|
||||||
|
}
|
||||||
|
- if (authtype)
|
||||||
|
- free(authtype);
|
||||||
|
out:
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
if (auth_conf)
|
123
SOURCES/autofs-5.1.4-improve-hostname-lookup-error-logging.patch
Normal file
123
SOURCES/autofs-5.1.4-improve-hostname-lookup-error-logging.patch
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
autofs-5.1.4 - improve hostname lookup error logging
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
There's not enough information in name lookup log messages
|
||||||
|
to determine if the failed lookup is in fact a problem or
|
||||||
|
is expected.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/parse_subs.c | 3 ++-
|
||||||
|
lib/rpc_subs.c | 3 ++-
|
||||||
|
modules/dclist.c | 4 +++-
|
||||||
|
modules/parse_amd.c | 9 ++++++---
|
||||||
|
modules/replicated.c | 5 +++--
|
||||||
|
6 files changed, 17 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index f771a433..596590a8 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -19,6 +19,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add fedfs-map-nfs4.c.
|
||||||
|
- add conditional inclusion of fedfs binaries.
|
||||||
|
- add an example fedfs master map entry to the installed master map.
|
||||||
|
+- improve hostname lookup error logging.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/lib/parse_subs.c b/lib/parse_subs.c
|
||||||
|
index db784a58..841e81fd 100644
|
||||||
|
--- a/lib/parse_subs.c
|
||||||
|
+++ b/lib/parse_subs.c
|
||||||
|
@@ -476,7 +476,8 @@ unsigned int get_network_proximity(const char *name)
|
||||||
|
|
||||||
|
ret = getaddrinfo(name_or_num, NULL, &hints, &ni);
|
||||||
|
if (ret) {
|
||||||
|
- logerr("getaddrinfo: %s", gai_strerror(ret));
|
||||||
|
+ logerr("hostname lookup for %s failed: %s",
|
||||||
|
+ name_or_num, gai_strerror(ret));
|
||||||
|
return PROXIMITY_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
|
||||||
|
index 60ede9f8..cc83e84d 100644
|
||||||
|
--- a/lib/rpc_subs.c
|
||||||
|
+++ b/lib/rpc_subs.c
|
||||||
|
@@ -693,7 +693,8 @@ static int create_client(struct conn_info *info, CLIENT **client)
|
||||||
|
ret = getaddrinfo(info->host, NULL, &hints, &ai);
|
||||||
|
if (ret) {
|
||||||
|
error(LOGOPT_ANY,
|
||||||
|
- "hostname lookup failed: %s", gai_strerror(ret));
|
||||||
|
+ "hostname lookup for %s failed: %s",
|
||||||
|
+ info->host, gai_strerror(ret));
|
||||||
|
goto out_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/modules/dclist.c b/modules/dclist.c
|
||||||
|
index 4daa199b..ba32134d 100644
|
||||||
|
--- a/modules/dclist.c
|
||||||
|
+++ b/modules/dclist.c
|
||||||
|
@@ -357,7 +357,9 @@ static char *getdnsdomainname(unsigned int logopt)
|
||||||
|
|
||||||
|
ret = getaddrinfo(name, NULL, &hints, &ni);
|
||||||
|
if (ret) {
|
||||||
|
- error(logopt, "hostname lookup failed: %s", gai_strerror(ret));
|
||||||
|
+ error(logopt,
|
||||||
|
+ "hostname lookup for %s failed: %s",
|
||||||
|
+ name, gai_strerror(ret));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
||||||
|
index e7debc56..9543ced3 100644
|
||||||
|
--- a/modules/parse_amd.c
|
||||||
|
+++ b/modules/parse_amd.c
|
||||||
|
@@ -260,7 +260,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar
|
||||||
|
ret = getaddrinfo(v->val, NULL, &hints, &cni);
|
||||||
|
if (ret) {
|
||||||
|
error(logopt, MODPREFIX
|
||||||
|
- "hostname lookup failed: %s\n", gai_strerror(ret));
|
||||||
|
+ "hostname lookup for %s failed: %s\n",
|
||||||
|
+ v->val, gai_strerror(ret));
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -270,7 +271,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar
|
||||||
|
ret = getaddrinfo(name, NULL, &hints, &ni);
|
||||||
|
if (ret) {
|
||||||
|
error(logopt, MODPREFIX
|
||||||
|
- "hostname lookup failed: %s\n", gai_strerror(ret));
|
||||||
|
+ "hostname lookup for %s failed: %s\n",
|
||||||
|
+ name, gai_strerror(ret));
|
||||||
|
freeaddrinfo(cni);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
@@ -678,7 +680,8 @@ static char *normalize_hostname(unsigned int logopt, const char *host,
|
||||||
|
ret = getaddrinfo(host, NULL, &hints, &ni);
|
||||||
|
if (ret) {
|
||||||
|
error(logopt, MODPREFIX
|
||||||
|
- "hostname lookup failed: %s", gai_strerror(ret));
|
||||||
|
+ "hostname lookup for %s failed: %s",
|
||||||
|
+ host, gai_strerror(ret));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
name = strdup(ni->ai_canonname);
|
||||||
|
diff --git a/modules/replicated.c b/modules/replicated.c
|
||||||
|
index f7b83236..740270ec 100644
|
||||||
|
--- a/modules/replicated.c
|
||||||
|
+++ b/modules/replicated.c
|
||||||
|
@@ -1007,8 +1007,9 @@ try_name:
|
||||||
|
|
||||||
|
ret = getaddrinfo(name, NULL, &hints, &ni);
|
||||||
|
if (ret) {
|
||||||
|
- error(LOGOPT_ANY, "hostname lookup failed: %s",
|
||||||
|
- gai_strerror(ret));
|
||||||
|
+ error(LOGOPT_ANY,
|
||||||
|
+ "hostname lookup for %s failed: %s",
|
||||||
|
+ name, gai_strerror(ret));
|
||||||
|
free(name);
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
autofs-5.1.4 - make umount_ent() recognise forced umount
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
When doing a forced shutdown umount_ent() tries a normal expire
|
||||||
|
first resulting in a fair amount of unnecessary log noise.
|
||||||
|
|
||||||
|
Change umount_ent() to do a forced expire when a forced shutdown
|
||||||
|
has been requested to avoid the log noise.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
lib/mounts.c | 16 +++++++++-------
|
||||||
|
1 file changed, 9 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -2984,14 +2984,16 @@ int umount_ent(struct autofs_point *ap,
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
- rv = spawn_umount(ap->logopt, path, NULL);
|
||||||
|
- /* We are doing a forced shutcwdown down so unlink busy mounts */
|
||||||
|
- if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) {
|
||||||
|
- if (ap->state == ST_SHUTDOWN_FORCE) {
|
||||||
|
- info(ap->logopt, "forcing umount of %s", path);
|
||||||
|
- rv = spawn_umount(ap->logopt, "-l", path, NULL);
|
||||||
|
- }
|
||||||
|
+ if (ap->state != ST_SHUTDOWN_FORCE)
|
||||||
|
+ rv = spawn_umount(ap->logopt, path, NULL);
|
||||||
|
+ else {
|
||||||
|
+ /* We are doing a forced shutdown so unlink busy
|
||||||
|
+ * mounts */
|
||||||
|
+ info(ap->logopt, "forcing umount of %s", path);
|
||||||
|
+ rv = spawn_umount(ap->logopt, "-l", path, NULL);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
+ if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) {
|
||||||
|
/*
|
||||||
|
* Verify that we actually unmounted the thing. This is a
|
||||||
|
* belt and suspenders approach to not eating user data.
|
64
SOURCES/autofs-5.1.4-mark-removed-cache-entry-negative.patch
Normal file
64
SOURCES/autofs-5.1.4-mark-removed-cache-entry-negative.patch
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
autofs-5.1.4 - mark removed cache entry negative
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
When re-reading a map entries that have been removed are detected
|
||||||
|
and deleted from the map entry cache by lookup_prune_cache().
|
||||||
|
|
||||||
|
If a removed map entry is mounted at the time lookup_prune_cache()
|
||||||
|
is called the map entry is skippedi. This is done becuase the next
|
||||||
|
lookup (following the mount expire, which needs the cache entry to
|
||||||
|
remain) will detect the stale cache entry and a map update done
|
||||||
|
resulting in the istale entry being removed.
|
||||||
|
|
||||||
|
But if a map re-read is performed while the cache entry is mounted
|
||||||
|
the cache will appear to up to date so the removed entry will remain
|
||||||
|
valid even after it has expired.
|
||||||
|
|
||||||
|
To cover this case it's sufficient to mark the mounted cache entry
|
||||||
|
negative during the cache prune which prevent further lookups from
|
||||||
|
using the stale entry.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/lookup.c | 12 +++++++++---
|
||||||
|
2 files changed, 10 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -29,6 +29,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- covarity fixes.
|
||||||
|
- fix program usage message.
|
||||||
|
- fix update_negative_cache() map source usage.
|
||||||
|
+- mark removed cache entry negative.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/lookup.c
|
||||||
|
+++ autofs-5.1.4/daemon/lookup.c
|
||||||
|
@@ -1417,15 +1417,21 @@ void lookup_prune_one_cache(struct autof
|
||||||
|
if (valid && valid->mc == mc) {
|
||||||
|
/*
|
||||||
|
* We've found a map entry that has been removed from
|
||||||
|
- * the current cache so it isn't really valid.
|
||||||
|
+ * the current cache so it isn't really valid. Set the
|
||||||
|
+ * mapent negative to prevent further mount requests
|
||||||
|
+ * using the cache entry.
|
||||||
|
*/
|
||||||
|
+ debug(ap->logopt, "removed map entry detected, mark negative");
|
||||||
|
+ if (valid->mapent) {
|
||||||
|
+ free(valid->mapent);
|
||||||
|
+ valid->mapent = NULL;
|
||||||
|
+ }
|
||||||
|
cache_unlock(valid->mc);
|
||||||
|
valid = NULL;
|
||||||
|
}
|
||||||
|
if (!valid &&
|
||||||
|
is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
|
||||||
|
- debug(ap->logopt,
|
||||||
|
- "prune check posponed, %s mounted", path);
|
||||||
|
+ debug(ap->logopt, "prune posponed, %s mounted", path);
|
||||||
|
free(key);
|
||||||
|
free(path);
|
||||||
|
continue;
|
@ -0,0 +1,117 @@
|
|||||||
|
autofs-5.1.4 - move close stdio descriptors to become_daemon()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Move the stdio file descriptor close to the become_daemon() function
|
||||||
|
as closing these file descriptors, ie. detaching from ttys, is part
|
||||||
|
of the preperation for becoming a system daemon.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 27 ++++++++++++++++++++++++++-
|
||||||
|
include/log.h | 1 -
|
||||||
|
lib/log.c | 29 -----------------------------
|
||||||
|
4 files changed, 27 insertions(+), 31 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -42,6 +42,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add NULL check in prepare_attempt_prefix().
|
||||||
|
- update build info with systemd.
|
||||||
|
- use flags for startup boolean options.
|
||||||
|
+- move close stdio descriptors to become_daemon().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -1218,6 +1218,8 @@ static void become_daemon(unsigned int f
|
||||||
|
}
|
||||||
|
log_to_stderr();
|
||||||
|
} else {
|
||||||
|
+ int nullfd;
|
||||||
|
+
|
||||||
|
if (open_pipe(start_pipefd) < 0) {
|
||||||
|
fprintf(stderr, "%s: failed to create start_pipefd.\n",
|
||||||
|
program);
|
||||||
|
@@ -1261,7 +1263,30 @@ static void become_daemon(unsigned int f
|
||||||
|
close(start_pipefd[1]);
|
||||||
|
exit(*pst_stat);
|
||||||
|
}
|
||||||
|
- log_to_syslog();
|
||||||
|
+
|
||||||
|
+ /* Redirect all our file descriptors to /dev/null */
|
||||||
|
+ nullfd = open("/dev/null", O_RDWR);
|
||||||
|
+ if (nullfd < 0) {
|
||||||
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
+ fprintf(stderr, "cannot open /dev/null: %s", estr);
|
||||||
|
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
|
||||||
|
+ close(start_pipefd[1]);
|
||||||
|
+ exit(*pst_stat);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (dup2(nullfd, STDIN_FILENO) < 0 ||
|
||||||
|
+ dup2(nullfd, STDOUT_FILENO) < 0 ||
|
||||||
|
+ dup2(nullfd, STDERR_FILENO) < 0) {
|
||||||
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
+ fprintf(stderr,
|
||||||
|
+ "redirecting file descriptors failed: %s", estr);
|
||||||
|
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
|
||||||
|
+ close(start_pipefd[1]);
|
||||||
|
+ exit(*pst_stat);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ open_log();
|
||||||
|
+ close(nullfd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write pid file if requested */
|
||||||
|
--- autofs-5.1.4.orig/include/log.h
|
||||||
|
+++ autofs-5.1.4/include/log.h
|
||||||
|
@@ -36,7 +36,6 @@ extern void set_log_debug_ap(struct auto
|
||||||
|
extern void set_mnt_logging(unsigned global_logopt);
|
||||||
|
|
||||||
|
extern void open_log(void);
|
||||||
|
-extern void log_to_syslog(void);
|
||||||
|
extern void log_to_stderr(void);
|
||||||
|
|
||||||
|
extern void log_info(unsigned int, const char* msg, ...);
|
||||||
|
--- autofs-5.1.4.orig/lib/log.c
|
||||||
|
+++ autofs-5.1.4/lib/log.c
|
||||||
|
@@ -314,35 +314,6 @@ void open_log(void)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void log_to_syslog(void)
|
||||||
|
-{
|
||||||
|
- char buf[MAX_ERR_BUF];
|
||||||
|
- int nullfd;
|
||||||
|
-
|
||||||
|
- open_log();
|
||||||
|
-
|
||||||
|
- /* Redirect all our file descriptors to /dev/null */
|
||||||
|
- nullfd = open("/dev/null", O_RDWR);
|
||||||
|
- if (nullfd < 0) {
|
||||||
|
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
- fprintf(stderr, "cannot open /dev/null: %s", estr);
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (dup2(nullfd, STDIN_FILENO) < 0 ||
|
||||||
|
- dup2(nullfd, STDOUT_FILENO) < 0 ||
|
||||||
|
- dup2(nullfd, STDERR_FILENO) < 0) {
|
||||||
|
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
- fprintf(stderr,
|
||||||
|
- "redirecting file descriptors failed: %s", estr);
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- close(nullfd);
|
||||||
|
-
|
||||||
|
- return;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
void log_to_stderr(void)
|
||||||
|
{
|
||||||
|
if (syslog_open) {
|
222
SOURCES/autofs-5.1.4-remove-autofs4-module-load-code.patch
Normal file
222
SOURCES/autofs-5.1.4-remove-autofs4-module-load-code.patch
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
autofs-5.1.4 - remove autofs4 module load code
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The autofs kernel module has finally been renamed from autofs4 to
|
||||||
|
autofs so autoloading works so there is no need for manual loading.
|
||||||
|
|
||||||
|
The module load function has been commented out in the source for
|
||||||
|
a long time so there should not be any adverse affects from removing
|
||||||
|
it.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
configure | 61 ----------------------------------------------------
|
||||||
|
configure.in | 1
|
||||||
|
daemon/automount.c | 8 ------
|
||||||
|
daemon/module.c | 35 -----------------------------
|
||||||
|
include/automount.h | 7 -----
|
||||||
|
include/config.h.in | 6 -----
|
||||||
|
7 files changed, 1 insertion(+), 118 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -38,6 +38,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix amd parser opts option handling.
|
||||||
|
- better handle hesiod support not built in.
|
||||||
|
- fix hesiod string check in master_parse().
|
||||||
|
+- remove autofs4 module load code.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/configure
|
||||||
|
+++ autofs-5.1.4/configure
|
||||||
|
@@ -659,8 +659,6 @@ PATH_YACC
|
||||||
|
YACC
|
||||||
|
PATH_LEX
|
||||||
|
LEX
|
||||||
|
-HAVE_MODPROBE
|
||||||
|
-MODPROBE
|
||||||
|
HAVE_E4FSCK
|
||||||
|
E4FSCK
|
||||||
|
HAVE_E3FSCK
|
||||||
|
@@ -4155,65 +4153,6 @@ else
|
||||||
|
HAVE_E4FSCK=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
-for ac_prog in modprobe
|
||||||
|
-do
|
||||||
|
- # Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||||
|
-set dummy $ac_prog; ac_word=$2
|
||||||
|
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||||
|
-$as_echo_n "checking for $ac_word... " >&6; }
|
||||||
|
-if ${ac_cv_path_MODPROBE+:} false; then :
|
||||||
|
- $as_echo_n "(cached) " >&6
|
||||||
|
-else
|
||||||
|
- case $MODPROBE in
|
||||||
|
- [\\/]* | ?:[\\/]*)
|
||||||
|
- ac_cv_path_MODPROBE="$MODPROBE" # Let the user override the test with a path.
|
||||||
|
- ;;
|
||||||
|
- *)
|
||||||
|
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||||
|
-for as_dir in $searchpath
|
||||||
|
-do
|
||||||
|
- IFS=$as_save_IFS
|
||||||
|
- test -z "$as_dir" && as_dir=.
|
||||||
|
- for ac_exec_ext in '' $ac_executable_extensions; do
|
||||||
|
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||||
|
- ac_cv_path_MODPROBE="$as_dir/$ac_word$ac_exec_ext"
|
||||||
|
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||||
|
- break 2
|
||||||
|
- fi
|
||||||
|
-done
|
||||||
|
- done
|
||||||
|
-IFS=$as_save_IFS
|
||||||
|
-
|
||||||
|
- ;;
|
||||||
|
-esac
|
||||||
|
-fi
|
||||||
|
-MODPROBE=$ac_cv_path_MODPROBE
|
||||||
|
-if test -n "$MODPROBE"; then
|
||||||
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MODPROBE" >&5
|
||||||
|
-$as_echo "$MODPROBE" >&6; }
|
||||||
|
-else
|
||||||
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
-$as_echo "no" >&6; }
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-
|
||||||
|
- test -n "$MODPROBE" && break
|
||||||
|
-done
|
||||||
|
-
|
||||||
|
-if test -n "$MODPROBE"; then
|
||||||
|
-
|
||||||
|
-$as_echo "#define HAVE_MODPROBE 1" >>confdefs.h
|
||||||
|
-
|
||||||
|
-
|
||||||
|
-cat >>confdefs.h <<_ACEOF
|
||||||
|
-#define PATH_MODPROBE "$MODPROBE"
|
||||||
|
-_ACEOF
|
||||||
|
-
|
||||||
|
- HAVE_MODPROBE=1
|
||||||
|
-else
|
||||||
|
- HAVE_MODPROBE=0
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
|
||||||
|
for ac_prog in flex lex
|
||||||
|
do
|
||||||
|
--- autofs-5.1.4.orig/configure.in
|
||||||
|
+++ autofs-5.1.4/configure.in
|
||||||
|
@@ -161,7 +161,6 @@ AF_PATH_INCLUDE(UMOUNT, umount, /bin/umo
|
||||||
|
AF_PATH_INCLUDE(E2FSCK, fsck.ext2 e2fsck, , $searchpath)
|
||||||
|
AF_PATH_INCLUDE(E3FSCK, fsck.ext3 e3fsck, , $searchpath)
|
||||||
|
AF_PATH_INCLUDE(E4FSCK, fsck.ext4 e4fsck, , $searchpath)
|
||||||
|
-AF_PATH_INCLUDE(MODPROBE, modprobe, , $searchpath)
|
||||||
|
|
||||||
|
AF_CHECK_PROG(LEX, flex lex, , $searchpath)
|
||||||
|
AF_CHECK_PROG(YACC, bison, , $searchpath)
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -2336,14 +2336,6 @@ int main(int argc, char *argv[])
|
||||||
|
exit(exit_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if 0
|
||||||
|
- if (!load_autofs4_module()) {
|
||||||
|
- fprintf(stderr, "%s: can't load %s filesystem module.\n",
|
||||||
|
- program, FS_MODULE_NAME);
|
||||||
|
- exit(1);
|
||||||
|
- }
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
/* Don't need the kernel module just to look at the configured maps */
|
||||||
|
if (!dumpmaps && (!query_kproto_ver() || get_kver_major() < 5)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
--- autofs-5.1.4.orig/daemon/module.c
|
||||||
|
+++ autofs-5.1.4/daemon/module.c
|
||||||
|
@@ -19,41 +19,6 @@
|
||||||
|
#include "automount.h"
|
||||||
|
#include "nsswitch.h"
|
||||||
|
|
||||||
|
-int load_autofs4_module(void)
|
||||||
|
-{
|
||||||
|
- FILE *fp;
|
||||||
|
- char buf[PATH_MAX];
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Check if module already loaded or compiled in.
|
||||||
|
- * If both autofs v3 and v4 are coplied in and
|
||||||
|
- * the v3 module registers first or the v4 module
|
||||||
|
- * is an older version we will catch it at mount
|
||||||
|
- * time.
|
||||||
|
- */
|
||||||
|
- fp = open_fopen_r("/proc/filesystems");
|
||||||
|
- if (!fp) {
|
||||||
|
- logerr("cannot open /proc/filesystems");
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- while (fgets(buf, sizeof(buf), fp)) {
|
||||||
|
- if (strstr(buf, "autofs")) {
|
||||||
|
- fclose(fp);
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- fclose(fp);
|
||||||
|
-
|
||||||
|
- ret = spawnl(LOGOPT_NONE, PATH_MODPROBE, PATH_MODPROBE,
|
||||||
|
- "-q", FS_MODULE_NAME, NULL);
|
||||||
|
- if (ret)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- return 1;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
int open_lookup(const char *name, const char *err_prefix, const char *mapfmt,
|
||||||
|
int argc, const char *const *argv, struct lookup_mod **lookup)
|
||||||
|
{
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -52,17 +52,10 @@
|
||||||
|
#error Failed to locate umount(8)!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-#ifndef HAVE_MODPROBE
|
||||||
|
-#error Failed to locate modprobe(8)!
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
#ifndef HAVE_LINUX_PROCFS
|
||||||
|
#error Failed to verify existence of procfs filesystem!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-#define FS_MODULE_NAME "autofs4"
|
||||||
|
-int load_autofs4_module(void);
|
||||||
|
-
|
||||||
|
/* The -s (sloppy) option to mount is good, if we have it... */
|
||||||
|
|
||||||
|
#ifdef HAVE_SLOPPY_MOUNT
|
||||||
|
--- autofs-5.1.4.orig/include/config.h.in
|
||||||
|
+++ autofs-5.1.4/include/config.h.in
|
||||||
|
@@ -48,9 +48,6 @@
|
||||||
|
/* Define to 1 if you have the <memory.h> header file. */
|
||||||
|
#undef HAVE_MEMORY_H
|
||||||
|
|
||||||
|
-/* define if you have MODPROBE */
|
||||||
|
-#undef HAVE_MODPROBE
|
||||||
|
-
|
||||||
|
/* define if you have MOUNT */
|
||||||
|
#undef HAVE_MOUNT
|
||||||
|
|
||||||
|
@@ -129,9 +126,6 @@
|
||||||
|
/* define if you have LEX */
|
||||||
|
#undef PATH_LEX
|
||||||
|
|
||||||
|
-/* define if you have MODPROBE */
|
||||||
|
-#undef PATH_MODPROBE
|
||||||
|
-
|
||||||
|
/* define if you have MOUNT */
|
||||||
|
#undef PATH_MOUNT
|
||||||
|
|
@ -0,0 +1,37 @@
|
|||||||
|
autofs-5.1.4 - remove unused function dump_master()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/master.c | 11 -----------
|
||||||
|
2 files changed, 1 insertion(+), 11 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -112,6 +112,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- dont prune offset map entries.
|
||||||
|
- simplify sss source stale check.
|
||||||
|
- use defines for expire type.
|
||||||
|
+- remove unused function dump_master().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/master.c
|
||||||
|
+++ autofs-5.1.4/lib/master.c
|
||||||
|
@@ -1971,14 +1971,3 @@ int master_kill(struct master *master)
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
-void dump_master(struct master *master)
|
||||||
|
-{
|
||||||
|
- struct list_head *p, *head;
|
||||||
|
-
|
||||||
|
- head = &master->mounts;
|
||||||
|
- list_for_each(p, head) {
|
||||||
|
- struct master_mapent *this = list_entry(p, struct master_mapent, list);
|
||||||
|
- logmsg("path %s", this->path);
|
||||||
|
- }
|
||||||
|
-}
|
@ -0,0 +1,69 @@
|
|||||||
|
autofs-5.1.4 - set bind mount as propagation slave
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
When using a multi-mount with mount targets that are on the
|
||||||
|
local machine and resulting bind mounts are made to a file
|
||||||
|
system that is mount propagation shared (such as the root
|
||||||
|
file system on systemd managed systems) the autofs offset
|
||||||
|
mount triggers made within the bind mount will be propagated
|
||||||
|
back to the target file system.
|
||||||
|
|
||||||
|
When this happens the target of the offset (the unwanted
|
||||||
|
propagated mount) is itself an autofs trigger mount and
|
||||||
|
accessing the path results in a deadlock.
|
||||||
|
|
||||||
|
In order for these multi-mounts to function properly in this
|
||||||
|
case bind mounts that contain mount triggers must be set to
|
||||||
|
propagation slave or private so the backward propagation
|
||||||
|
doesn't occur.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/mount_bind.c | 16 +++++++++++++++-
|
||||||
|
2 files changed, 16 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -30,6 +30,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix program usage message.
|
||||||
|
- fix update_negative_cache() map source usage.
|
||||||
|
- mark removed cache entry negative.
|
||||||
|
+- set bind mount as propagation slave.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_bind.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_bind.c
|
||||||
|
@@ -20,6 +20,7 @@
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
+#include <sys/mount.h>
|
||||||
|
|
||||||
|
#define MODULE_MOUNT
|
||||||
|
#include "automount.h"
|
||||||
|
@@ -183,8 +184,21 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
debug(ap->logopt,
|
||||||
|
MODPREFIX "mounted %s type %s on %s",
|
||||||
|
what, fstype, fullpath);
|
||||||
|
- return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* The bind mount has succeeded but if the target
|
||||||
|
+ * mount is propagation shared propagation of child
|
||||||
|
+ * mounts (autofs offset mounts for example) back to
|
||||||
|
+ * the target of the bind mount must be avoided or
|
||||||
|
+ * autofs trigger mounts will deadlock.
|
||||||
|
+ */
|
||||||
|
+ err = mount(NULL, fullpath, NULL, MS_SLAVE, NULL);
|
||||||
|
+ if (err)
|
||||||
|
+ warn(ap->logopt,
|
||||||
|
+ "failed to set propagation type for %s",
|
||||||
|
+ fullpath);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
} else {
|
||||||
|
char *cp;
|
||||||
|
char basepath[PATH_MAX];
|
@ -0,0 +1,48 @@
|
|||||||
|
autofs-5.1.4 - tiny patch for autofs typo and possible bug
|
||||||
|
|
||||||
|
From: Todd Eigenschink <todd@fai2.com>
|
||||||
|
|
||||||
|
(1) The word "to" is doubled in two warnings.
|
||||||
|
|
||||||
|
(2) It prints a warning when it can't open the "old" config file, even
|
||||||
|
if it was able to open the default one. That's a reasonable warning if
|
||||||
|
it *couldn't* open the new one, but seems unnecessary if it could.
|
||||||
|
|
||||||
|
The patch removes the unneeded "to"s and only prints warning about the
|
||||||
|
old config file if it couldn't open the default one.
|
||||||
|
|
||||||
|
Signed-off-by: Todd Eigenschink <todd@fai2.com>
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/defaults.c | 6 +++---
|
||||||
|
2 files changed, 4 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -20,6 +20,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add conditional inclusion of fedfs binaries.
|
||||||
|
- add an example fedfs master map entry to the installed master map.
|
||||||
|
- improve hostname lookup error logging.
|
||||||
|
+- tiny patch for autofs typo and possible bug.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/defaults.c
|
||||||
|
+++ autofs-5.1.4/lib/defaults.c
|
||||||
|
@@ -1207,12 +1207,12 @@ unsigned int defaults_read_config(unsign
|
||||||
|
|
||||||
|
conf = open_fopen_r(DEFAULT_CONFIG_FILE);
|
||||||
|
if (!conf)
|
||||||
|
- message(to_syslog, "failed to to open config %s",
|
||||||
|
+ message(to_syslog, "failed to open config %s",
|
||||||
|
DEFAULT_CONFIG_FILE);
|
||||||
|
|
||||||
|
oldconf = open_fopen_r(OLD_CONFIG_FILE);
|
||||||
|
- if (!oldconf)
|
||||||
|
- message(to_syslog, "failed to to open old config %s",
|
||||||
|
+ if (!oldconf && !conf)
|
||||||
|
+ message(to_syslog, "failed to open old config %s",
|
||||||
|
OLD_CONFIG_FILE);
|
||||||
|
|
||||||
|
/* Neither config has been updated */
|
41
SOURCES/autofs-5.1.4-update-build-info-with-systemd.patch
Normal file
41
SOURCES/autofs-5.1.4-update-build-info-with-systemd.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
autofs-5.1.4 - update build info with systemd
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Update the show_build_info() function to include systemd
|
||||||
|
build info.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 9 +++++++++
|
||||||
|
2 files changed, 10 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -40,6 +40,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix hesiod string check in master_parse().
|
||||||
|
- remove autofs4 module load code.
|
||||||
|
- add NULL check in prepare_attempt_prefix().
|
||||||
|
+- update build info with systemd.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -1951,6 +1951,15 @@ static void show_build_info(void)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef WITH_SYSTEMD
|
||||||
|
+ printf("WITH_SYSTEMD ");
|
||||||
|
+ count = count + 13;
|
||||||
|
+
|
||||||
|
+ if (count > 60) {
|
||||||
|
+ printf("\n ");
|
||||||
|
+ count = 0;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
#ifdef WITH_HESIOD
|
||||||
|
printf("WITH_HESIOD ");
|
100
SOURCES/autofs-5.1.4-use-defines-for-expire-type.patch
Normal file
100
SOURCES/autofs-5.1.4-use-defines-for-expire-type.patch
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
autofs-5.1.4 - use defines for expire type
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The kernel defines for expire type such as an immediate expire
|
||||||
|
shoule be used to clearify what is being requested.
|
||||||
|
|
||||||
|
AUTOFS_EXP_IMMEDIATE corresponds to a SIGUSR1 prune operation.
|
||||||
|
|
||||||
|
AUTOFS_EXP_FORCE corresponds to an expire type not yet implemented in
|
||||||
|
the kernel, a SIGUSR2 forced expire. Define it in our internal autofs
|
||||||
|
kernel include file, the kernel will ignore it if it doesn't support it.
|
||||||
|
|
||||||
|
AUTOFS_EXP_LEAVES is no longer used in autofs version 5.
|
||||||
|
|
||||||
|
Finally add a define AUTOFS_EXP_NORMAL to indicate we're perfoming a
|
||||||
|
normal expire.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/state.c | 8 ++++----
|
||||||
|
include/linux/auto_fs4.h | 6 ++++--
|
||||||
|
include/state.h | 2 +-
|
||||||
|
4 files changed, 10 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -111,6 +111,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use a valid timeout in lookup_prune_one_cache().
|
||||||
|
- dont prune offset map entries.
|
||||||
|
- simplify sss source stale check.
|
||||||
|
+- use defines for expire type.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/state.c
|
||||||
|
+++ autofs-5.1.4/daemon/state.c
|
||||||
|
@@ -634,7 +634,7 @@ static unsigned int st_prepare_shutdown(
|
||||||
|
ap->state = ST_SHUTDOWN_PENDING;
|
||||||
|
|
||||||
|
/* Unmount everything */
|
||||||
|
- exp = expire_proc(ap, 1);
|
||||||
|
+ exp = expire_proc(ap, AUTOFS_EXP_IMMEDIATE);
|
||||||
|
switch (exp) {
|
||||||
|
case EXP_ERROR:
|
||||||
|
case EXP_PARTIAL:
|
||||||
|
@@ -660,7 +660,7 @@ static unsigned int st_force_shutdown(st
|
||||||
|
ap->state = ST_SHUTDOWN_FORCE;
|
||||||
|
|
||||||
|
/* Unmount everything */
|
||||||
|
- exp = expire_proc(ap, 1);
|
||||||
|
+ exp = expire_proc(ap, AUTOFS_EXP_FORCE | AUTOFS_EXP_IMMEDIATE);
|
||||||
|
switch (exp) {
|
||||||
|
case EXP_ERROR:
|
||||||
|
case EXP_PARTIAL:
|
||||||
|
@@ -695,7 +695,7 @@ static unsigned int st_prune(struct auto
|
||||||
|
assert(ap->state == ST_READY);
|
||||||
|
ap->state = ST_PRUNE;
|
||||||
|
|
||||||
|
- switch (expire_proc(ap, 1)) {
|
||||||
|
+ switch (expire_proc(ap, AUTOFS_EXP_IMMEDIATE)) {
|
||||||
|
case EXP_ERROR:
|
||||||
|
case EXP_PARTIAL:
|
||||||
|
if (!ap->submount)
|
||||||
|
@@ -716,7 +716,7 @@ static unsigned int st_expire(struct aut
|
||||||
|
assert(ap->state == ST_READY);
|
||||||
|
ap->state = ST_EXPIRE;
|
||||||
|
|
||||||
|
- switch (expire_proc(ap, 0)) {
|
||||||
|
+ switch (expire_proc(ap, AUTOFS_EXP_NORMAL)) {
|
||||||
|
case EXP_ERROR:
|
||||||
|
case EXP_PARTIAL:
|
||||||
|
if (!ap->submount)
|
||||||
|
--- autofs-5.1.4.orig/include/linux/auto_fs4.h
|
||||||
|
+++ autofs-5.1.4/include/linux/auto_fs4.h
|
||||||
|
@@ -27,8 +27,10 @@
|
||||||
|
#define AUTOFS_PROTO_SUBVERSION 2
|
||||||
|
|
||||||
|
/* Mask for expire behaviour */
|
||||||
|
-#define AUTOFS_EXP_IMMEDIATE 1
|
||||||
|
-#define AUTOFS_EXP_LEAVES 2
|
||||||
|
+#define AUTOFS_EXP_NORMAL 0x00
|
||||||
|
+#define AUTOFS_EXP_IMMEDIATE 0x01
|
||||||
|
+#define AUTOFS_EXP_LEAVES 0x02
|
||||||
|
+#define AUTOFS_EXP_FORCE 0x04
|
||||||
|
|
||||||
|
#define AUTOFS_TYPE_ANY 0U
|
||||||
|
#define AUTOFS_TYPE_INDIRECT 1U
|
||||||
|
--- autofs-5.1.4.orig/include/state.h
|
||||||
|
+++ autofs-5.1.4/include/state.h
|
||||||
|
@@ -55,7 +55,7 @@ struct expire_args {
|
||||||
|
unsigned int signaled;
|
||||||
|
struct autofs_point *ap; /* autofs mount we are working on */
|
||||||
|
enum states state; /* State prune or expire */
|
||||||
|
- unsigned int how; /* Normal, immediate expire ? */
|
||||||
|
+ unsigned int how; /* Normal, immediate, forced expire ? */
|
||||||
|
int status; /* Return status */
|
||||||
|
};
|
||||||
|
|
217
SOURCES/autofs-5.1.4-use-flags-for-startup-boolean-options.patch
Normal file
217
SOURCES/autofs-5.1.4-use-flags-for-startup-boolean-options.patch
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
autofs-5.1.4 - use flags for startup boolean options
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The daemon uses a number of boolean flags each stored in unsigned int
|
||||||
|
variables. But a single bit flag is sufficient storage for most of
|
||||||
|
these flags.
|
||||||
|
|
||||||
|
So use bit flags for these where possible.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 45 ++++++++++++++++++++++-----------------------
|
||||||
|
include/automount.h | 6 ++++++
|
||||||
|
lib/master.c | 4 ++--
|
||||||
|
4 files changed, 31 insertions(+), 25 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -41,6 +41,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- remove autofs4 module load code.
|
||||||
|
- add NULL check in prepare_attempt_prefix().
|
||||||
|
- update build info with systemd.
|
||||||
|
+- use flags for startup boolean options.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -1195,7 +1195,7 @@ static int handle_packet(struct autofs_p
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void become_daemon(unsigned foreground, unsigned daemon_check)
|
||||||
|
+static void become_daemon(unsigned int flags)
|
||||||
|
{
|
||||||
|
FILE *pidfp;
|
||||||
|
char buf[MAX_ERR_BUF];
|
||||||
|
@@ -1210,8 +1210,8 @@ static void become_daemon(unsigned foreg
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Detach from foreground process */
|
||||||
|
- if (foreground) {
|
||||||
|
- if (daemon_check && !aquire_flag_file()) {
|
||||||
|
+ if (flags & DAEMON_FLAGS_FOREGROUND) {
|
||||||
|
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
||||||
|
fprintf(stderr, "%s: program is already running.\n",
|
||||||
|
program);
|
||||||
|
exit(1);
|
||||||
|
@@ -1238,7 +1238,7 @@ static void become_daemon(unsigned foreg
|
||||||
|
}
|
||||||
|
close(start_pipefd[0]);
|
||||||
|
|
||||||
|
- if (daemon_check && !aquire_flag_file()) {
|
||||||
|
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
||||||
|
fprintf(stderr, "%s: program is already running.\n",
|
||||||
|
program);
|
||||||
|
/* Return success if already running */
|
||||||
|
@@ -2158,8 +2158,8 @@ int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int res, opt, status;
|
||||||
|
int logpri = -1;
|
||||||
|
- unsigned ghost, logging, daemon_check;
|
||||||
|
- unsigned dumpmaps, foreground, have_global_options;
|
||||||
|
+ unsigned int flags;
|
||||||
|
+ unsigned int logging;
|
||||||
|
unsigned master_read;
|
||||||
|
int master_wait;
|
||||||
|
time_t timeout;
|
||||||
|
@@ -2202,17 +2202,15 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
|
nfs_mount_uses_string_options = check_nfs_mount_version(&vers, &check);
|
||||||
|
|
||||||
|
+ flags = defaults_get_browse_mode() ? DAEMON_FLAGS_GHOST : 0;
|
||||||
|
+ flags |= DAEMON_FLAGS_CHECK_DAEMON;
|
||||||
|
+
|
||||||
|
kpkt_len = get_kpkt_len();
|
||||||
|
master_wait = defaults_get_master_wait();
|
||||||
|
timeout = defaults_get_timeout();
|
||||||
|
- ghost = defaults_get_browse_mode();
|
||||||
|
logging = defaults_get_logging();
|
||||||
|
global_selection_options = 0;
|
||||||
|
global_options = NULL;
|
||||||
|
- have_global_options = 0;
|
||||||
|
- foreground = 0;
|
||||||
|
- dumpmaps = 0;
|
||||||
|
- daemon_check = 1;
|
||||||
|
|
||||||
|
remove_empty_args(argv, &argc);
|
||||||
|
|
||||||
|
@@ -2244,7 +2242,7 @@ int main(int argc, char *argv[])
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'f':
|
||||||
|
- foreground = 1;
|
||||||
|
+ flags |= DAEMON_FLAGS_FOREGROUND;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'V':
|
||||||
|
@@ -2260,7 +2258,7 @@ int main(int argc, char *argv[])
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
- dumpmaps = 1;
|
||||||
|
+ flags |= DAEMON_FLAGS_DUMP_MAPS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'M':
|
||||||
|
@@ -2268,9 +2266,9 @@ int main(int argc, char *argv[])
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'O':
|
||||||
|
- if (!have_global_options) {
|
||||||
|
+ if (!(flags & DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS)) {
|
||||||
|
global_options = strdup(optarg);
|
||||||
|
- have_global_options = 1;
|
||||||
|
+ flags |= DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("%s: global options already specified.\n",
|
||||||
|
@@ -2295,7 +2293,7 @@ int main(int argc, char *argv[])
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'C':
|
||||||
|
- daemon_check = 0;
|
||||||
|
+ flags &= ~DAEMON_FLAGS_CHECK_DAEMON;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'F':
|
||||||
|
@@ -2346,7 +2344,8 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Don't need the kernel module just to look at the configured maps */
|
||||||
|
- if (!dumpmaps && (!query_kproto_ver() || get_kver_major() < 5)) {
|
||||||
|
+ if (!(flags & DAEMON_FLAGS_DUMP_MAPS) &&
|
||||||
|
+ (!query_kproto_ver() || get_kver_major() < 5)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"%s: test mount forbidden or "
|
||||||
|
"incorrect kernel protocol version, "
|
||||||
|
@@ -2377,7 +2376,7 @@ int main(int argc, char *argv[])
|
||||||
|
/* Get processor information for predefined escapes */
|
||||||
|
macro_init();
|
||||||
|
|
||||||
|
- if (dumpmaps) {
|
||||||
|
+ if (flags & DAEMON_FLAGS_DUMP_MAPS) {
|
||||||
|
struct master_mapent *entry;
|
||||||
|
struct list_head *head, *p;
|
||||||
|
struct mapent_cache *nc;
|
||||||
|
@@ -2395,9 +2394,9 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (master)
|
||||||
|
- master_list = master_new(NULL, timeout, ghost);
|
||||||
|
+ master_list = master_new(NULL, timeout, flags);
|
||||||
|
else
|
||||||
|
- master_list = master_new(master, timeout, ghost);
|
||||||
|
+ master_list = master_new(master, timeout, flags);
|
||||||
|
if (!master_list) {
|
||||||
|
printf("%s: can't create master map", program);
|
||||||
|
macro_free_global_table();
|
||||||
|
@@ -2443,9 +2442,9 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc == 0)
|
||||||
|
- master_list = master_new(NULL, timeout, ghost);
|
||||||
|
+ master_list = master_new(NULL, timeout, flags);
|
||||||
|
else
|
||||||
|
- master_list = master_new(argv[0], timeout, ghost);
|
||||||
|
+ master_list = master_new(argv[0], timeout, flags);
|
||||||
|
|
||||||
|
if (!master_list) {
|
||||||
|
printf("%s: can't create master map %s", program, argv[0]);
|
||||||
|
@@ -2453,7 +2452,7 @@ int main(int argc, char *argv[])
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
- become_daemon(foreground, daemon_check);
|
||||||
|
+ become_daemon(flags);
|
||||||
|
|
||||||
|
if (pthread_attr_init(&th_attr)) {
|
||||||
|
logerr("%s: failed to init thread attribute struct!",
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -66,6 +66,12 @@
|
||||||
|
#define SLOPPY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#define DAEMON_FLAGS_FOREGROUND 0x0001
|
||||||
|
+#define DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS 0x0004
|
||||||
|
+#define DAEMON_FLAGS_GHOST 0x0008
|
||||||
|
+#define DAEMON_FLAGS_CHECK_DAEMON 0x0010
|
||||||
|
+#define DAEMON_FLAGS_DUMP_MAPS 0x0020
|
||||||
|
+
|
||||||
|
#define AUTOFS_SUPER_MAGIC 0x00000187L
|
||||||
|
#define SMB_SUPER_MAGIC 0x0000517BL
|
||||||
|
#define CIFS_MAGIC_NUMBER 0xFF534D42L
|
||||||
|
--- autofs-5.1.4.orig/lib/master.c
|
||||||
|
+++ autofs-5.1.4/lib/master.c
|
||||||
|
@@ -922,7 +922,7 @@ void master_free_mapent(struct master_ma
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
-struct master *master_new(const char *name, unsigned int timeout, unsigned int ghost)
|
||||||
|
+struct master *master_new(const char *name, unsigned int timeout, unsigned int flags)
|
||||||
|
{
|
||||||
|
struct master *master;
|
||||||
|
char *tmp;
|
||||||
|
@@ -948,7 +948,7 @@ struct master *master_new(const char *na
|
||||||
|
master->depth = 0;
|
||||||
|
master->reading = 0;
|
||||||
|
master->read_fail = 0;
|
||||||
|
- master->default_ghost = ghost;
|
||||||
|
+ master->default_ghost = flags & DAEMON_FLAGS_GHOST;
|
||||||
|
master->default_timeout = timeout;
|
||||||
|
master->default_logging = defaults_get_logging();
|
||||||
|
master->logopt = master->default_logging;
|
1357
SOURCES/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch
Normal file
1357
SOURCES/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,226 @@
|
|||||||
|
autofs-5.1.4 - use_hostname_for_mounts shouldn't prevent selection among replicas
|
||||||
|
|
||||||
|
From: NeilBrown <neilb@suse.com>
|
||||||
|
|
||||||
|
If several replicas have been specified for a mount point,
|
||||||
|
and use_hostname_for_mount is set to "yes", the selection
|
||||||
|
between these replicas is currently disabled and the last in
|
||||||
|
the list is always chosen.
|
||||||
|
|
||||||
|
There is little point selecting between different addresses
|
||||||
|
for the one host in this case, but it is still worth
|
||||||
|
selecting between different hosts, particularly if different
|
||||||
|
weights have been specified.
|
||||||
|
|
||||||
|
This patch restores the "prune_host_list()" functionality
|
||||||
|
when use_hostname_for_mount is set, and modifies it slightly
|
||||||
|
so that only on IP address for any host:/path entry in the
|
||||||
|
config file is willl be successfully probed. After a
|
||||||
|
success, further addresses from the same entry are skipped.
|
||||||
|
This is achieved by tracking an entry number ("ent_num") for
|
||||||
|
each 'struct host'.
|
||||||
|
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.com>
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
include/replicated.h | 3 ++-
|
||||||
|
modules/mount_nfs.c | 2 +-
|
||||||
|
modules/replicated.c | 35 ++++++++++++++++++++---------------
|
||||||
|
4 files changed, 24 insertions(+), 17 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 2d5d5b1f..104fca90 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -9,6 +9,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix error return in do_nfs_mount().
|
||||||
|
- add error handling for ext_mount_add().
|
||||||
|
- account for recent libnsl changes.
|
||||||
|
+- use_hostname_for_mounts shouldn't prevent selection among replicas.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/include/replicated.h b/include/replicated.h
|
||||||
|
index 69ab7800..0f482d21 100644
|
||||||
|
--- a/include/replicated.h
|
||||||
|
+++ b/include/replicated.h
|
||||||
|
@@ -57,6 +57,7 @@
|
||||||
|
|
||||||
|
struct host {
|
||||||
|
char *name;
|
||||||
|
+ int ent_num;
|
||||||
|
struct sockaddr *addr;
|
||||||
|
size_t addr_len;
|
||||||
|
unsigned int rr;
|
||||||
|
@@ -70,7 +71,7 @@ struct host {
|
||||||
|
};
|
||||||
|
|
||||||
|
void seed_random(void);
|
||||||
|
-struct host *new_host(const char *, struct sockaddr *, size_t,
|
||||||
|
+struct host *new_host(const char *, int, struct sockaddr *, size_t,
|
||||||
|
unsigned int, unsigned int, unsigned int);
|
||||||
|
void free_host_list(struct host **);
|
||||||
|
int parse_location(unsigned, struct host **, const char *, unsigned int);
|
||||||
|
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
|
||||||
|
index 77166544..4cf0cd27 100644
|
||||||
|
--- a/modules/mount_nfs.c
|
||||||
|
+++ b/modules/mount_nfs.c
|
||||||
|
@@ -236,7 +236,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
||||||
|
(vers & NFS4_VERS_MASK) != 0 &&
|
||||||
|
!(vers & UDP6_REQUESTED)) {
|
||||||
|
unsigned int v4_probe_ok = 0;
|
||||||
|
- struct host *tmp = new_host(hosts->name,
|
||||||
|
+ struct host *tmp = new_host(hosts->name, 0,
|
||||||
|
hosts->addr, hosts->addr_len,
|
||||||
|
hosts->proximity,
|
||||||
|
hosts->weight, hosts->options);
|
||||||
|
diff --git a/modules/replicated.c b/modules/replicated.c
|
||||||
|
index 3ac4c70f..f7b83236 100644
|
||||||
|
--- a/modules/replicated.c
|
||||||
|
+++ b/modules/replicated.c
|
||||||
|
@@ -83,7 +83,7 @@ void seed_random(void)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
-struct host *new_host(const char *name,
|
||||||
|
+struct host *new_host(const char *name, int ent_num,
|
||||||
|
struct sockaddr *addr, size_t addr_len,
|
||||||
|
unsigned int proximity, unsigned int weight,
|
||||||
|
unsigned int options)
|
||||||
|
@@ -116,6 +116,7 @@ struct host *new_host(const char *name,
|
||||||
|
memset(new, 0, sizeof(struct host));
|
||||||
|
|
||||||
|
new->name = tmp1;
|
||||||
|
+ new->ent_num = ent_num;
|
||||||
|
new->addr_len = addr_len;
|
||||||
|
new->addr = tmp2;
|
||||||
|
new->proximity = proximity;
|
||||||
|
@@ -714,7 +715,7 @@ done:
|
||||||
|
int prune_host_list(unsigned logopt, struct host **list,
|
||||||
|
unsigned int vers, int port)
|
||||||
|
{
|
||||||
|
- struct host *this, *last, *first;
|
||||||
|
+ struct host *this, *last, *first, *prev;
|
||||||
|
struct host *new = NULL;
|
||||||
|
unsigned int proximity, selected_version = 0;
|
||||||
|
unsigned int v2_tcp_count, v3_tcp_count, v4_tcp_count;
|
||||||
|
@@ -726,12 +727,6 @@ int prune_host_list(unsigned logopt, struct host **list,
|
||||||
|
if (!*list)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- /* If we're using the host name then there's no point probing
|
||||||
|
- * avialability and respose time.
|
||||||
|
- */
|
||||||
|
- if (defaults_use_hostname_for_mounts())
|
||||||
|
- return 1;
|
||||||
|
-
|
||||||
|
/* Use closest hosts to choose NFS version */
|
||||||
|
|
||||||
|
first = *list;
|
||||||
|
@@ -877,11 +872,18 @@ int prune_host_list(unsigned logopt, struct host **list,
|
||||||
|
|
||||||
|
first = last;
|
||||||
|
this = first;
|
||||||
|
+ prev = NULL;
|
||||||
|
while (this) {
|
||||||
|
struct host *next = this->next;
|
||||||
|
if (!this->name) {
|
||||||
|
remove_host(list, this);
|
||||||
|
add_host(&new, this);
|
||||||
|
+ } else if (defaults_use_hostname_for_mounts() && prev &&
|
||||||
|
+ prev->ent_num == this->ent_num) {
|
||||||
|
+ /* When we use the hostname to mount, there is no
|
||||||
|
+ * point in probing every address it has, just one is
|
||||||
|
+ * enough. Skip the rest.
|
||||||
|
+ */
|
||||||
|
} else {
|
||||||
|
status = get_supported_ver_and_cost(logopt, this,
|
||||||
|
selected_version, port);
|
||||||
|
@@ -889,6 +891,7 @@ int prune_host_list(unsigned logopt, struct host **list,
|
||||||
|
this->version = selected_version;
|
||||||
|
remove_host(list, this);
|
||||||
|
add_host(&new, this);
|
||||||
|
+ prev = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this = next;
|
||||||
|
@@ -901,7 +904,7 @@ int prune_host_list(unsigned logopt, struct host **list,
|
||||||
|
}
|
||||||
|
|
||||||
|
static int add_new_host(struct host **list,
|
||||||
|
- const char *host, unsigned int weight,
|
||||||
|
+ const char *host, int ent_num, unsigned int weight,
|
||||||
|
struct addrinfo *host_addr,
|
||||||
|
unsigned int rr, unsigned int options)
|
||||||
|
{
|
||||||
|
@@ -940,7 +943,7 @@ static int add_new_host(struct host **list,
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- new = new_host(host, host_addr->ai_addr, addr_len, prx, weight, options);
|
||||||
|
+ new = new_host(host, ent_num, host_addr->ai_addr, addr_len, prx, weight, options);
|
||||||
|
if (!new)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
@@ -953,7 +956,7 @@ static int add_new_host(struct host **list,
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int add_host_addrs(struct host **list, const char *host,
|
||||||
|
+static int add_host_addrs(struct host **list, const char *host, int ent_num,
|
||||||
|
unsigned int weight, unsigned int options)
|
||||||
|
{
|
||||||
|
struct addrinfo hints, *ni, *this;
|
||||||
|
@@ -988,7 +991,7 @@ static int add_host_addrs(struct host **list, const char *host,
|
||||||
|
|
||||||
|
this = ni;
|
||||||
|
while (this) {
|
||||||
|
- ret = add_new_host(list, host, weight, this, 0, options);
|
||||||
|
+ ret = add_new_host(list, host, ent_num, weight, this, 0, options);
|
||||||
|
if (!ret)
|
||||||
|
break;
|
||||||
|
this = this->ai_next;
|
||||||
|
@@ -1027,7 +1030,7 @@ try_name:
|
||||||
|
rr++;
|
||||||
|
this = ni;
|
||||||
|
while (this) {
|
||||||
|
- ret = add_new_host(list, host, weight, this, rr, options);
|
||||||
|
+ ret = add_new_host(list, host, ent_num, weight, this, rr, options);
|
||||||
|
if (!ret)
|
||||||
|
break;
|
||||||
|
this = this->ai_next;
|
||||||
|
@@ -1120,6 +1123,7 @@ int parse_location(unsigned logopt, struct host **hosts,
|
||||||
|
{
|
||||||
|
char *str, *p, *delim;
|
||||||
|
unsigned int empty = 1;
|
||||||
|
+ int ent_num = 1;
|
||||||
|
|
||||||
|
if (!list)
|
||||||
|
return 0;
|
||||||
|
@@ -1177,7 +1181,7 @@ int parse_location(unsigned logopt, struct host **hosts,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p != delim) {
|
||||||
|
- if (!add_host_addrs(hosts, p, weight, options)) {
|
||||||
|
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
|
||||||
|
if (empty) {
|
||||||
|
p = next;
|
||||||
|
continue;
|
||||||
|
@@ -1199,7 +1203,7 @@ int parse_location(unsigned logopt, struct host **hosts,
|
||||||
|
*delim = '\0';
|
||||||
|
next = delim + 1;
|
||||||
|
|
||||||
|
- if (!add_host_addrs(hosts, p, weight, options)) {
|
||||||
|
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
|
||||||
|
p = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -1213,6 +1217,7 @@ int parse_location(unsigned logopt, struct host **hosts,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ ent_num++;
|
||||||
|
p = next;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
|||||||
|
autofs-5.1.5 - add NULL check for get_addr_string() return
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
When constructing the mount location string in mount_nfs.c:mount_mount()
|
||||||
|
the return from get_addr_string() is not checked for NULL.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/mount_nfs.c | 6 ++++++
|
||||||
|
2 files changed, 7 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -45,6 +45,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- move close stdio descriptors to become_daemon().
|
||||||
|
- add systemd service command line option.
|
||||||
|
- support strictexpire mount option.
|
||||||
|
+- add NULL check for get_addr_string() return.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_nfs.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_nfs.c
|
||||||
|
@@ -333,7 +333,13 @@ dont_probe:
|
||||||
|
socklen_t len = INET6_ADDRSTRLEN;
|
||||||
|
char n_buf[len + 1];
|
||||||
|
const char *n_addr;
|
||||||
|
+
|
||||||
|
n_addr = get_addr_string(this->addr, n_buf, len);
|
||||||
|
+ if (!n_addr) {
|
||||||
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
+ error(ap->logopt, "get_addr_string: %s", estr);
|
||||||
|
+ goto forced_fail;
|
||||||
|
+ }
|
||||||
|
loc = malloc(strlen(n_addr) + strlen(this->path) + 4);
|
||||||
|
if (!loc) {
|
||||||
|
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
@ -0,0 +1,155 @@
|
|||||||
|
autofs-5.1.5 - add config option for "ignore" mount option
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add a configuration option to control whether the autofs pseudo
|
||||||
|
mount option is used on autofs mounts.
|
||||||
|
|
||||||
|
The default setting is "no" to avoid unexpected behaviour and
|
||||||
|
so is an opt-in setting for those who understand that, if user
|
||||||
|
space utilities and libraries honour this, then autofs mounts
|
||||||
|
will be ommitted from mount table listings.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
include/defaults.h | 2 ++
|
||||||
|
lib/defaults.c | 17 +++++++++++++++++
|
||||||
|
lib/master.c | 3 ++-
|
||||||
|
man/autofs.conf.5.in | 7 +++++++
|
||||||
|
redhat/autofs.conf.default.in | 9 +++++++++
|
||||||
|
samples/autofs.conf.default.in | 9 +++++++++
|
||||||
|
7 files changed, 47 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -62,6 +62,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix unlink_mount_tree() not umounting mounts.
|
||||||
|
- add ignore mount option.
|
||||||
|
- use ignore option for offset mounts as well.
|
||||||
|
+- add config option for "ignore" mount option
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/include/defaults.h
|
||||||
|
+++ autofs-5.1.4/include/defaults.h
|
||||||
|
@@ -51,6 +51,7 @@
|
||||||
|
|
||||||
|
#define DEFAULT_USE_HOSTNAME_FOR_MOUNTS "0"
|
||||||
|
#define DEFAULT_DISABLE_NOT_FOUND_MESSAGE "0"
|
||||||
|
+#define DEFAULT_USE_IGNORE_MOUNT_OPTION "0"
|
||||||
|
|
||||||
|
#define DEFAULT_SSS_MASTER_MAP_WAIT "0"
|
||||||
|
#define DEFAULT_USE_MOUNT_REQUEST_LOG_ID "0"
|
||||||
|
@@ -174,6 +175,7 @@ const char *defaults_get_auth_conf_file(
|
||||||
|
unsigned int defaults_get_map_hash_table_size(void);
|
||||||
|
unsigned int defaults_use_hostname_for_mounts(void);
|
||||||
|
unsigned int defaults_disable_not_found_message(void);
|
||||||
|
+unsigned int defaults_get_use_ignore_mount_option(void);
|
||||||
|
unsigned int defaults_get_sss_master_map_wait(void);
|
||||||
|
unsigned int defaults_get_use_mount_request_log_id(void);
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/lib/defaults.c
|
||||||
|
+++ autofs-5.1.4/lib/defaults.c
|
||||||
|
@@ -77,6 +77,7 @@
|
||||||
|
|
||||||
|
#define NAME_USE_HOSTNAME_FOR_MOUNTS "use_hostname_for_mounts"
|
||||||
|
#define NAME_DISABLE_NOT_FOUND_MESSAGE "disable_not_found_message"
|
||||||
|
+#define NAME_USE_IGNORE_MOUNT_OPTION "use_ignore_mount_option"
|
||||||
|
|
||||||
|
#define NAME_SSS_MASTER_MAP_WAIT "sss_master_map_wait"
|
||||||
|
#define NAME_USE_MOUNT_REQUEST_LOG_ID "use_mount_request_log_id"
|
||||||
|
@@ -364,6 +365,11 @@ static int conf_load_autofs_defaults(voi
|
||||||
|
if (ret == CFG_FAIL)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
+ ret = conf_update(sec, NAME_USE_IGNORE_MOUNT_OPTION,
|
||||||
|
+ DEFAULT_USE_IGNORE_MOUNT_OPTION, CONF_ENV);
|
||||||
|
+ if (ret == CFG_FAIL)
|
||||||
|
+ goto error;
|
||||||
|
+
|
||||||
|
ret = conf_update(sec, NAME_SSS_MASTER_MAP_WAIT,
|
||||||
|
DEFAULT_SSS_MASTER_MAP_WAIT, CONF_ENV);
|
||||||
|
if (ret == CFG_FAIL)
|
||||||
|
@@ -1863,6 +1869,17 @@ unsigned int defaults_disable_not_found_
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+unsigned int defaults_get_use_ignore_mount_option(void)
|
||||||
|
+{
|
||||||
|
+ int res;
|
||||||
|
+
|
||||||
|
+ res = conf_get_yesno(autofs_gbl_sec, NAME_USE_IGNORE_MOUNT_OPTION);
|
||||||
|
+ if (res < 0)
|
||||||
|
+ res = atoi(DEFAULT_USE_IGNORE_MOUNT_OPTION);
|
||||||
|
+
|
||||||
|
+ return res;
|
||||||
|
+}
|
||||||
|
|
||||||
|
unsigned int defaults_get_sss_master_map_wait(void)
|
||||||
|
{
|
||||||
|
--- autofs-5.1.4.orig/lib/master.c
|
||||||
|
+++ autofs-5.1.4/lib/master.c
|
||||||
|
@@ -101,7 +101,8 @@ int master_add_autofs_point(struct maste
|
||||||
|
ap->negative_timeout = global_negative_timeout;
|
||||||
|
ap->exp_timeout = defaults_get_timeout();
|
||||||
|
ap->exp_runfreq = 0;
|
||||||
|
- ap->flags = MOUNT_FLAG_IGNORE;
|
||||||
|
+ if (defaults_get_use_ignore_mount_option())
|
||||||
|
+ ap->flags = MOUNT_FLAG_IGNORE;
|
||||||
|
if (ghost)
|
||||||
|
ap->flags |= MOUNT_FLAG_GHOST;
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/man/autofs.conf.5.in
|
||||||
|
+++ autofs-5.1.4/man/autofs.conf.5.in
|
||||||
|
@@ -151,6 +151,13 @@ That produces, IMHO, unnecessary noise i
|
||||||
|
has been added to provide the ability to turn it off. The default is "no"
|
||||||
|
to maintain the current behaviour.
|
||||||
|
.TP
|
||||||
|
+.B use_ignore_mount_option
|
||||||
|
+.br
|
||||||
|
+An option to enable the use of autofs pseudo option "disable". This option
|
||||||
|
+is used as a hint to user space that the mount entry should be ommitted from
|
||||||
|
+mount table listings. The default is "no" to avoid unexpected changes in
|
||||||
|
+behaviour and so is an opt-in setting.
|
||||||
|
+.TP
|
||||||
|
.B sss_master_map_wait
|
||||||
|
.br
|
||||||
|
Set the time to wait and retry if sssd returns "no such entry" when starting
|
||||||
|
--- autofs-5.1.4.orig/redhat/autofs.conf.default.in
|
||||||
|
+++ autofs-5.1.4/redhat/autofs.conf.default.in
|
||||||
|
@@ -183,6 +183,15 @@ mount_nfs_default_protocol = 4
|
||||||
|
#
|
||||||
|
#disable_not_found_message = "no"
|
||||||
|
#
|
||||||
|
+# use_ignore_mount_option - This option is used to enable the use of autofs
|
||||||
|
+# pseudo option "disable". This option is used as a
|
||||||
|
+# hint to user space that the mount entry should be
|
||||||
|
+# ommitted from mount table listings. The default is
|
||||||
|
+# "no" to avoid unexpected changes in behaviour and
|
||||||
|
+# so is an opt-in setting.
|
||||||
|
+#
|
||||||
|
+#use_ignore_mount_option = no
|
||||||
|
+#
|
||||||
|
# sss_master_map_wait - When sssd is starting up it can sometimes return
|
||||||
|
# "no such entry" for a short time until it has read
|
||||||
|
# in the LDAP map information. Internal default is 0
|
||||||
|
--- autofs-5.1.4.orig/samples/autofs.conf.default.in
|
||||||
|
+++ autofs-5.1.4/samples/autofs.conf.default.in
|
||||||
|
@@ -182,6 +182,15 @@ browse_mode = no
|
||||||
|
#
|
||||||
|
#disable_not_found_message = "no"
|
||||||
|
#
|
||||||
|
+# use_ignore_mount_option - This option is used to enable the use of autofs
|
||||||
|
+# pseudo option "disable". This option is used as a
|
||||||
|
+# hint to user space that the mount entry should be
|
||||||
|
+# ommitted from mount table listings. The default is
|
||||||
|
+# "no" to avoid unexpected changes in behaviour and
|
||||||
|
+# so is an opt-in setting.
|
||||||
|
+#
|
||||||
|
+#use_ignore_mount_option = no
|
||||||
|
+#
|
||||||
|
# sss_master_map_wait - When sssd is starting up it can sometimes return
|
||||||
|
# "no such entry" for a short time until it has read
|
||||||
|
# in the LDAP map information. Internal default is 0
|
127
SOURCES/autofs-5.1.5-add-glibc-getmntent.patch
Normal file
127
SOURCES/autofs-5.1.5-add-glibc-getmntent.patch
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
autofs-5.1.5 - add glibc getmntent_r()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add a slightly modified version of the glibc getmntent_r() function
|
||||||
|
so autofs can read the proc mount table directly.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
lib/mounts.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 96 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -66,6 +66,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use bit flags for autofs mount types in mnt_list.
|
||||||
|
- use mp instead of path in mnt_list entries.
|
||||||
|
- always use PROC_MOUNTS to make mount lists.
|
||||||
|
+- add glibc getmntent_r().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -786,6 +786,101 @@ done:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* From glibc decode_name() */
|
||||||
|
+/* Since the values in a line are separated by spaces, a name cannot
|
||||||
|
+ * contain a space. Therefore some programs encode spaces in names
|
||||||
|
+ * by the strings "\040". We undo the encoding when reading an entry.
|
||||||
|
+ * The decoding happens in place.
|
||||||
|
+ */
|
||||||
|
+static char *local_decode_name(char *buf)
|
||||||
|
+{
|
||||||
|
+ char *rp = buf;
|
||||||
|
+ char *wp = buf;
|
||||||
|
+
|
||||||
|
+ do {
|
||||||
|
+ if (rp[0] == '\\' && rp[1] == '0' &&
|
||||||
|
+ rp[2] == '4' && rp[3] == '0') {
|
||||||
|
+ /* \040 is a SPACE. */
|
||||||
|
+ *wp++ = ' ';
|
||||||
|
+ rp += 3;
|
||||||
|
+ } else if (rp[0] == '\\' && rp[1] == '0' &&
|
||||||
|
+ rp[2] == '1' && rp[3] == '1') {
|
||||||
|
+ /* \011 is a TAB. */
|
||||||
|
+ *wp++ = '\t';
|
||||||
|
+ rp += 3;
|
||||||
|
+ } else if (rp[0] == '\\' && rp[1] == '0' &&
|
||||||
|
+ rp[2] == '1' && rp[3] == '2') {
|
||||||
|
+ /* \012 is a NEWLINE. */
|
||||||
|
+ *wp++ = '\n';
|
||||||
|
+ rp += 3;
|
||||||
|
+ } else if (rp[0] == '\\' && rp[1] == '\\') {
|
||||||
|
+ /*
|
||||||
|
+ * We have to escape \\ to be able to represent
|
||||||
|
+ * all characters.
|
||||||
|
+ */
|
||||||
|
+ *wp++ = '\\';
|
||||||
|
+ rp += 1;
|
||||||
|
+ } else if (rp[0] == '\\' && rp[1] == '1' &&
|
||||||
|
+ rp[2] == '3' && rp[3] == '4') {
|
||||||
|
+ /* \134 is also \\. */
|
||||||
|
+ *wp++ = '\\';
|
||||||
|
+ rp += 3;
|
||||||
|
+ } else
|
||||||
|
+ *wp++ = *rp;
|
||||||
|
+ } while (*rp++ != '\0');
|
||||||
|
+
|
||||||
|
+ return buf;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* From glibc getmntent_r() */
|
||||||
|
+static struct mntent *
|
||||||
|
+local_getmntent_r(FILE *tab, struct mntent *mnt, char *buf, int size)
|
||||||
|
+{
|
||||||
|
+ char *cp, *head;
|
||||||
|
+
|
||||||
|
+ do {
|
||||||
|
+ char *end_ptr;
|
||||||
|
+
|
||||||
|
+ if (fgets(buf, size, tab) == NULL)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ end_ptr = strchr(buf, '\n');
|
||||||
|
+ if (end_ptr != NULL) {
|
||||||
|
+ while (end_ptr[-1] == ' ' || end_ptr[-1] == '\t')
|
||||||
|
+ end_ptr--;
|
||||||
|
+ *end_ptr = '\0';
|
||||||
|
+ } else {
|
||||||
|
+ /* Whole line was not read. Do it now but forget it. */
|
||||||
|
+ char tmp[1024];
|
||||||
|
+ while (fgets(tmp, sizeof tmp, tab) != NULL)
|
||||||
|
+ if (strchr(tmp, '\n') != NULL)
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ head = buf + strspn(buf, " \t");
|
||||||
|
+ /* skip empty lines and comment lines */
|
||||||
|
+ } while (head[0] == '\0' || head[0] == '#');
|
||||||
|
+
|
||||||
|
+ cp = strsep(&head, " \t");
|
||||||
|
+ mnt->mnt_fsname = cp != NULL ? local_decode_name(cp) : (char *) "";
|
||||||
|
+ if (head)
|
||||||
|
+ head += strspn(head, " \t");
|
||||||
|
+ cp = strsep(&head, " \t");
|
||||||
|
+ mnt->mnt_dir = cp != NULL ? local_decode_name (cp) : (char *) "";
|
||||||
|
+ if (head)
|
||||||
|
+ head += strspn(head, " \t");
|
||||||
|
+ cp = strsep(&head, " \t");
|
||||||
|
+ mnt->mnt_type = cp != NULL ? local_decode_name (cp) : (char *) "";
|
||||||
|
+ if (head)
|
||||||
|
+ head += strspn (head, " \t");
|
||||||
|
+ cp = strsep (&head, " \t");
|
||||||
|
+ mnt->mnt_opts = cp != NULL ? local_decode_name (cp) : (char *) "";
|
||||||
|
+
|
||||||
|
+ /* autofs doesn't need freq or passno */
|
||||||
|
+
|
||||||
|
+ return mnt;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Get list of mounts under path in longest->shortest order
|
||||||
|
*/
|
90
SOURCES/autofs-5.1.5-add-ignore-mount-option.patch
Normal file
90
SOURCES/autofs-5.1.5-add-ignore-mount-option.patch
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
autofs-5.1.5 - add ignore mount option
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add mount option "ignore", if the kernel supports it, as an
|
||||||
|
indicator to applications to ignore the mount entry.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 10 ++++++++++
|
||||||
|
daemon/indirect.c | 10 ++++++++++
|
||||||
|
include/automount.h | 3 +++
|
||||||
|
lib/master.c | 4 ++--
|
||||||
|
5 files changed, 26 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -424,6 +424,16 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
mp->options = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
|
||||||
|
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
|
||||||
|
+ (get_kver_major() > 5))) {
|
||||||
|
+ char *tmp = realloc(mp->options, strlen(mp->options) + 7);
|
||||||
|
+ if (tmp) {
|
||||||
|
+ strcat(tmp, ",ignore");
|
||||||
|
+ mp->options = tmp;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -133,6 +133,16 @@ static int do_mount_autofs_indirect(stru
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
|
||||||
|
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
|
||||||
|
+ (get_kver_major() > 5))) {
|
||||||
|
+ char *tmp = realloc(options, strlen(options) + 7);
|
||||||
|
+ if (tmp) {
|
||||||
|
+ strcat(tmp, ",ignore");
|
||||||
|
+ options = tmp;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||||||
|
if (mkdir_path(root, mp_mode) < 0) {
|
||||||
|
if (errno != EEXIST && errno != EROFS) {
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -556,6 +556,9 @@ struct kernel_mod_version {
|
||||||
|
/* Use strict expire semantics if requested and kernel supports it */
|
||||||
|
#define MOUNT_FLAG_STRICTEXPIRE 0x0400
|
||||||
|
|
||||||
|
+/* Indicator for applications to ignore the mount entry */
|
||||||
|
+#define MOUNT_FLAG_IGNORE 0x0800
|
||||||
|
+
|
||||||
|
struct autofs_point {
|
||||||
|
pthread_t thid;
|
||||||
|
char *path; /* Mount point name */
|
||||||
|
--- autofs-5.1.4.orig/lib/master.c
|
||||||
|
+++ autofs-5.1.4/lib/master.c
|
||||||
|
@@ -101,9 +101,9 @@ int master_add_autofs_point(struct maste
|
||||||
|
ap->negative_timeout = global_negative_timeout;
|
||||||
|
ap->exp_timeout = defaults_get_timeout();
|
||||||
|
ap->exp_runfreq = 0;
|
||||||
|
- ap->flags = 0;
|
||||||
|
+ ap->flags = MOUNT_FLAG_IGNORE;
|
||||||
|
if (ghost)
|
||||||
|
- ap->flags = MOUNT_FLAG_GHOST;
|
||||||
|
+ ap->flags |= MOUNT_FLAG_GHOST;
|
||||||
|
|
||||||
|
if (nobind)
|
||||||
|
ap->flags |= MOUNT_FLAG_NOBIND;
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -60,6 +60,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- remove a couple of old debug messages.
|
||||||
|
- fix amd entry memory leak.
|
||||||
|
- fix unlink_mount_tree() not umounting mounts.
|
||||||
|
+- add ignore mount option.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
@ -0,0 +1,174 @@
|
|||||||
|
autofs-5.1.5 - add mount_verbose configuration option
|
||||||
|
|
||||||
|
From: Lars R. Damerow <lars@pixar.com>
|
||||||
|
|
||||||
|
This option makes automount pass the -v flag to mount(8).
|
||||||
|
|
||||||
|
Signed-off-by: Lars R. Damerow <lars@pixar.com>
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/spawn.c | 20 ++++++++++++--------
|
||||||
|
include/defaults.h | 2 ++
|
||||||
|
lib/defaults.c | 17 +++++++++++++++++
|
||||||
|
man/autofs.conf.5.in | 4 ++++
|
||||||
|
redhat/autofs.conf.default.in | 4 ++++
|
||||||
|
samples/autofs.conf.default.in | 4 ++++
|
||||||
|
7 files changed, 44 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -47,6 +47,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- support strictexpire mount option.
|
||||||
|
- add NULL check for get_addr_string() return.
|
||||||
|
- use malloc(3) in spawn.c.
|
||||||
|
+- add mount_verbose configuration option.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/spawn.c
|
||||||
|
+++ autofs-5.1.4/daemon/spawn.c
|
||||||
|
@@ -558,12 +558,14 @@ int spawn_mount(unsigned logopt, ...)
|
||||||
|
char prog[] = PATH_MOUNT;
|
||||||
|
char arg0[] = PATH_MOUNT;
|
||||||
|
char argn[] = "-n";
|
||||||
|
+ char argvr[] = "-v";
|
||||||
|
/* In case we need to use the fake option to mount */
|
||||||
|
char arg_fake[] = "-f";
|
||||||
|
unsigned int options;
|
||||||
|
unsigned int retries = MTAB_LOCK_RETRIES;
|
||||||
|
int update_mtab = 1, ret, printed = 0;
|
||||||
|
unsigned int wait = defaults_get_mount_wait();
|
||||||
|
+ int verbose = defaults_get_mount_verbose();
|
||||||
|
char buf[PATH_MAX + 1];
|
||||||
|
unsigned int argv_len;
|
||||||
|
|
||||||
|
@@ -590,8 +592,10 @@ int spawn_mount(unsigned logopt, ...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Alloc 1 extra slot in case we need to use the "-f" option */
|
||||||
|
- argv_len = sizeof(char *) * (argc + 2);
|
||||||
|
+ /* Alloc 2 extra slots in case we need to use the "-f" or "-v" options
|
||||||
|
+ * plus the NULL slot for end of args.
|
||||||
|
+ */
|
||||||
|
+ argv_len = sizeof(char *) * (argc + 3);
|
||||||
|
argv = malloc(argv_len);
|
||||||
|
if (!argv) {
|
||||||
|
char buf[MAX_ERR_BUF];
|
||||||
|
@@ -604,12 +608,12 @@ int spawn_mount(unsigned logopt, ...)
|
||||||
|
argv[0] = arg0;
|
||||||
|
|
||||||
|
va_start(arg, logopt);
|
||||||
|
- if (update_mtab)
|
||||||
|
- p = argv + 1;
|
||||||
|
- else {
|
||||||
|
- argv[1] = argn;
|
||||||
|
- p = argv + 2;
|
||||||
|
- }
|
||||||
|
+ p = argv + 1;
|
||||||
|
+ if (!update_mtab)
|
||||||
|
+ *(p++) = argn;
|
||||||
|
+ if (verbose)
|
||||||
|
+ *(p++) = argvr;
|
||||||
|
+
|
||||||
|
while ((*p = va_arg(arg, char *))) {
|
||||||
|
if (options == SPAWN_OPT_OPEN && !strcmp(*p, "-t")) {
|
||||||
|
*(++p) = va_arg(arg, char *);
|
||||||
|
--- autofs-5.1.4.orig/include/defaults.h
|
||||||
|
+++ autofs-5.1.4/include/defaults.h
|
||||||
|
@@ -27,6 +27,7 @@
|
||||||
|
#define DEFAULT_TIMEOUT "600"
|
||||||
|
#define DEFAULT_MASTER_WAIT "10"
|
||||||
|
#define DEFAULT_NEGATIVE_TIMEOUT "60"
|
||||||
|
+#define DEFAULT_MOUNT_VERBOSE "0"
|
||||||
|
#define DEFAULT_MOUNT_WAIT "-1"
|
||||||
|
#define DEFAULT_UMOUNT_WAIT "12"
|
||||||
|
#define DEFAULT_BROWSE_MODE "1"
|
||||||
|
@@ -166,6 +167,7 @@ unsigned int defaults_get_ldap_timeout(v
|
||||||
|
unsigned int defaults_get_ldap_network_timeout(void);
|
||||||
|
unsigned int defaults_get_mount_nfs_default_proto(void);
|
||||||
|
unsigned int defaults_get_append_options(void);
|
||||||
|
+unsigned int defaults_get_mount_verbose(void);
|
||||||
|
unsigned int defaults_get_mount_wait(void);
|
||||||
|
unsigned int defaults_get_umount_wait(void);
|
||||||
|
const char *defaults_get_auth_conf_file(void);
|
||||||
|
--- autofs-5.1.4.orig/lib/defaults.c
|
||||||
|
+++ autofs-5.1.4/lib/defaults.c
|
||||||
|
@@ -68,6 +68,7 @@
|
||||||
|
|
||||||
|
#define NAME_MOUNT_NFS_DEFAULT_PROTOCOL "mount_nfs_default_protocol"
|
||||||
|
#define NAME_APPEND_OPTIONS "append_options"
|
||||||
|
+#define NAME_MOUNT_VERBOSE "mount_verbose"
|
||||||
|
#define NAME_MOUNT_WAIT "mount_wait"
|
||||||
|
#define NAME_UMOUNT_WAIT "umount_wait"
|
||||||
|
#define NAME_AUTH_CONF_FILE "auth_conf_file"
|
||||||
|
@@ -328,6 +329,11 @@ static int conf_load_autofs_defaults(voi
|
||||||
|
if (ret == CFG_FAIL)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
+ ret = conf_update(sec, NAME_MOUNT_VERBOSE,
|
||||||
|
+ DEFAULT_MOUNT_VERBOSE, CONF_ENV);
|
||||||
|
+ if (ret == CFG_FAIL)
|
||||||
|
+ goto error;
|
||||||
|
+
|
||||||
|
ret = conf_update(sec, NAME_MOUNT_WAIT,
|
||||||
|
DEFAULT_MOUNT_WAIT, CONF_ENV);
|
||||||
|
if (ret == CFG_FAIL)
|
||||||
|
@@ -1780,6 +1786,17 @@ unsigned int defaults_get_append_options
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+unsigned int defaults_get_mount_verbose(void)
|
||||||
|
+{
|
||||||
|
+ long res;
|
||||||
|
+
|
||||||
|
+ res = conf_get_yesno(autofs_gbl_sec, NAME_MOUNT_VERBOSE);
|
||||||
|
+ if (res < 0)
|
||||||
|
+ res = atoi(DEFAULT_MOUNT_VERBOSE);
|
||||||
|
+
|
||||||
|
+ return res;
|
||||||
|
+}
|
||||||
|
|
||||||
|
unsigned int defaults_get_mount_wait(void)
|
||||||
|
{
|
||||||
|
--- autofs-5.1.4.orig/man/autofs.conf.5.in
|
||||||
|
+++ autofs-5.1.4/man/autofs.conf.5.in
|
||||||
|
@@ -41,6 +41,10 @@ Set the default timeout for caching fail
|
||||||
|
60). If the equivalent command line option is given it will override this
|
||||||
|
setting.
|
||||||
|
.TP
|
||||||
|
+.B mount_verbose
|
||||||
|
+.br
|
||||||
|
+Use the verbose flag when spawning mount(8) (program default "no").
|
||||||
|
+.TP
|
||||||
|
.B mount_wait
|
||||||
|
.br
|
||||||
|
Set the default time to wait for a response from a spawned mount(8)
|
||||||
|
--- autofs-5.1.4.orig/redhat/autofs.conf.default.in
|
||||||
|
+++ autofs-5.1.4/redhat/autofs.conf.default.in
|
||||||
|
@@ -26,6 +26,10 @@ timeout = 300
|
||||||
|
#
|
||||||
|
#negative_timeout = 60
|
||||||
|
#
|
||||||
|
+# mount_verbose - use the -v flag when calling mount(8).
|
||||||
|
+#
|
||||||
|
+#mount_verbose = no
|
||||||
|
+#
|
||||||
|
# mount_wait - time to wait for a response from mount(8).
|
||||||
|
# Setting this timeout can cause problems when
|
||||||
|
# mount would otherwise wait for a server that
|
||||||
|
--- autofs-5.1.4.orig/samples/autofs.conf.default.in
|
||||||
|
+++ autofs-5.1.4/samples/autofs.conf.default.in
|
||||||
|
@@ -26,6 +26,10 @@ timeout = 300
|
||||||
|
#
|
||||||
|
#negative_timeout = 60
|
||||||
|
#
|
||||||
|
+# mount_verbose - use the -v flag when calling mount(8).
|
||||||
|
+#
|
||||||
|
+#mount_verbose = no
|
||||||
|
+#
|
||||||
|
# mount_wait - time to wait for a response from mount(8).
|
||||||
|
# Setting this timeout can cause problems when
|
||||||
|
# mount would otherwise wait for a server that
|
200
SOURCES/autofs-5.1.5-add-strictexpire-mount-option.patch
Normal file
200
SOURCES/autofs-5.1.5-add-strictexpire-mount-option.patch
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
autofs-5.1.5 - support strictexpire mount option
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Kernel commit 092a53452b (("autofs: take more care to not update
|
||||||
|
last_used on path walk") helped to (partially) resolve a problem
|
||||||
|
where automounts were not expiring due to aggressive accesses from
|
||||||
|
user space.
|
||||||
|
|
||||||
|
This patch was later reverted because, for very large environments,
|
||||||
|
it meant more mount requests from clients and when there are a lot
|
||||||
|
of clients this caused a fairly significant increase in server load.
|
||||||
|
|
||||||
|
But there is a need for both types of expire check, depending on use
|
||||||
|
case, so a mount option to allow for strict update of last use of
|
||||||
|
autofs dentrys has been added ito the autofs file system (which just
|
||||||
|
means not updating the last use on path walk accesses).
|
||||||
|
|
||||||
|
So add support for this master map mount entry option in the user
|
||||||
|
space code.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 10 ++++++++++
|
||||||
|
daemon/indirect.c | 10 ++++++++++
|
||||||
|
include/automount.h | 3 +++
|
||||||
|
lib/master_parse.y | 8 +++++++-
|
||||||
|
lib/master_tok.l | 1 +
|
||||||
|
man/auto.master.5.in | 8 ++++++++
|
||||||
|
modules/mount_autofs.c | 5 +++++
|
||||||
|
8 files changed, 45 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -44,6 +44,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use flags for startup boolean options.
|
||||||
|
- move close stdio descriptors to become_daemon().
|
||||||
|
- add systemd service command line option.
|
||||||
|
+- support strictexpire mount option.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -421,6 +421,16 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
mp->options = make_options_string(ap->path, ap->kpipefd, str_direct);
|
||||||
|
if (!mp->options)
|
||||||
|
return 0;
|
||||||
|
+
|
||||||
|
+ if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
|
||||||
|
+ ((get_kver_major() == 5 && get_kver_minor() > 3) ||
|
||||||
|
+ (get_kver_major() > 5))) {
|
||||||
|
+ char *tmp = realloc(mp->options, strlen(mp->options) + 12);
|
||||||
|
+ if (tmp) {
|
||||||
|
+ strcat(tmp, ",strictexpire");
|
||||||
|
+ mp->options = tmp;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -132,6 +132,16 @@ static int do_mount_autofs_indirect(stru
|
||||||
|
goto out_err;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
|
||||||
|
+ ((get_kver_major() == 5 && get_kver_minor() > 3) ||
|
||||||
|
+ (get_kver_major() > 5))) {
|
||||||
|
+ char *tmp = realloc(options, strlen(options) + 12);
|
||||||
|
+ if (tmp) {
|
||||||
|
+ strcat(tmp, ",strictexpire");
|
||||||
|
+ options = tmp;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||||||
|
if (mkdir_path(root, mp_mode) < 0) {
|
||||||
|
if (errno != EEXIST && errno != EROFS) {
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -553,6 +553,9 @@ struct kernel_mod_version {
|
||||||
|
#define MOUNT_FLAG_SLAVE 0x0100
|
||||||
|
#define MOUNT_FLAG_PRIVATE 0x0200
|
||||||
|
|
||||||
|
+/* Use strict expire semantics if requested and kernel supports it */
|
||||||
|
+#define MOUNT_FLAG_STRICTEXPIRE 0x0400
|
||||||
|
+
|
||||||
|
struct autofs_point {
|
||||||
|
pthread_t thid;
|
||||||
|
char *path; /* Mount point name */
|
||||||
|
--- autofs-5.1.4.orig/lib/master_parse.y
|
||||||
|
+++ autofs-5.1.4/lib/master_parse.y
|
||||||
|
@@ -58,6 +58,7 @@ static char *format;
|
||||||
|
static long timeout;
|
||||||
|
static long negative_timeout;
|
||||||
|
static unsigned symlnk;
|
||||||
|
+static unsigned strictexpire;
|
||||||
|
static unsigned slave;
|
||||||
|
static unsigned private;
|
||||||
|
static unsigned nobind;
|
||||||
|
@@ -105,7 +106,7 @@ static int master_fprintf(FILE *, char *
|
||||||
|
%token MAP
|
||||||
|
%token OPT_TIMEOUT OPT_NTIMEOUT OPT_NOBIND OPT_NOGHOST OPT_GHOST OPT_VERBOSE
|
||||||
|
%token OPT_DEBUG OPT_RANDOM OPT_USE_WEIGHT OPT_SYMLINK OPT_MODE
|
||||||
|
-%token OPT_SLAVE OPT_PRIVATE
|
||||||
|
+%token OPT_STRICTEXPIRE OPT_SLAVE OPT_PRIVATE
|
||||||
|
%token COLON COMMA NL DDASH
|
||||||
|
%type <strtype> map
|
||||||
|
%type <strtype> options
|
||||||
|
@@ -206,6 +207,7 @@ line:
|
||||||
|
| PATH OPT_DEBUG { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_SYMLINK { master_notify($1); YYABORT; }
|
||||||
|
+ | PATH OPT_STRICTEXPIRE { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_SLAVE { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_PRIVATE { master_notify($1); YYABORT; }
|
||||||
|
| PATH OPT_NOBIND { master_notify($1); YYABORT; }
|
||||||
|
@@ -619,6 +621,7 @@ option: daemon_option
|
||||||
|
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; }
|
||||||
|
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; }
|
||||||
|
| OPT_SYMLINK { symlnk = 1; }
|
||||||
|
+ | OPT_STRICTEXPIRE { strictexpire = 1; }
|
||||||
|
| OPT_SLAVE { slave = 1; }
|
||||||
|
| OPT_PRIVATE { private = 1; }
|
||||||
|
| OPT_NOBIND { nobind = 1; }
|
||||||
|
@@ -693,6 +696,7 @@ static void local_init_vars(void)
|
||||||
|
timeout = -1;
|
||||||
|
negative_timeout = 0;
|
||||||
|
symlnk = 0;
|
||||||
|
+ strictexpire = 0;
|
||||||
|
slave = 0;
|
||||||
|
private = 0;
|
||||||
|
nobind = 0;
|
||||||
|
@@ -901,6 +905,8 @@ int master_parse_entry(const char *buffe
|
||||||
|
entry->ap->flags |= MOUNT_FLAG_USE_WEIGHT_ONLY;
|
||||||
|
if (symlnk)
|
||||||
|
entry->ap->flags |= MOUNT_FLAG_SYMLINK;
|
||||||
|
+ if (strictexpire)
|
||||||
|
+ entry->ap->flags |= MOUNT_FLAG_STRICTEXPIRE;
|
||||||
|
if (slave)
|
||||||
|
entry->ap->flags |= MOUNT_FLAG_SLAVE;
|
||||||
|
if (private)
|
||||||
|
--- autofs-5.1.4.orig/lib/master_tok.l
|
||||||
|
+++ autofs-5.1.4/lib/master_tok.l
|
||||||
|
@@ -391,6 +391,7 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTW
|
||||||
|
-?nobrowse { return(OPT_NOGHOST); }
|
||||||
|
-?slave { return(OPT_SLAVE); }
|
||||||
|
-?private { return(OPT_PRIVATE); }
|
||||||
|
+ -?strictexpire { return(OPT_STRICTEXPIRE); }
|
||||||
|
-g|--ghost|-?browse { return(OPT_GHOST); }
|
||||||
|
-v|--verbose { return(OPT_VERBOSE); }
|
||||||
|
-d|--debug { return(OPT_DEBUG); }
|
||||||
|
--- autofs-5.1.4.orig/man/auto.master.5.in
|
||||||
|
+++ autofs-5.1.4/man/auto.master.5.in
|
||||||
|
@@ -199,6 +199,14 @@ entries only, either in the master map (
|
||||||
|
or with individual map entries. The option is ignored for direct mounts
|
||||||
|
and non-root offest mount entries.
|
||||||
|
.TP
|
||||||
|
+.I "strictexpire"
|
||||||
|
+Use a strict expire policy for this automount. Using this option means
|
||||||
|
+that last use of autofs directory entries will not be updated during
|
||||||
|
+path walks so that mounts in an automount won't be kept mounted by
|
||||||
|
+applications scanning the mount tree. Note that this doesn't completely
|
||||||
|
+resolve the problem of expired automounts being immediately re-mounted
|
||||||
|
+due to application accesses triggered by the expire itself.
|
||||||
|
+.TP
|
||||||
|
.I slave \fPor\fI private
|
||||||
|
This option allows mount propagation of bind mounts to be set to
|
||||||
|
either \fIslave\fP or \fIprivate\fP. This option may be needed when using
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_autofs.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_autofs.c
|
||||||
|
@@ -57,6 +57,7 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
int nobind = ap->flags & MOUNT_FLAG_NOBIND;
|
||||||
|
int ghost = ap->flags & MOUNT_FLAG_GHOST;
|
||||||
|
int symlnk = ap->flags & MOUNT_FLAG_SYMLINK;
|
||||||
|
+ int strictexpire = ap->flags & MOUNT_FLAG_STRICTEXPIRE;
|
||||||
|
time_t timeout = get_exp_timeout(ap, ap->entry->maps);
|
||||||
|
unsigned logopt = ap->logopt;
|
||||||
|
struct map_type_info *info;
|
||||||
|
@@ -131,6 +132,8 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
ghost = 1;
|
||||||
|
else if (_strncmp("symlink", cp, 7) == 0)
|
||||||
|
symlnk = 1;
|
||||||
|
+ else if (_strncmp("strictexpire", cp, 12) == 0)
|
||||||
|
+ strictexpire = 1;
|
||||||
|
else if (_strncmp("hosts", cp, 5) == 0)
|
||||||
|
hosts = 1;
|
||||||
|
else if (_strncmp("timeout=", cp, 8) == 0) {
|
||||||
|
@@ -173,6 +176,8 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
nap->parent = ap;
|
||||||
|
if (symlnk)
|
||||||
|
nap->flags |= MOUNT_FLAG_SYMLINK;
|
||||||
|
+ if (strictexpire)
|
||||||
|
+ nap->flags |= MOUNT_FLAG_STRICTEXPIRE;
|
||||||
|
|
||||||
|
if (hosts)
|
||||||
|
argc = 0;
|
@ -0,0 +1,34 @@
|
|||||||
|
autofs-5.1.5 - allow period following macro in selector value
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
If a ${} macro is used in a selector (such as hostd) the parser doesn't
|
||||||
|
permit a period to follow it (such as when the value is a host name).
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/amd_tok.l | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -51,6 +51,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- optionally log mount requestor process info.
|
||||||
|
- log mount call arguments if mount_verbose is set.
|
||||||
|
- make expire remaining log level debug.
|
||||||
|
+- allow period following macro in selector value.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/modules/amd_tok.l
|
||||||
|
+++ autofs-5.1.4/modules/amd_tok.l
|
||||||
|
@@ -95,7 +95,7 @@ V6MASK (12[0-8]|1[0-1][0-9]|[1-9][0-9]|
|
||||||
|
|
||||||
|
FOPT (({QSTR}|{FSTR}|{MACRO})+)
|
||||||
|
OPTS ({OSTR}(=({VSTR}|{MACRO})+)?)
|
||||||
|
-SOPT (({SSTR}|{QSTR}|{MACRO})+)
|
||||||
|
+SOPT ({SSTR}|{QSTR}|{MACRO}(\.|{SSTR}|{QSTR}|{MACRO})+)
|
||||||
|
NOPT ({SSTR}|(({IP4ADDR}(\/{V4MASK})?)|({IP6ADDR}(\/{V6MASK})?)))
|
||||||
|
|
||||||
|
MAPOPT (fs|type|maptype|pref|sublink|cache)
|
42
SOURCES/autofs-5.1.5-also-use-strictexpire-for-offsets.patch
Normal file
42
SOURCES/autofs-5.1.5-also-use-strictexpire-for-offsets.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
autofs-5.1.5 - also use strictexpire for offsets
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Map entries with offsets should use the "strictexpire" option when
|
||||||
|
mounting offsets if the option is set for the owner mount.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 10 ++++++++++
|
||||||
|
2 files changed, 11 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -53,6 +53,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- make expire remaining log level debug.
|
||||||
|
- allow period following macro in selector value.
|
||||||
|
- fix macro expansion in selector values.
|
||||||
|
+- also use strictexpire for offsets.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -743,6 +743,16 @@ int mount_autofs_offset(struct autofs_po
|
||||||
|
mp->options = make_options_string(ap->path, ap->kpipefd, str_offset);
|
||||||
|
if (!mp->options)
|
||||||
|
return MOUNT_OFFSET_OK;
|
||||||
|
+
|
||||||
|
+ if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
|
||||||
|
+ ((get_kver_major() == 5 && get_kver_minor() > 3) ||
|
||||||
|
+ (get_kver_major() > 5))) {
|
||||||
|
+ char *tmp = realloc(mp->options, strlen(mp->options) + 12);
|
||||||
|
+ if (tmp) {
|
||||||
|
+ strcat(tmp, ",strictexpire");
|
||||||
|
+ mp->options = tmp;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(mountpoint, root);
|
@ -0,0 +1,405 @@
|
|||||||
|
autofs-5.1.5 - always use PROC_MOUNTS to make mount lists
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
If it's necessary to read a mount table then always use the proc file
|
||||||
|
system mount table.
|
||||||
|
|
||||||
|
This could be very inefficient for cases where the mtab (_PATH_MOUNTED)
|
||||||
|
is specified but the mtab has been a symlink to the proc mount tables
|
||||||
|
for quite a while now so it doesn't make any difference always using
|
||||||
|
the proc tables.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 6 +++---
|
||||||
|
daemon/direct.c | 14 +++++++-------
|
||||||
|
daemon/indirect.c | 8 ++++----
|
||||||
|
daemon/lookup.c | 4 ++--
|
||||||
|
daemon/spawn.c | 2 +-
|
||||||
|
daemon/state.c | 2 +-
|
||||||
|
include/mounts.h | 6 +++---
|
||||||
|
lib/mounts.c | 40 ++++++++++++++++++++--------------------
|
||||||
|
modules/parse_amd.c | 4 ++--
|
||||||
|
10 files changed, 44 insertions(+), 43 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -65,6 +65,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add config option for "ignore" mount option
|
||||||
|
- use bit flags for autofs mount types in mnt_list.
|
||||||
|
- use mp instead of path in mnt_list entries.
|
||||||
|
+- always use PROC_MOUNTS to make mount lists.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -333,7 +333,7 @@ static int walk_tree(const char *base, i
|
||||||
|
struct stat st, *pst = &st;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- if (!is_mounted(_PATH_MOUNTED, base, MNTS_REAL))
|
||||||
|
+ if (!is_mounted(base, MNTS_REAL))
|
||||||
|
ret = lstat(base, pst);
|
||||||
|
else {
|
||||||
|
pst = NULL;
|
||||||
|
@@ -593,11 +593,11 @@ static int umount_subtree_mounts(struct
|
||||||
|
* If this is the root of a multi-mount we've had to umount
|
||||||
|
* it already to ensure it's ok to remove any offset triggers.
|
||||||
|
*/
|
||||||
|
- if (!is_mm_root && is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
|
||||||
|
+ if (!is_mm_root && is_mounted(path, MNTS_REAL)) {
|
||||||
|
struct amd_entry *entry;
|
||||||
|
debug(ap->logopt, "unmounting dir = %s", path);
|
||||||
|
if (umount_ent(ap, path) &&
|
||||||
|
- is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
|
||||||
|
+ is_mounted(path, MNTS_REAL)) {
|
||||||
|
warn(ap->logopt, "could not umount dir %s", path);
|
||||||
|
left++;
|
||||||
|
goto done;
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -207,7 +207,7 @@ int umount_autofs_direct(struct autofs_p
|
||||||
|
struct mnt_list *mnts;
|
||||||
|
struct mapent *me, *ne;
|
||||||
|
|
||||||
|
- mnts = tree_make_mnt_tree(_PROC_MOUNTS, "/");
|
||||||
|
+ mnts = tree_make_mnt_tree("/");
|
||||||
|
pthread_cleanup_push(mnts_cleanup, mnts);
|
||||||
|
nc = ap->entry->master->nc;
|
||||||
|
cache_readlock(nc);
|
||||||
|
@@ -515,7 +515,7 @@ int mount_autofs_direct(struct autofs_po
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- mnts = tree_make_mnt_tree(_PROC_MOUNTS, "/");
|
||||||
|
+ mnts = tree_make_mnt_tree("/");
|
||||||
|
pthread_cleanup_push(mnts_cleanup, mnts);
|
||||||
|
pthread_cleanup_push(master_source_lock_cleanup, ap->entry);
|
||||||
|
master_source_readlock(ap->entry);
|
||||||
|
@@ -583,7 +583,7 @@ int umount_autofs_offset(struct autofs_p
|
||||||
|
int opened = 0;
|
||||||
|
|
||||||
|
if (me->ioctlfd != -1) {
|
||||||
|
- if (is_mounted(_PATH_MOUNTED, me->key, MNTS_REAL)) {
|
||||||
|
+ if (is_mounted(me->key, MNTS_REAL)) {
|
||||||
|
error(ap->logopt,
|
||||||
|
"attempt to umount busy offset %s", me->key);
|
||||||
|
return 1;
|
||||||
|
@@ -591,7 +591,7 @@ int umount_autofs_offset(struct autofs_p
|
||||||
|
ioctlfd = me->ioctlfd;
|
||||||
|
} else {
|
||||||
|
/* offset isn't mounted, return success and try to recover */
|
||||||
|
- if (!is_mounted(_PROC_MOUNTS, me->key, MNTS_AUTOFS)) {
|
||||||
|
+ if (!is_mounted(me->key, MNTS_AUTOFS)) {
|
||||||
|
debug(ap->logopt,
|
||||||
|
"offset %s not mounted",
|
||||||
|
me->key);
|
||||||
|
@@ -707,7 +707,7 @@ int mount_autofs_offset(struct autofs_po
|
||||||
|
if (!(ret == -1 && errno == ENOENT))
|
||||||
|
return MOUNT_OFFSET_FAIL;
|
||||||
|
} else {
|
||||||
|
- if (is_mounted(_PROC_MOUNTS, me->key, MNTS_AUTOFS)) {
|
||||||
|
+ if (is_mounted(me->key, MNTS_AUTOFS)) {
|
||||||
|
if (ap->state != ST_READMAP)
|
||||||
|
warn(ap->logopt,
|
||||||
|
"trigger %s already mounted", me->key);
|
||||||
|
@@ -781,7 +781,7 @@ int mount_autofs_offset(struct autofs_po
|
||||||
|
* the kernel NFS client.
|
||||||
|
*/
|
||||||
|
if (me->multi != me &&
|
||||||
|
- is_mounted(_PROC_MOUNTS, mountpoint, MNTS_REAL))
|
||||||
|
+ is_mounted(mountpoint, MNTS_REAL))
|
||||||
|
return MOUNT_OFFSET_IGNORE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -901,7 +901,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
|
||||||
|
left = 0;
|
||||||
|
|
||||||
|
- mnts = tree_make_mnt_tree(_PROC_MOUNTS, "/");
|
||||||
|
+ mnts = tree_make_mnt_tree("/");
|
||||||
|
pthread_cleanup_push(mnts_cleanup, mnts);
|
||||||
|
|
||||||
|
/* Get a list of mounts select real ones and expire them if possible */
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -104,7 +104,7 @@ static int do_mount_autofs_indirect(stru
|
||||||
|
if (ret == 0)
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
- mnts = get_mnt_list(_PROC_MOUNTS, ap->path, 1);
|
||||||
|
+ mnts = get_mnt_list(ap->path, 1);
|
||||||
|
if (mnts) {
|
||||||
|
ret = unlink_mount_tree(ap, mnts);
|
||||||
|
free_mnt_list(mnts);
|
||||||
|
@@ -433,7 +433,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
left = 0;
|
||||||
|
|
||||||
|
/* Get a list of real mounts and expire them if possible */
|
||||||
|
- mnts = get_mnt_list(_PROC_MOUNTS, ap->path, 0);
|
||||||
|
+ mnts = get_mnt_list(ap->path, 0);
|
||||||
|
pthread_cleanup_push(mnts_cleanup, mnts);
|
||||||
|
for (next = mnts; next; next = next->next) {
|
||||||
|
char *ind_key;
|
||||||
|
@@ -454,7 +454,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
/* It's got a mount, deal with in the outer loop */
|
||||||
|
- if (is_mounted(_PATH_MOUNTED, next->mp, MNTS_REAL)) {
|
||||||
|
+ if (is_mounted(next->mp, MNTS_REAL)) {
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -563,7 +563,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
count = offsets = submnts = 0;
|
||||||
|
- mnts = get_mnt_list(_PROC_MOUNTS, ap->path, 0);
|
||||||
|
+ mnts = get_mnt_list(ap->path, 0);
|
||||||
|
pthread_cleanup_push(mnts_cleanup, mnts);
|
||||||
|
/* Are there any real mounts left */
|
||||||
|
for (next = mnts; next; next = next->next) {
|
||||||
|
--- autofs-5.1.4.orig/daemon/lookup.c
|
||||||
|
+++ autofs-5.1.4/daemon/lookup.c
|
||||||
|
@@ -1425,7 +1425,7 @@ void lookup_prune_one_cache(struct autof
|
||||||
|
valid = NULL;
|
||||||
|
}
|
||||||
|
if (!valid &&
|
||||||
|
- is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
|
||||||
|
+ is_mounted(path, MNTS_REAL)) {
|
||||||
|
debug(ap->logopt, "prune posponed, %s mounted", path);
|
||||||
|
free(key);
|
||||||
|
free(path);
|
||||||
|
@@ -1448,7 +1448,7 @@ void lookup_prune_one_cache(struct autof
|
||||||
|
|
||||||
|
if (valid)
|
||||||
|
cache_delete(mc, key);
|
||||||
|
- else if (!is_mounted(_PROC_MOUNTS, path, MNTS_AUTOFS)) {
|
||||||
|
+ else if (!is_mounted(path, MNTS_AUTOFS)) {
|
||||||
|
dev_t devid = ap->dev;
|
||||||
|
status = CHE_FAIL;
|
||||||
|
if (ap->type == LKP_DIRECT)
|
||||||
|
--- autofs-5.1.4.orig/daemon/spawn.c
|
||||||
|
+++ autofs-5.1.4/daemon/spawn.c
|
||||||
|
@@ -427,7 +427,7 @@ static int do_spawn(unsigned logopt, uns
|
||||||
|
if (!is_bind)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
- if (is_mounted(_PROC_MOUNTS, argv[loc], MNTS_AUTOFS)) {
|
||||||
|
+ if (is_mounted(argv[loc], MNTS_AUTOFS)) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"error: can't bind to an autofs mount\n");
|
||||||
|
close(STDOUT_FILENO);
|
||||||
|
--- autofs-5.1.4.orig/daemon/state.c
|
||||||
|
+++ autofs-5.1.4/daemon/state.c
|
||||||
|
@@ -499,7 +499,7 @@ static void *do_readmap(void *arg)
|
||||||
|
struct mapent *me;
|
||||||
|
unsigned int append_alarm = !ap->exp_runfreq;
|
||||||
|
|
||||||
|
- mnts = tree_make_mnt_tree(_PROC_MOUNTS, "/");
|
||||||
|
+ mnts = tree_make_mnt_tree("/");
|
||||||
|
pthread_cleanup_push(tree_mnts_cleanup, mnts);
|
||||||
|
nc = ap->entry->master->nc;
|
||||||
|
cache_readlock(nc);
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -99,11 +99,11 @@ char *make_mnt_name_string(char *path);
|
||||||
|
int ext_mount_add(struct list_head *, const char *, unsigned int);
|
||||||
|
int ext_mount_remove(struct list_head *, const char *);
|
||||||
|
int ext_mount_inuse(const char *);
|
||||||
|
-struct mnt_list *get_mnt_list(const char *table, const char *path, int include);
|
||||||
|
+struct mnt_list *get_mnt_list(const char *path, int include);
|
||||||
|
void free_mnt_list(struct mnt_list *list);
|
||||||
|
-int is_mounted(const char *table, const char *mp, unsigned int type);
|
||||||
|
+int is_mounted(const char *mp, unsigned int type);
|
||||||
|
void tree_free_mnt_tree(struct mnt_list *tree);
|
||||||
|
-struct mnt_list *tree_make_mnt_tree(const char *table, const char *path);
|
||||||
|
+struct mnt_list *tree_make_mnt_tree(const char *path);
|
||||||
|
int tree_get_mnt_list(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
|
||||||
|
int tree_get_mnt_sublist(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
|
||||||
|
int tree_find_mnt_ents(struct mnt_list *mnts, struct list_head *list, const char *path);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -789,7 +789,7 @@ done:
|
||||||
|
/*
|
||||||
|
* Get list of mounts under path in longest->shortest order
|
||||||
|
*/
|
||||||
|
-struct mnt_list *get_mnt_list(const char *table, const char *path, int include)
|
||||||
|
+struct mnt_list *get_mnt_list(const char *path, int include)
|
||||||
|
{
|
||||||
|
FILE *tab;
|
||||||
|
size_t pathlen = strlen(path);
|
||||||
|
@@ -803,7 +803,7 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
if (!path || !pathlen || pathlen > PATH_MAX)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- tab = open_setmntent_r(table);
|
||||||
|
+ tab = open_setmntent_r(_PROC_MOUNTS);
|
||||||
|
if (!tab) {
|
||||||
|
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
|
||||||
|
logerr("setmntent: %s", estr);
|
||||||
|
@@ -892,7 +892,7 @@ void free_mnt_list(struct mnt_list *list
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int table_is_mounted(const char *table, const char *mp, unsigned int type)
|
||||||
|
+static int table_is_mounted(const char *mp, unsigned int type)
|
||||||
|
{
|
||||||
|
struct mntent *mnt;
|
||||||
|
struct mntent mnt_wrk;
|
||||||
|
@@ -904,7 +904,7 @@ static int table_is_mounted(const char *
|
||||||
|
if (!mp || !mp_len || mp_len >= PATH_MAX)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- tab = open_setmntent_r(table);
|
||||||
|
+ tab = open_setmntent_r(_PROC_MOUNTS);
|
||||||
|
if (!tab) {
|
||||||
|
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
|
||||||
|
logerr("setmntent: %s", estr);
|
||||||
|
@@ -938,7 +938,7 @@ static int table_is_mounted(const char *
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int ioctl_is_mounted(const char *table, const char *mp, unsigned int type)
|
||||||
|
+static int ioctl_is_mounted(const char *mp, unsigned int type)
|
||||||
|
{
|
||||||
|
struct ioctl_ops *ops = get_ioctl_ops();
|
||||||
|
unsigned int mounted;
|
||||||
|
@@ -949,7 +949,7 @@ static int ioctl_is_mounted(const char *
|
||||||
|
*/
|
||||||
|
ret = ops->ismountpoint(LOGOPT_NONE, -1, mp, &mounted);
|
||||||
|
if (ret == -1)
|
||||||
|
- return table_is_mounted(table, mp, type);
|
||||||
|
+ return table_is_mounted(mp, type);
|
||||||
|
|
||||||
|
if (mounted) {
|
||||||
|
switch (type) {
|
||||||
|
@@ -964,14 +964,14 @@ static int ioctl_is_mounted(const char *
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int is_mounted(const char *table, const char *mp, unsigned int type)
|
||||||
|
+int is_mounted(const char *mp, unsigned int type)
|
||||||
|
{
|
||||||
|
struct ioctl_ops *ops = get_ioctl_ops();
|
||||||
|
|
||||||
|
if (ops->ismountpoint)
|
||||||
|
- return ioctl_is_mounted(table, mp, type);
|
||||||
|
+ return ioctl_is_mounted(mp, type);
|
||||||
|
else
|
||||||
|
- return table_is_mounted(table, mp, type);
|
||||||
|
+ return table_is_mounted(mp, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1018,7 +1018,7 @@ void tree_free_mnt_tree(struct mnt_list
|
||||||
|
/*
|
||||||
|
* Make tree of system mounts in /proc/mounts.
|
||||||
|
*/
|
||||||
|
-struct mnt_list *tree_make_mnt_tree(const char *table, const char *path)
|
||||||
|
+struct mnt_list *tree_make_mnt_tree(const char *path)
|
||||||
|
{
|
||||||
|
FILE *tab;
|
||||||
|
struct mntent mnt_wrk;
|
||||||
|
@@ -1029,7 +1029,7 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
size_t plen;
|
||||||
|
int eq;
|
||||||
|
|
||||||
|
- tab = open_setmntent_r(table);
|
||||||
|
+ tab = open_setmntent_r(_PROC_MOUNTS);
|
||||||
|
if (!tab) {
|
||||||
|
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
|
||||||
|
logerr("setmntent: %s", estr);
|
||||||
|
@@ -1281,7 +1281,7 @@ int tree_is_mounted(struct mnt_list *mnt
|
||||||
|
int mounted = 0;
|
||||||
|
|
||||||
|
if (ops->ismountpoint)
|
||||||
|
- return ioctl_is_mounted(_PROC_MOUNTS, path, type);
|
||||||
|
+ return ioctl_is_mounted(path, type);
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&list);
|
||||||
|
|
||||||
|
@@ -1856,7 +1856,7 @@ void set_indirect_mount_tree_catatonic(s
|
||||||
|
struct mapent_cache *mc;
|
||||||
|
struct mapent *me;
|
||||||
|
|
||||||
|
- if (!is_mounted(_PROC_MOUNTS, ap->path, MNTS_AUTOFS))
|
||||||
|
+ if (!is_mounted(ap->path, MNTS_AUTOFS))
|
||||||
|
return;
|
||||||
|
|
||||||
|
map = entry->maps;
|
||||||
|
@@ -1920,7 +1920,7 @@ int umount_ent(struct autofs_point *ap,
|
||||||
|
* so that we do not try to call rmdir_path on the
|
||||||
|
* directory.
|
||||||
|
*/
|
||||||
|
- if (!rv && is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
|
||||||
|
+ if (!rv && is_mounted(path, MNTS_REAL)) {
|
||||||
|
crit(ap->logopt,
|
||||||
|
"the umount binary reported that %s was "
|
||||||
|
"unmounted, but there is still something "
|
||||||
|
@@ -2053,7 +2053,7 @@ int mount_multi_triggers(struct autofs_p
|
||||||
|
*/
|
||||||
|
if (ap->state == ST_READMAP && ap->flags & MOUNT_FLAG_REMOUNT) {
|
||||||
|
if (oe->ioctlfd != -1 ||
|
||||||
|
- is_mounted(_PROC_MOUNTS, oe->key, MNTS_REAL)) {
|
||||||
|
+ is_mounted(oe->key, MNTS_REAL)) {
|
||||||
|
char oe_root[PATH_MAX + 1];
|
||||||
|
strcpy(oe_root, root);
|
||||||
|
strcat(oe_root, offset);
|
||||||
|
@@ -2142,7 +2142,7 @@ int umount_multi_triggers(struct autofs_
|
||||||
|
left += umount_multi_triggers(ap, oe, root, oe_base);
|
||||||
|
|
||||||
|
if (oe->ioctlfd != -1 ||
|
||||||
|
- is_mounted(_PROC_MOUNTS, oe->key, MNTS_REAL)) {
|
||||||
|
+ is_mounted(oe->key, MNTS_REAL)) {
|
||||||
|
left++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -2185,10 +2185,10 @@ int umount_multi_triggers(struct autofs_
|
||||||
|
* delete the offsets from the cache and we need to put
|
||||||
|
* the offset triggers back.
|
||||||
|
*/
|
||||||
|
- if (is_mounted(_PATH_MOUNTED, root, MNTS_REAL)) {
|
||||||
|
+ if (is_mounted(root, MNTS_REAL)) {
|
||||||
|
info(ap->logopt, "unmounting dir = %s", root);
|
||||||
|
if (umount_ent(ap, root) &&
|
||||||
|
- is_mounted(_PATH_MOUNTED, root, MNTS_REAL)) {
|
||||||
|
+ is_mounted(root, MNTS_REAL)) {
|
||||||
|
if (mount_multi_triggers(ap, me, root, strlen(root), "/") < 0)
|
||||||
|
warn(ap->logopt,
|
||||||
|
"failed to remount offset triggers");
|
||||||
|
@@ -2288,9 +2288,9 @@ int clean_stale_multi_triggers(struct au
|
||||||
|
* ESTALE errors when attempting list the directory.
|
||||||
|
*/
|
||||||
|
if (oe->ioctlfd != -1 ||
|
||||||
|
- is_mounted(_PROC_MOUNTS, oe->key, MNTS_REAL)) {
|
||||||
|
+ is_mounted(oe->key, MNTS_REAL)) {
|
||||||
|
if (umount_ent(ap, oe->key) &&
|
||||||
|
- is_mounted(_PROC_MOUNTS, oe->key, MNTS_REAL)) {
|
||||||
|
+ is_mounted(oe->key, MNTS_REAL)) {
|
||||||
|
debug(ap->logopt,
|
||||||
|
"offset %s has active mount, invalidate",
|
||||||
|
oe->key);
|
||||||
|
--- autofs-5.1.4.orig/modules/parse_amd.c
|
||||||
|
+++ autofs-5.1.4/modules/parse_amd.c
|
||||||
|
@@ -1173,7 +1173,7 @@ static int do_generic_mount(struct autof
|
||||||
|
* multiple times since they are outside of
|
||||||
|
* the automount filesystem.
|
||||||
|
*/
|
||||||
|
- if (!is_mounted(_PATH_MOUNTED, entry->fs, MNTS_REAL)) {
|
||||||
|
+ if (!is_mounted(entry->fs, MNTS_REAL)) {
|
||||||
|
ret = do_mount(ap, entry->fs, "/", 1,
|
||||||
|
target, entry->type, opts);
|
||||||
|
if (ret)
|
||||||
|
@@ -1223,7 +1223,7 @@ static int do_nfs_mount(struct autofs_po
|
||||||
|
target, entry->type, opts,
|
||||||
|
mount_nfs->context);
|
||||||
|
} else {
|
||||||
|
- if (!is_mounted(_PATH_MOUNTED, entry->fs, MNTS_REAL)) {
|
||||||
|
+ if (!is_mounted(entry->fs, MNTS_REAL)) {
|
||||||
|
ret = mount_nfs->mount_mount(ap, entry->fs, "/", 1,
|
||||||
|
target, entry->type, opts,
|
||||||
|
mount_nfs->context);
|
@ -0,0 +1,172 @@
|
|||||||
|
autofs-5.1.5 - don't use tree_is_mounted() for mounted checks
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Always use is_mounted() for mounted checks.
|
||||||
|
|
||||||
|
If the proc mount table actually needs to be used this could be
|
||||||
|
very inefficient but the miscelaneous device ioctl interface
|
||||||
|
has been available to quite a few years now so it really needs
|
||||||
|
to be used to avoid the scanning of mount tables.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 12 ++++--------
|
||||||
|
daemon/state.c | 4 ++--
|
||||||
|
include/automount.h | 2 +-
|
||||||
|
include/mounts.h | 1 -
|
||||||
|
lib/mounts.c | 40 ----------------------------------------
|
||||||
|
6 files changed, 8 insertions(+), 52 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -69,6 +69,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add glibc getmntent_r().
|
||||||
|
- use local getmntent_r in table_is_mounted().
|
||||||
|
- refactor unlink_active_mounts() in direct.c.
|
||||||
|
+- don't use tree_is_mounted() for mounted checks.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -82,7 +82,7 @@ static void mnts_cleanup(void *arg)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me)
|
||||||
|
+int do_umount_autofs_direct(struct autofs_point *ap, struct mapent *me)
|
||||||
|
{
|
||||||
|
struct ioctl_ops *ops = get_ioctl_ops();
|
||||||
|
char buf[MAX_ERR_BUF];
|
||||||
|
@@ -98,7 +98,7 @@ int do_umount_autofs_direct(struct autof
|
||||||
|
|
||||||
|
if (me->ioctlfd != -1) {
|
||||||
|
if (ap->state == ST_READMAP &&
|
||||||
|
- tree_is_mounted(mnts, me->key, MNTS_REAL)) {
|
||||||
|
+ is_mounted(me->key, MNTS_REAL)) {
|
||||||
|
error(ap->logopt,
|
||||||
|
"attempt to umount busy direct mount %s",
|
||||||
|
me->key);
|
||||||
|
@@ -204,11 +204,8 @@ int umount_autofs_direct(struct autofs_p
|
||||||
|
{
|
||||||
|
struct map_source *map;
|
||||||
|
struct mapent_cache *nc, *mc;
|
||||||
|
- struct mnt_list *mnts;
|
||||||
|
struct mapent *me, *ne;
|
||||||
|
|
||||||
|
- mnts = tree_make_mnt_tree("/");
|
||||||
|
- pthread_cleanup_push(mnts_cleanup, mnts);
|
||||||
|
nc = ap->entry->master->nc;
|
||||||
|
cache_readlock(nc);
|
||||||
|
pthread_cleanup_push(cache_lock_cleanup, nc);
|
||||||
|
@@ -233,7 +230,7 @@ int umount_autofs_direct(struct autofs_p
|
||||||
|
* catatonic regardless of the reason for the
|
||||||
|
* failed umount.
|
||||||
|
*/
|
||||||
|
- error = do_umount_autofs_direct(ap, mnts, me);
|
||||||
|
+ error = do_umount_autofs_direct(ap, me);
|
||||||
|
if (!error)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
@@ -246,7 +243,6 @@ done:
|
||||||
|
map = map->next;
|
||||||
|
}
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
- pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
close(ap->state_pipe[0]);
|
||||||
|
close(ap->state_pipe[1]);
|
||||||
|
@@ -947,7 +943,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* It's got a mount, deal with in the outer loop */
|
||||||
|
- if (tree_is_mounted(mnts, me->key, MNTS_REAL)) {
|
||||||
|
+ if (is_mounted(me->key, MNTS_REAL)) {
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
--- autofs-5.1.4.orig/daemon/state.c
|
||||||
|
+++ autofs-5.1.4/daemon/state.c
|
||||||
|
@@ -438,8 +438,8 @@ static void do_readmap_mount(struct auto
|
||||||
|
else
|
||||||
|
ap->exp_runfreq = runfreq;
|
||||||
|
}
|
||||||
|
- } else if (!tree_is_mounted(mnts, me->key, MNTS_REAL))
|
||||||
|
- do_umount_autofs_direct(ap, mnts, me);
|
||||||
|
+ } else if (!is_mounted(me->key, MNTS_REAL))
|
||||||
|
+ do_umount_autofs_direct(ap, me);
|
||||||
|
else
|
||||||
|
debug(ap->logopt,
|
||||||
|
"%s is mounted", me->key);
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -613,7 +613,7 @@ void submount_signal_parent(struct autof
|
||||||
|
void close_mount_fds(struct autofs_point *ap);
|
||||||
|
int umount_autofs(struct autofs_point *ap, const char *root, int force);
|
||||||
|
int umount_autofs_indirect(struct autofs_point *ap, const char *root);
|
||||||
|
-int do_umount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me);
|
||||||
|
+int do_umount_autofs_direct(struct autofs_point *ap, struct mapent *me);
|
||||||
|
int umount_autofs_direct(struct autofs_point *ap);
|
||||||
|
int umount_autofs_offset(struct autofs_point *ap, struct mapent *me);
|
||||||
|
int handle_packet_expire_indirect(struct autofs_point *ap, autofs_packet_expire_indirect_t *pkt);
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -107,7 +107,6 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
int tree_get_mnt_list(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
|
||||||
|
int tree_get_mnt_sublist(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
|
||||||
|
int tree_find_mnt_ents(struct mnt_list *mnts, struct list_head *list, const char *path);
|
||||||
|
-int tree_is_mounted(struct mnt_list *mnts, const char *path, unsigned int type);
|
||||||
|
void set_tsd_user_vars(unsigned int, uid_t, gid_t);
|
||||||
|
const char *mount_type_str(unsigned int);
|
||||||
|
void set_exp_timeout(struct autofs_point *ap, struct map_source *source, time_t timeout);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -1368,46 +1368,6 @@ int tree_find_mnt_ents(struct mnt_list *
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int tree_is_mounted(struct mnt_list *mnts, const char *path, unsigned int type)
|
||||||
|
-{
|
||||||
|
- struct ioctl_ops *ops = get_ioctl_ops();
|
||||||
|
- struct list_head *p;
|
||||||
|
- struct list_head list;
|
||||||
|
- int mounted = 0;
|
||||||
|
-
|
||||||
|
- if (ops->ismountpoint)
|
||||||
|
- return ioctl_is_mounted(path, type);
|
||||||
|
-
|
||||||
|
- INIT_LIST_HEAD(&list);
|
||||||
|
-
|
||||||
|
- if (!tree_find_mnt_ents(mnts, &list, path))
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- list_for_each(p, &list) {
|
||||||
|
- struct mnt_list *mptr;
|
||||||
|
-
|
||||||
|
- mptr = list_entry(p, struct mnt_list, entries);
|
||||||
|
-
|
||||||
|
- if (type) {
|
||||||
|
- if (type & MNTS_REAL) {
|
||||||
|
- if (mptr->flags & MNTS_AUTOFS) {
|
||||||
|
- mounted = 1;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- } else if (type & MNTS_AUTOFS) {
|
||||||
|
- if (mptr->flags & MNTS_AUTOFS) {
|
||||||
|
- mounted = 1;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- } else {
|
||||||
|
- mounted = 1;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- return mounted;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
void set_tsd_user_vars(unsigned int logopt, uid_t uid, gid_t gid)
|
||||||
|
{
|
||||||
|
struct thread_stdenv_vars *tsv;
|
383
SOURCES/autofs-5.1.5-fix-additional-typing-errors.patch
Normal file
383
SOURCES/autofs-5.1.5-fix-additional-typing-errors.patch
Normal file
@ -0,0 +1,383 @@
|
|||||||
|
autofs-5.1.5 - fix additional typing errors
|
||||||
|
|
||||||
|
From: Andreas P <nurgrak@gmail.com>
|
||||||
|
|
||||||
|
Fix some more typing errors.
|
||||||
|
imk: added changes discussed on mailing list.
|
||||||
|
|
||||||
|
Signed-off-by: Andreas P <nurgrak@gmail.com>
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
INSTALL | 2 +-
|
||||||
|
README.replicated-server | 2 +-
|
||||||
|
man/auto.master.5.in | 14 +++++++-------
|
||||||
|
man/autofs.5 | 9 ++++-----
|
||||||
|
man/autofs.conf.5.in | 29 ++++++++++++++---------------
|
||||||
|
man/autofs_ldap_auth.conf.5.in | 2 +-
|
||||||
|
man/automount.8 | 2 +-
|
||||||
|
modules/lookup_ldap.c | 4 ++--
|
||||||
|
modules/replicated.c | 4 ++--
|
||||||
|
redhat/autofs.conf.default.in | 14 +++++++-------
|
||||||
|
redhat/autofs.sysconfig | 2 +-
|
||||||
|
samples/autofs.conf.default.in | 10 +++++-----
|
||||||
|
13 files changed, 47 insertions(+), 48 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -113,6 +113,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- simplify sss source stale check.
|
||||||
|
- use defines for expire type.
|
||||||
|
- remove unused function dump_master().
|
||||||
|
+- fix additional typing errors.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/INSTALL
|
||||||
|
+++ autofs-5.1.4/INSTALL
|
||||||
|
@@ -119,7 +119,7 @@ For example, Fedora Core 4 kernel packag
|
||||||
|
would use the 2.6.12 patch because it applies the 2.6.12 release
|
||||||
|
candidate revision 6 patch. But the autofs patch doesn't apply
|
||||||
|
because the rpm also applies a patch somewhere that changes one
|
||||||
|
-area the the patch also changes but this change is not present
|
||||||
|
+area the patch also changes but this change is not present
|
||||||
|
in the 2.6.12 release kernel.
|
||||||
|
|
||||||
|
On the other hand, Fedora Core 3 kernel 2.6.12-1.1381_FC3
|
||||||
|
--- autofs-5.1.4.orig/README.replicated-server
|
||||||
|
+++ autofs-5.1.4/README.replicated-server
|
||||||
|
@@ -34,7 +34,7 @@ the following selection rules.
|
||||||
|
- PROXIMITY_OTHER, host is on a network not directlty
|
||||||
|
reachable through a local interface.
|
||||||
|
|
||||||
|
-2) NFS version and protocol is selected by caclculating the largest
|
||||||
|
+2) NFS version and protocol is selected by calculating the largest
|
||||||
|
number of hosts supporting an NFS version and protocol that
|
||||||
|
have the closest proximity. These hosts are added to the list
|
||||||
|
in response time order. Hosts may have a corresponding weight
|
||||||
|
--- autofs-5.1.4.orig/man/auto.master.5.in
|
||||||
|
+++ autofs-5.1.4/man/auto.master.5.in
|
||||||
|
@@ -211,12 +211,12 @@ due to application accesses triggered by
|
||||||
|
This option allows mount propagation of bind mounts to be set to
|
||||||
|
either \fIslave\fP or \fIprivate\fP. This option may be needed when using
|
||||||
|
multi-mounts that have bind mounts that bind to a file system that is
|
||||||
|
-propagation shared. This is becuase the bind mount will have the same
|
||||||
|
+propagation shared. This is because the bind mount will have the same
|
||||||
|
properties as its target which causes problems for offset mounts. When
|
||||||
|
this happens an unwanted offset mount is propagated back to the target
|
||||||
|
file system resulting in a deadlock when attempting to access the offset.
|
||||||
|
-This option is a an autofs pseudo mount option that can be used in the
|
||||||
|
-master map only. By default bind mounts will inherit the mount propagation
|
||||||
|
+This option is an autofs pseudo mount option that can be used in the
|
||||||
|
+master map only. By default, bind mounts will inherit the mount propagation
|
||||||
|
of the target file system.
|
||||||
|
.TP
|
||||||
|
.I "\-r, \-\-random-multimount-selection"
|
||||||
|
@@ -261,7 +261,7 @@ accessing /net/myserver will mount expor
|
||||||
|
/net/myserver.
|
||||||
|
.P
|
||||||
|
NOTE: mounts done from a hosts map will be mounted with the "nosuid,nodev,intr" options
|
||||||
|
-unless overridden by explicily specifying the "suid", "dev" or "nointr" options in the
|
||||||
|
+unless overridden by explicitly specifying the "suid", "dev" or "nointr" options in the
|
||||||
|
master map entry.
|
||||||
|
.SH LDAP MAPS
|
||||||
|
If the map type \fBldap\fP is specified the mapname is of the form
|
||||||
|
@@ -277,7 +277,7 @@ configuration, in which case the map nam
|
||||||
|
.P
|
||||||
|
If no schema is set in the autofs configuration then autofs will check
|
||||||
|
each of the commonly used schema for a valid entry and if one is found
|
||||||
|
-it will used for subsequent lookups.
|
||||||
|
+it will be used for subsequent lookups.
|
||||||
|
.P
|
||||||
|
There are three common schemas in use:
|
||||||
|
.TP
|
||||||
|
@@ -351,7 +351,7 @@ connection is to be used then the client
|
||||||
|
locations must also be configured within the LDAP client.
|
||||||
|
.P
|
||||||
|
In OpenLDAP these may be configured in the \fBldap.conf\fP file or in the
|
||||||
|
-per-user configuration. For example it may be sensible to use the system
|
||||||
|
+per-user configuration. For example, it may be sensible to use the system
|
||||||
|
wide configuration for the location of the Certificate Authority certificate
|
||||||
|
and set the location of the client certificate and private key
|
||||||
|
in the per-user configuration. The location of these files and the configuration
|
||||||
|
@@ -399,5 +399,5 @@ configuration will be used to locate the
|
||||||
|
.BR autofs_ldap_auth.conf (5).
|
||||||
|
.SH AUTHOR
|
||||||
|
This manual page was written by Christoph Lameter <chris@waterf.org>,
|
||||||
|
-for the Debian GNU/Linux system. Edited by <hpa@transmeta.com> and
|
||||||
|
+for the Debian GNU/Linux system. Edited by <hpa@transmeta.com> and
|
||||||
|
Ian Kent <raven@themaw.net> .
|
||||||
|
--- autofs-5.1.4.orig/man/autofs.5
|
||||||
|
+++ autofs-5.1.4/man/autofs.5
|
||||||
|
@@ -64,7 +64,6 @@ can't be mounted.
|
||||||
|
.br
|
||||||
|
is used to make the weight the sole factor in selecting a server when multiple
|
||||||
|
servers are present in a map entry.
|
||||||
|
-and
|
||||||
|
.TP
|
||||||
|
.B \-no-use-weight-only
|
||||||
|
.br
|
||||||
|
@@ -192,7 +191,7 @@ SHOST Short hostname (domain part remove
|
||||||
|
.sp
|
||||||
|
If a program map is used these standard environment variables will have
|
||||||
|
a prefix of "AUTOFS_" to prevent interpreted languages like python from
|
||||||
|
-being able to load and execute arbitray code from a user home directory.
|
||||||
|
+being able to load and execute arbitrary code from a user home directory.
|
||||||
|
.RE
|
||||||
|
.sp
|
||||||
|
Additional entries can be defined with the \-Dvariable=Value map-option to
|
||||||
|
@@ -293,10 +292,10 @@ may be negated with the \fB!\fP.
|
||||||
|
For a \fBlocation\fP to be selected for a mount attempt all of its \fBselectors\fP
|
||||||
|
must evaluate to true. If a \fBlocation\fP is selected for a mount attempt
|
||||||
|
and succeeds the lookup is completed and returns success. If the mount
|
||||||
|
-attempt fails the proceedure continues with the next \fBlocation\fP until
|
||||||
|
+attempt fails the procedure continues with the next \fBlocation\fP until
|
||||||
|
they have all been tried.
|
||||||
|
|
||||||
|
-In addition some \fBselectors\fP take no argumenets, some one argument
|
||||||
|
+In addition, some \fBselectors\fP take no arguments, some one argument
|
||||||
|
and others optionally take two arguments.
|
||||||
|
|
||||||
|
The \fBselectors\fP that take no arguments are:
|
||||||
|
@@ -584,7 +583,7 @@ In the first line we have an NFS remote
|
||||||
|
another nfs mount for the exported directory /work/util from host zeus.
|
||||||
|
This would be mounted on /test/util.
|
||||||
|
|
||||||
|
-Finally we have an example of the use of the \fBsublink\fP option. In
|
||||||
|
+Finally, we have an example of the use of the \fBsublink\fP option. In
|
||||||
|
this case the filesystem bilbo:/shared would be mounted on a path
|
||||||
|
external the automount directory (under the direcory given by
|
||||||
|
configuration option auto_dir) and the path /test/local either
|
||||||
|
--- autofs-5.1.4.orig/man/autofs.conf.5.in
|
||||||
|
+++ autofs-5.1.4/man/autofs.conf.5.in
|
||||||
|
@@ -91,7 +91,7 @@ set default log level "none", "verbose"
|
||||||
|
.B force_standard_program_map_env
|
||||||
|
.br
|
||||||
|
override the use of a prefix with standard environment variables when a
|
||||||
|
-program map is executed. Since program maps are run as the privileded
|
||||||
|
+program map is executed. Since program maps are run as the privileged
|
||||||
|
user setting these standard environment variables opens automount(8) to
|
||||||
|
potential user privilege escalation when the program map is written in a
|
||||||
|
language that can load components from, for example, a user home directory
|
||||||
|
@@ -110,16 +110,15 @@ and a direct map with 8000 entries would
|
||||||
|
containing an average of 8 entries, which should be acceptable.
|
||||||
|
|
||||||
|
However, if excessive CPU usage is observed during automount lookups
|
||||||
|
-increasing this option can reduce the CPU overhead considerably becuase
|
||||||
|
+increasing this option can reduce the CPU overhead considerably because
|
||||||
|
it reduces the length of the search chains.
|
||||||
|
|
||||||
|
Note that the number of entries in a map doesn't necessarily relate
|
||||||
|
to the number of entries used in the map entry cache.
|
||||||
|
|
||||||
|
-There are three distinct cases, direct maps and indirect maps that
|
||||||
|
-use the "browse" option must be read in their entirity at program
|
||||||
|
-start so, in these two cases the map size does retate directly to
|
||||||
|
-the map entry cache size.
|
||||||
|
+There are two distinct cases where the map hash table can make a
|
||||||
|
+significant difference, direct maps and indirect maps that use the
|
||||||
|
+"browse" option.
|
||||||
|
|
||||||
|
For indirect maps that do not use the "browse" option entries are
|
||||||
|
added to the map entry cache at lookup so the number of active cache
|
||||||
|
@@ -174,7 +173,7 @@ by the number of retries that would be u
|
||||||
|
.B use_mount_request_log_id
|
||||||
|
.br
|
||||||
|
Set whether to use a mount request log id so that log entries for specific
|
||||||
|
-mount requests can be easily identified in logs that have multiple conncurrent
|
||||||
|
+mount requests can be easily identified in logs that have multiple concurrent
|
||||||
|
requests. Default is don't use mount request log ids.
|
||||||
|
.SS LDAP Configuration
|
||||||
|
.P
|
||||||
|
@@ -183,7 +182,7 @@ Configuration settings available are:
|
||||||
|
.B ldap_timeout
|
||||||
|
.br
|
||||||
|
Set the network response timeout (default 8).
|
||||||
|
-Set timeout value for the synchronous API calls. The default is the LDAP
|
||||||
|
+Set timeout value for the synchronous API calls. The default is the LDAP
|
||||||
|
library default of an infinite timeout.
|
||||||
|
.TP
|
||||||
|
.B ldap_network_timeout
|
||||||
|
@@ -323,7 +322,7 @@ cleaned on re-load, which is done when m
|
||||||
|
so these configuration entries are not used by autofs. An
|
||||||
|
exception to this is the case where the map is large. In this
|
||||||
|
case it may be necessary to read the whole map at startup even if
|
||||||
|
-browsing is is not enabled. Adding the cache:=all option to
|
||||||
|
+browsing is not enabled. Adding the cache:=all option to
|
||||||
|
map_options can be used to for this.
|
||||||
|
.TP
|
||||||
|
.B localhost_address
|
||||||
|
@@ -390,14 +389,14 @@ and that will be done.
|
||||||
|
Allow map keys to be shown in directory listings. This option
|
||||||
|
can have values of "yes" or "no". The default is "no". A variation
|
||||||
|
of this option, "browsable", can be used as a pseudo mount option
|
||||||
|
-in type "auto" map entries to provide provide browsing funtionality
|
||||||
|
+in type "auto" map entries to provide browsing functionality
|
||||||
|
in sub-mounts. The amd "browsable_dirs = full" option cannot be
|
||||||
|
implemented within the current autofs framework and is not supported.
|
||||||
|
.TP
|
||||||
|
.B exec_map_timeout
|
||||||
|
.br
|
||||||
|
-A timeout is not currently used for for program maps, might be
|
||||||
|
-implemented.
|
||||||
|
+A timeout is not currently used for program maps but this might be
|
||||||
|
+implemented in the future.
|
||||||
|
.TP
|
||||||
|
.B tag
|
||||||
|
.br
|
||||||
|
@@ -473,7 +472,7 @@ its official host name.
|
||||||
|
.TP
|
||||||
|
.B domain_strip
|
||||||
|
.br
|
||||||
|
-If set to "yes" the domain name part of the host is strippped
|
||||||
|
+If set to "yes" the domain name part of the host is stripped
|
||||||
|
when normalizing hostnames. This can be useful when using of
|
||||||
|
the same maps in a multiple domain environment.
|
||||||
|
.TP
|
||||||
|
@@ -497,8 +496,8 @@ that is used for queries if ldap is to b
|
||||||
|
.B ldap_hostports
|
||||||
|
.br
|
||||||
|
This option has no default value set. It must be set to the URI
|
||||||
|
-of the LDAP server to be used for lookups wheni ldap is used a
|
||||||
|
-map source. It may contain a comma or space separated list of
|
||||||
|
+of the LDAP server to be used for lookups when ldap is used as
|
||||||
|
+a map source. It may contain a comma or space separated list of
|
||||||
|
LDAP URIs.
|
||||||
|
.TP
|
||||||
|
.B hesiod_base
|
||||||
|
--- autofs-5.1.4.orig/man/autofs_ldap_auth.conf.5.in
|
||||||
|
+++ autofs-5.1.4/man/autofs_ldap_auth.conf.5.in
|
||||||
|
@@ -56,7 +56,7 @@ required in order to perform ldap querie
|
||||||
|
sasl authenticated connections will be allowed. If it is set to no then
|
||||||
|
authentication is not needed for ldap server connections. If it is set to
|
||||||
|
autodetect then the ldap server will be queried to establish a suitable sasl
|
||||||
|
-authentication mechanism. If no suitable mechanism can be found, connections
|
||||||
|
+authentication mechanism. If no suitable mechanism can be found, connections
|
||||||
|
to the ldap server are made without authentication. Finally, if it is set to
|
||||||
|
simple, then simple authentication will be used instead of SASL.
|
||||||
|
.TP
|
||||||
|
--- autofs-5.1.4.orig/man/automount.8
|
||||||
|
+++ autofs-5.1.4/man/automount.8
|
||||||
|
@@ -89,7 +89,7 @@ that would be used by autofs for the who
|
||||||
|
.TP
|
||||||
|
.I "\-O, \-\-global-options"
|
||||||
|
Allows the specification of global mount options used for all master
|
||||||
|
-map entries. These options will either replace or be appened to options
|
||||||
|
+map entries. These options will either replace or be appended to options
|
||||||
|
given in a master map entry depending on the APPEND_OPTIONS configuration
|
||||||
|
setting.
|
||||||
|
.TP
|
||||||
|
--- autofs-5.1.4.orig/modules/lookup_ldap.c
|
||||||
|
+++ autofs-5.1.4/modules/lookup_ldap.c
|
||||||
|
@@ -1320,11 +1320,11 @@ auth_fail:
|
||||||
|
ret |= get_property(logopt, root, "external_key", &extern_key);
|
||||||
|
/*
|
||||||
|
* For EXTERNAL auth to function we need a client certificate
|
||||||
|
- * and and certificate key. The ca certificate used to verify
|
||||||
|
+ * and certificate key. The ca certificate used to verify
|
||||||
|
* the server certificate must also be set correctly in the
|
||||||
|
* global configuration as the connection must be encrypted
|
||||||
|
* and the server and client certificates must have been
|
||||||
|
- * verified for the EXTERNAL method to be offerred by the
|
||||||
|
+ * verified for the EXTERNAL method to be offered by the
|
||||||
|
* server. If the cert and key have not been set in the autofs
|
||||||
|
* configuration they must be set in the ldap rc file.
|
||||||
|
*/
|
||||||
|
--- autofs-5.1.4.orig/modules/replicated.c
|
||||||
|
+++ autofs-5.1.4/modules/replicated.c
|
||||||
|
@@ -24,11 +24,11 @@
|
||||||
|
* - PROXIMITY_OTHER, host is on a network not directlty
|
||||||
|
* reachable through a local interface.
|
||||||
|
*
|
||||||
|
- * 2) NFS version and protocol is selected by caclculating the largest
|
||||||
|
+ * 2) NFS version and protocol is selected by calculating the largest
|
||||||
|
* number of hosts supporting an NFS version and protocol that
|
||||||
|
* have the closest proximity. These hosts are added to the list
|
||||||
|
* in response time order. Hosts may have a corresponding weight
|
||||||
|
- * which essentially increaes response time and so influences the
|
||||||
|
+ * which essentially increases response time and so influences the
|
||||||
|
* host order.
|
||||||
|
*
|
||||||
|
* 3) Hosts at further proximity that support the selected NFS version
|
||||||
|
--- autofs-5.1.4.orig/redhat/autofs.conf.default.in
|
||||||
|
+++ autofs-5.1.4/redhat/autofs.conf.default.in
|
||||||
|
@@ -79,7 +79,7 @@ mount_nfs_default_protocol = 4
|
||||||
|
# are run as the privileded user this opens
|
||||||
|
# automount(8) to potential user privilege
|
||||||
|
# escalation when the program map is written
|
||||||
|
-# in a language that can load components from,
|
||||||
|
+# in a language that can load components from,
|
||||||
|
# for example, a user home directory.
|
||||||
|
#
|
||||||
|
# force_standard_program_map_env = no
|
||||||
|
@@ -87,7 +87,7 @@ mount_nfs_default_protocol = 4
|
||||||
|
# use_mount_request_log_id - Set whether to use a mount request log
|
||||||
|
# id so that log entries for specific mount
|
||||||
|
# requests can be easily identified in logs
|
||||||
|
-# that have multiple conncurrent requests.
|
||||||
|
+# that have multiple concurrent requests.
|
||||||
|
#
|
||||||
|
#use_mount_request_log_id = no
|
||||||
|
#
|
||||||
|
@@ -419,10 +419,10 @@ dismount_interval = 300
|
||||||
|
# appears to work reasonably well most of the time without the
|
||||||
|
# update).
|
||||||
|
#
|
||||||
|
-# autofs_use_lofs = yes
|
||||||
|
+#autofs_use_lofs = yes
|
||||||
|
#
|
||||||
|
# Several configuration options can be set per mount point.
|
||||||
|
-# In particulr map_type, map_name, map_defaults, search_path,
|
||||||
|
+# In particular map_type, map_name, map_defaults, search_path,
|
||||||
|
# browsable_dirs, dismount_interval and selectors_in_defaults
|
||||||
|
# (not all of which are currently implemented, see above).
|
||||||
|
#
|
||||||
|
@@ -431,6 +431,6 @@ dismount_interval = 300
|
||||||
|
# master map entry and the format will be inherited for type
|
||||||
|
# "auto" mounts.
|
||||||
|
#
|
||||||
|
-# [ /expamle/mount ]
|
||||||
|
-# dismount_interval = 60
|
||||||
|
-# map_type = nis
|
||||||
|
+#[ /example/mount ]
|
||||||
|
+#dismount_interval = 60
|
||||||
|
+#map_type = nis
|
||||||
|
--- autofs-5.1.4.orig/redhat/autofs.sysconfig
|
||||||
|
+++ autofs-5.1.4/redhat/autofs.sysconfig
|
||||||
|
@@ -1,5 +1,5 @@
|
||||||
|
#
|
||||||
|
-# Init syatem options
|
||||||
|
+# Init system options
|
||||||
|
#
|
||||||
|
# If the kernel supports using the autofs miscellanous device
|
||||||
|
# and you wish to use it you must set this configuration option
|
||||||
|
--- autofs-5.1.4.orig/samples/autofs.conf.default.in
|
||||||
|
+++ autofs-5.1.4/samples/autofs.conf.default.in
|
||||||
|
@@ -78,7 +78,7 @@ browse_mode = no
|
||||||
|
# are run as the privileded user this opens
|
||||||
|
# automount(8) to potential user privilege
|
||||||
|
# escalation when the program map is written
|
||||||
|
-# in a language that can load components from,
|
||||||
|
+# in a language that can load components from,
|
||||||
|
# for example, a user home directory.
|
||||||
|
#
|
||||||
|
# force_standard_program_map_env = no
|
||||||
|
@@ -86,7 +86,7 @@ browse_mode = no
|
||||||
|
# use_mount_request_log_id - Set whether to use a mount request log
|
||||||
|
# id so that log entries for specific mount
|
||||||
|
# requests can be easily identified in logs
|
||||||
|
-# that have multiple conncurrent requests.
|
||||||
|
+# that have multiple concurrent requests.
|
||||||
|
#
|
||||||
|
#use_mount_request_log_id = no
|
||||||
|
#
|
||||||
|
@@ -430,6 +430,6 @@ dismount_interval = 300
|
||||||
|
# master map entry and the format will be inherited for type
|
||||||
|
# "auto" mounts.
|
||||||
|
#
|
||||||
|
-# [ /expamle/mount ]
|
||||||
|
-# dismount_interval = 60
|
||||||
|
-# map_type = nis
|
||||||
|
+#[ /example/mount ]
|
||||||
|
+#dismount_interval = 60
|
||||||
|
+#map_type = nis
|
33
SOURCES/autofs-5.1.5-fix-amd-entry-memory-leak.patch
Normal file
33
SOURCES/autofs-5.1.5-fix-amd-entry-memory-leak.patch
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
autofs-5.1.5 - fix amd entry memory leak
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Fix an incorrect free of an amd_entry structure.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/master.c | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -58,6 +58,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- remove unused function has_fstab_option().
|
||||||
|
- remove unused function reverse_mnt_list().
|
||||||
|
- remove a couple of old debug messages.
|
||||||
|
+- fix amd entry memory leak.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/master.c
|
||||||
|
+++ autofs-5.1.4/lib/master.c
|
||||||
|
@@ -155,7 +155,7 @@ void master_free_autofs_point(struct aut
|
||||||
|
ext_mount_remove(&entry->ext_mount, entry->fs);
|
||||||
|
if (!list_empty(&entry->entries))
|
||||||
|
list_del(&entry->entries);
|
||||||
|
- free(entry);
|
||||||
|
+ free_amd_entry(entry);
|
||||||
|
}
|
||||||
|
mounts_mutex_unlock(ap);
|
||||||
|
|
@ -0,0 +1,49 @@
|
|||||||
|
autofs-5.1.5 - fix hesiod string check in master_parse()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
When map source is specified in a master map entry, checking if
|
||||||
|
map type is hesiod in master_parse() will generate a SEGV if a
|
||||||
|
parser type is not also present becuase tmp will be NULL in this
|
||||||
|
case.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/master_parse.y | 8 ++++----
|
||||||
|
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -37,6 +37,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix incorrect locking in sss lookup.
|
||||||
|
- fix amd parser opts option handling.
|
||||||
|
- better handle hesiod support not built in.
|
||||||
|
+- fix hesiod string check in master_parse().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/master_parse.y
|
||||||
|
+++ autofs-5.1.4/lib/master_parse.y
|
||||||
|
@@ -172,8 +172,8 @@ line:
|
||||||
|
if ((tmp = strchr($2, ',')))
|
||||||
|
*tmp++ = '\0';
|
||||||
|
#ifndef WITH_HESIOD
|
||||||
|
- /* Map type or or map type parser is hesiod */
|
||||||
|
- if (!strcmp($2, "hesiod") || !strcmp(tmp, "hesiod")) {
|
||||||
|
+ /* Map type or map type parser is hesiod */
|
||||||
|
+ if (!strcmp($2, "hesiod") || (tmp && !strcmp(tmp, "hesiod"))) {
|
||||||
|
master_error("hesiod support not built in");
|
||||||
|
local_free_vars();
|
||||||
|
YYABORT;
|
||||||
|
@@ -360,8 +360,8 @@ map: PATH
|
||||||
|
if ((tmp = strchr($1, ',')))
|
||||||
|
*tmp++ = '\0';
|
||||||
|
#ifndef WITH_HESIOD
|
||||||
|
- /* Map type or or map type parser is hesiod */
|
||||||
|
- if (!strcmp($1, "hesiod") || !strcmp(tmp, "hesiod")) {
|
||||||
|
+ /* Map type or map type parser is hesiod */
|
||||||
|
+ if (!strcmp($1, "hesiod") || (tmp && !strcmp(tmp, "hesiod"))) {
|
||||||
|
master_error("hesiod support not built in");
|
||||||
|
local_free_vars();
|
||||||
|
YYABORT;
|
@ -0,0 +1,419 @@
|
|||||||
|
autofs-5.1.5 - fix macro expansion in selector values
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Macro expansion is not done in selector values before use, for example
|
||||||
|
in "hostd==${/key}.<donain>.<name>" the ${/key} is not expanded before
|
||||||
|
use leading to an attempt to use an invalid host name.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
modules/parse_amd.c | 286 ++++++++++++++++++++++++++++++++++------------------
|
||||||
|
2 files changed, 193 insertions(+), 94 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -52,6 +52,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- log mount call arguments if mount_verbose is set.
|
||||||
|
- make expire remaining log level debug.
|
||||||
|
- allow period following macro in selector value.
|
||||||
|
+- fix macro expansion in selector values.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/modules/parse_amd.c
|
||||||
|
+++ autofs-5.1.4/modules/parse_amd.c
|
||||||
|
@@ -231,17 +231,29 @@ static struct substvar *add_lookup_vars(
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int match_my_name(unsigned int logopt, const char *name, struct substvar *sv)
|
||||||
|
+static int match_my_name(struct autofs_point *ap, const char *name, struct substvar *sv)
|
||||||
|
{
|
||||||
|
struct addrinfo hints, *cni, *ni, *haddr;
|
||||||
|
char host[NI_MAXHOST + 1], numeric[NI_MAXHOST + 1];
|
||||||
|
+ unsigned int logopt = ap->logopt;
|
||||||
|
const struct substvar *v;
|
||||||
|
+ char *exp_name = NULL;
|
||||||
|
int rv = 0, ret;
|
||||||
|
|
||||||
|
+ if (!expand_selectors(ap, name, &exp_name, sv))
|
||||||
|
+ exp_name = strdup(name);
|
||||||
|
+ if (!exp_name) {
|
||||||
|
+ error(logopt,
|
||||||
|
+ MODPREFIX "error: failed to alloc space for name");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
v = macro_findvar(sv, "host", 4);
|
||||||
|
if (v) {
|
||||||
|
- if (!strcmp(v->val, name))
|
||||||
|
- return 1;
|
||||||
|
+ if (!strcmp(v->val, exp_name)) {
|
||||||
|
+ rv = 1;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!v || !v->val) {
|
||||||
|
@@ -268,11 +280,11 @@ static int match_my_name(unsigned int lo
|
||||||
|
hints.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME;
|
||||||
|
|
||||||
|
/* Resolve comparison name to its names and compare */
|
||||||
|
- ret = getaddrinfo(name, NULL, &hints, &ni);
|
||||||
|
+ ret = getaddrinfo(exp_name, NULL, &hints, &ni);
|
||||||
|
if (ret) {
|
||||||
|
error(logopt, MODPREFIX
|
||||||
|
"hostname lookup for %s failed: %s\n",
|
||||||
|
- name, gai_strerror(ret));
|
||||||
|
+ exp_name, gai_strerror(ret));
|
||||||
|
freeaddrinfo(cni);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
@@ -310,18 +322,180 @@ next:
|
||||||
|
freeaddrinfo(ni);
|
||||||
|
freeaddrinfo(cni);
|
||||||
|
out:
|
||||||
|
+ if (exp_name)
|
||||||
|
+ free(exp_name);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int eval_selector(unsigned int logopt,
|
||||||
|
+static int sel_strcmp(struct autofs_point *ap,
|
||||||
|
+ const struct substvar *v, struct selector *s,
|
||||||
|
+ struct substvar *sv)
|
||||||
|
+{
|
||||||
|
+ char *expand = NULL;
|
||||||
|
+ int ret = 0;
|
||||||
|
+ int res;
|
||||||
|
+
|
||||||
|
+ res = expand_selectors(ap, s->comp.value, &expand, sv);
|
||||||
|
+ if (res)
|
||||||
|
+ res = strcmp(v->val, expand);
|
||||||
|
+ else
|
||||||
|
+ res = strcmp(v->val, s->comp.value);
|
||||||
|
+
|
||||||
|
+ if (s->compare & SEL_COMP_EQUAL && !res) {
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "matched selector %s(%s) == %s",
|
||||||
|
+ v->def, v->val, expand ? expand : s->comp.value);
|
||||||
|
+ ret = 1;
|
||||||
|
+ } else if (s->compare & SEL_COMP_NOTEQUAL && res) {
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "matched selector %s(%s) != %s",
|
||||||
|
+ v->def, v->val, expand ? expand : s->comp.value);
|
||||||
|
+ ret = 1;
|
||||||
|
+ } else
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "did not match selector %s(%s) %s %s",
|
||||||
|
+ v->def, v->val,
|
||||||
|
+ (s->compare & SEL_COMP_EQUAL ? "==" : "!="),
|
||||||
|
+ expand ? expand : s->comp.value);
|
||||||
|
+
|
||||||
|
+ if (expand)
|
||||||
|
+ free(expand);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int sel_lstat(struct autofs_point *ap,
|
||||||
|
+ struct selector *s, struct substvar *sv)
|
||||||
|
+{
|
||||||
|
+ struct stat st;
|
||||||
|
+ char *expand = NULL;
|
||||||
|
+ int res, ret;
|
||||||
|
+
|
||||||
|
+ /* Sould be OK to fail on any error here */
|
||||||
|
+ res = expand_selectors(ap, s->func.arg1, &expand, sv);
|
||||||
|
+ if (res)
|
||||||
|
+ ret = !lstat(expand, &st);
|
||||||
|
+ else
|
||||||
|
+ ret = !lstat(s->func.arg1, &st);
|
||||||
|
+
|
||||||
|
+ if (s->compare == SEL_COMP_NOT)
|
||||||
|
+ ret = !ret;
|
||||||
|
+ if (ret)
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "matched selector %s(%s)",
|
||||||
|
+ s->sel->name, expand ? expand : s->func.arg1);
|
||||||
|
+ else
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "did not match selector %s(%s)",
|
||||||
|
+ s->sel->name, expand ? expand : s->func.arg1);
|
||||||
|
+ if (expand)
|
||||||
|
+ free(expand);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int sel_in_network(struct autofs_point *ap,
|
||||||
|
+ struct selector *s, struct substvar *sv)
|
||||||
|
+{
|
||||||
|
+ char *expand = NULL;
|
||||||
|
+ int res, ret;
|
||||||
|
+
|
||||||
|
+ res = expand_selectors(ap, s->func.arg1, &expand, sv);
|
||||||
|
+ if (!res)
|
||||||
|
+ ret = in_network(s->func.arg1);
|
||||||
|
+ else
|
||||||
|
+ ret = in_network(expand);
|
||||||
|
+
|
||||||
|
+ if (s->compare == SEL_COMP_NOT)
|
||||||
|
+ ret = !ret;
|
||||||
|
+ if (ret)
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "matched selector %s(%s)",
|
||||||
|
+ s->sel->name, expand ? expand : s->func.arg1);
|
||||||
|
+ else
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "did not match selector %s(%s)",
|
||||||
|
+ s->sel->name, expand ? expand : s->func.arg1);
|
||||||
|
+
|
||||||
|
+ if (expand)
|
||||||
|
+ free(expand);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int sel_netgrp(struct autofs_point *ap,
|
||||||
|
+ struct selector *s, struct substvar *sv)
|
||||||
|
+{
|
||||||
|
+ char *exp_arg1 = NULL, *exp_arg2 = NULL;
|
||||||
|
+ const struct substvar *v;
|
||||||
|
+ int res, ret = 0;
|
||||||
|
+ char *host;
|
||||||
|
+
|
||||||
|
+ if (s->func.arg2) {
|
||||||
|
+ res = expand_selectors(ap, s->func.arg2, &exp_arg2, sv);
|
||||||
|
+ if (res)
|
||||||
|
+ host = exp_arg2;
|
||||||
|
+ else
|
||||||
|
+ host = s->func.arg2;
|
||||||
|
+ } else {
|
||||||
|
+ if (s->sel->selector == SEL_NETGRP)
|
||||||
|
+ v = macro_findvar(sv, "host", 4);
|
||||||
|
+ else
|
||||||
|
+ v = macro_findvar(sv, "hostd", 5);
|
||||||
|
+ if (!v || !*v->val) {
|
||||||
|
+ error(ap->logopt, MODPREFIX
|
||||||
|
+ "failed to get value of ${host}");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ host = v->val;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ res = expand_selectors(ap, s->func.arg1, &exp_arg1, sv);
|
||||||
|
+ if (res)
|
||||||
|
+ ret = innetgr(exp_arg1, host, NULL, NULL);
|
||||||
|
+ else
|
||||||
|
+ ret = innetgr(s->func.arg1, host, NULL, NULL);
|
||||||
|
+
|
||||||
|
+ if (s->compare == SEL_COMP_NOT)
|
||||||
|
+ ret = !ret;
|
||||||
|
+ if (ret) {
|
||||||
|
+ if (!s->func.arg2)
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "matched selector %s(%s)",
|
||||||
|
+ s->sel->name, exp_arg1 ? exp_arg1 : s->func.arg1);
|
||||||
|
+ else
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "matched selector %s(%s,%s)", s->sel->name,
|
||||||
|
+ exp_arg1 ? exp_arg1 : s->func.arg1,
|
||||||
|
+ exp_arg2 ? exp_arg2 : s->func.arg2);
|
||||||
|
+ } else {
|
||||||
|
+ if (!s->func.arg2)
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "did not match selector %s(%s)",
|
||||||
|
+ s->sel->name, exp_arg1 ? exp_arg1 : s->func.arg1);
|
||||||
|
+ else
|
||||||
|
+ debug(ap->logopt, MODPREFIX
|
||||||
|
+ "did not match selector %s(%s,%s)", s->sel->name,
|
||||||
|
+ exp_arg1 ? exp_arg1 : s->func.arg1,
|
||||||
|
+ exp_arg2 ? exp_arg2 : s->func.arg2);
|
||||||
|
+ }
|
||||||
|
+out:
|
||||||
|
+ if (exp_arg1)
|
||||||
|
+ free(exp_arg1);
|
||||||
|
+ if (exp_arg2)
|
||||||
|
+ free(exp_arg2);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int eval_selector(struct autofs_point *ap,
|
||||||
|
struct amd_entry *this, struct substvar *sv)
|
||||||
|
{
|
||||||
|
struct selector *s = this->selector;
|
||||||
|
+ unsigned int logopt = ap->logopt;
|
||||||
|
const struct substvar *v;
|
||||||
|
unsigned int s_type;
|
||||||
|
unsigned int v_type;
|
||||||
|
- struct stat st;
|
||||||
|
- char *host;
|
||||||
|
int res, val, ret = 0;
|
||||||
|
|
||||||
|
s_type = s->sel->flags & SEL_FLAGS_TYPE_MASK;
|
||||||
|
@@ -339,26 +513,7 @@ static int eval_selector(unsigned int lo
|
||||||
|
|
||||||
|
switch (v_type) {
|
||||||
|
case SEL_FLAG_STR:
|
||||||
|
- res = strcmp(v->val, s->comp.value);
|
||||||
|
- if (s->compare & SEL_COMP_EQUAL && !res) {
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "matched selector %s(%s) == %s",
|
||||||
|
- v->def, v->val, s->comp.value);
|
||||||
|
- ret = 1;
|
||||||
|
- break;
|
||||||
|
- } else if (s->compare & SEL_COMP_NOTEQUAL && res) {
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "matched selector %s(%s) != %s",
|
||||||
|
- v->def, v->val, s->comp.value);
|
||||||
|
- ret = 1;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "did not match selector %s(%s) %s %s",
|
||||||
|
- v->def, v->val,
|
||||||
|
- (s->compare & SEL_COMP_EQUAL ? "==" : "!="),
|
||||||
|
- s->comp.value);
|
||||||
|
+ ret = sel_strcmp(ap, v, s, sv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SEL_FLAG_NUM:
|
||||||
|
@@ -434,7 +589,7 @@ static int eval_selector(unsigned int lo
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SEL_XHOST:
|
||||||
|
- ret = match_my_name(logopt, s->func.arg1, sv);
|
||||||
|
+ ret = match_my_name(ap, s->func.arg1, sv);
|
||||||
|
if (s->compare == SEL_COMP_NOT)
|
||||||
|
ret = !ret;
|
||||||
|
if (ret)
|
||||||
|
@@ -448,32 +603,11 @@ static int eval_selector(unsigned int lo
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SEL_EXISTS:
|
||||||
|
- /* Sould be OK to fail on any error here */
|
||||||
|
- ret = !lstat(s->func.arg1, &st);
|
||||||
|
- if (s->compare == SEL_COMP_NOT)
|
||||||
|
- ret = !ret;
|
||||||
|
- if (ret)
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "matched selector %s(%s)",
|
||||||
|
- s->sel->name, s->func.arg1);
|
||||||
|
- else
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "did not match selector %s(%s)",
|
||||||
|
- s->sel->name, s->func.arg1);
|
||||||
|
+ ret = sel_lstat(ap, s, sv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SEL_IN_NETWORK:
|
||||||
|
- ret = in_network(s->func.arg1);
|
||||||
|
- if (s->compare == SEL_COMP_NOT)
|
||||||
|
- ret = !ret;
|
||||||
|
- if (ret)
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "matched selector %s(%s)",
|
||||||
|
- s->sel->name, s->func.arg1);
|
||||||
|
- else
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "did not match selector %s(%s)",
|
||||||
|
- s->sel->name, s->func.arg1);
|
||||||
|
+ ret = sel_in_network(ap, s, sv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
@@ -492,43 +626,7 @@ static int eval_selector(unsigned int lo
|
||||||
|
switch (s->sel->selector) {
|
||||||
|
case SEL_NETGRP:
|
||||||
|
case SEL_NETGRPD:
|
||||||
|
- if (s->func.arg2)
|
||||||
|
- host = s->func.arg2;
|
||||||
|
- else {
|
||||||
|
- if (s->sel->selector == SEL_NETGRP)
|
||||||
|
- v = macro_findvar(sv, "host", 4);
|
||||||
|
- else
|
||||||
|
- v = macro_findvar(sv, "hostd", 5);
|
||||||
|
- if (!v || !*v->val) {
|
||||||
|
- error(logopt, MODPREFIX
|
||||||
|
- "failed to get value of ${host}");
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- host = v->val;
|
||||||
|
- }
|
||||||
|
- ret = innetgr(s->func.arg1, host, NULL, NULL);
|
||||||
|
- if (s->compare == SEL_COMP_NOT)
|
||||||
|
- ret = !ret;
|
||||||
|
- if (ret) {
|
||||||
|
- if (!s->func.arg2)
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "matched selector %s(%s)",
|
||||||
|
- s->sel->name, s->func.arg1);
|
||||||
|
- else
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "matched selector %s(%s,%s)",
|
||||||
|
- s->sel->name, s->func.arg1,
|
||||||
|
- s->func.arg2);
|
||||||
|
- } else {
|
||||||
|
- if (!s->func.arg2)
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "did not match selector %s(%s)",
|
||||||
|
- s->sel->name, s->func.arg1);
|
||||||
|
- else
|
||||||
|
- debug(logopt, MODPREFIX
|
||||||
|
- "did not match selector %s(%s,%s)",
|
||||||
|
- s->sel->name, s->func.arg1, s->func.arg2);
|
||||||
|
- }
|
||||||
|
+ ret = sel_netgrp(ap, s, sv);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
@@ -1753,7 +1851,7 @@ static void update_prefix(struct autofs_
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int match_selectors(unsigned int logopt,
|
||||||
|
+static int match_selectors(struct autofs_point *ap,
|
||||||
|
struct amd_entry *entry, struct substvar *sv)
|
||||||
|
{
|
||||||
|
struct selector *s = entry->selector;
|
||||||
|
@@ -1761,7 +1859,7 @@ static int match_selectors(unsigned int
|
||||||
|
|
||||||
|
/* No selectors, always match */
|
||||||
|
if (!s) {
|
||||||
|
- debug(logopt, MODPREFIX "no selectors found in location");
|
||||||
|
+ debug(ap->logopt, MODPREFIX "no selectors found in location");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1769,7 +1867,7 @@ static int match_selectors(unsigned int
|
||||||
|
|
||||||
|
/* All selectors must match */
|
||||||
|
while (s) {
|
||||||
|
- ret = eval_selector(logopt, entry, sv);
|
||||||
|
+ ret = eval_selector(ap, entry, sv);
|
||||||
|
if (!ret)
|
||||||
|
break;
|
||||||
|
s = s->next;
|
||||||
|
@@ -1939,7 +2037,7 @@ static struct amd_entry *select_default_
|
||||||
|
if (!this->selector)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- if (match_selectors(ap->logopt, this, sv)) {
|
||||||
|
+ if (match_selectors(ap, this, sv)) {
|
||||||
|
if (entry_default) {
|
||||||
|
/*update_with_defaults(entry_default, this, sv);*/
|
||||||
|
free_amd_entry(entry_default);
|
||||||
|
@@ -2192,7 +2290,7 @@ int parse_mount(struct autofs_point *ap,
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!match_selectors(ap->logopt, this, sv))
|
||||||
|
+ if (!match_selectors(ap, this, sv))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
at_least_one = 1;
|
@ -0,0 +1,34 @@
|
|||||||
|
autofs-5.1.5 - fix missing initialization of autofs_point flags
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
When adding the "use_ignore_mount_option" configuration option I added
|
||||||
|
a "use without initialization" for ap->flags.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/master.c | 2 ++
|
||||||
|
2 files changed, 3 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -75,6 +75,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use local_getmntent_r() for unlink_mount_tree().
|
||||||
|
- use local getmntent_r() in get_mnt_list().
|
||||||
|
- use local getmntent_r() in tree_make_mnt_list().
|
||||||
|
+- fix missing initialization of autofs_point flags.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/master.c
|
||||||
|
+++ autofs-5.1.4/lib/master.c
|
||||||
|
@@ -101,6 +101,8 @@ int master_add_autofs_point(struct maste
|
||||||
|
ap->negative_timeout = global_negative_timeout;
|
||||||
|
ap->exp_timeout = defaults_get_timeout();
|
||||||
|
ap->exp_runfreq = 0;
|
||||||
|
+ ap->flags = 0;
|
||||||
|
+
|
||||||
|
if (defaults_get_use_ignore_mount_option())
|
||||||
|
ap->flags = MOUNT_FLAG_IGNORE;
|
||||||
|
if (ghost)
|
@ -0,0 +1,136 @@
|
|||||||
|
autofs-5.1.5 - fix unlink_mount_tree() not umounting mounts
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
At some point a check matching process group id of mounts was added to
|
||||||
|
the unlink_mount_tree() function so that mounts not matching the group
|
||||||
|
id of the calling process would be skipped.
|
||||||
|
|
||||||
|
But unlink_mount_tree() is meant to force a cleanup of mounts from a
|
||||||
|
previous automount process so the process group of the current process
|
||||||
|
can never match so all mounts are skipped.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 7 -------
|
||||||
|
daemon/indirect.c | 9 ---------
|
||||||
|
include/mounts.h | 1 -
|
||||||
|
lib/mounts.c | 20 --------------------
|
||||||
|
5 files changed, 1 insertion(+), 37 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -59,6 +59,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- remove unused function reverse_mnt_list().
|
||||||
|
- remove a couple of old debug messages.
|
||||||
|
- fix amd entry memory leak.
|
||||||
|
+- fix unlink_mount_tree() not umounting mounts.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -264,10 +264,6 @@ static int unlink_mount_tree(struct auto
|
||||||
|
{
|
||||||
|
struct list_head *p;
|
||||||
|
int rv, ret;
|
||||||
|
- pid_t pgrp = getpgrp();
|
||||||
|
- char spgrp[20];
|
||||||
|
-
|
||||||
|
- sprintf(spgrp, "pgrp=%d", pgrp);
|
||||||
|
|
||||||
|
ret = 1;
|
||||||
|
list_for_each(p, list) {
|
||||||
|
@@ -275,9 +271,6 @@ static int unlink_mount_tree(struct auto
|
||||||
|
|
||||||
|
mnt = list_entry(p, struct mnt_list, list);
|
||||||
|
|
||||||
|
- if (strstr(mnt->opts, spgrp))
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
if (strcmp(mnt->fs_type, "autofs"))
|
||||||
|
rv = spawn_umount(ap->logopt, "-l", mnt->path, NULL);
|
||||||
|
else
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -44,19 +44,10 @@ static int unlink_mount_tree(struct auto
|
||||||
|
{
|
||||||
|
struct mnt_list *this;
|
||||||
|
int rv, ret;
|
||||||
|
- pid_t pgrp = getpgrp();
|
||||||
|
- char spgrp[20];
|
||||||
|
-
|
||||||
|
- sprintf(spgrp, "pgrp=%d", pgrp);
|
||||||
|
|
||||||
|
ret = 1;
|
||||||
|
this = mnts;
|
||||||
|
while (this) {
|
||||||
|
- if (strstr(this->opts, spgrp)) {
|
||||||
|
- this = this->next;
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if (strcmp(this->fs_type, "autofs"))
|
||||||
|
rv = spawn_umount(ap->logopt, "-l", this->path, NULL);
|
||||||
|
else
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -53,7 +53,6 @@ struct mnt_list {
|
||||||
|
char *fs_name;
|
||||||
|
char *fs_type;
|
||||||
|
char *opts;
|
||||||
|
- pid_t owner;
|
||||||
|
/*
|
||||||
|
* List operations ie. get_mnt_list.
|
||||||
|
*/
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -798,7 +798,6 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
struct mntent *mnt;
|
||||||
|
struct mnt_list *ent, *mptr, *last;
|
||||||
|
struct mnt_list *list = NULL;
|
||||||
|
- char *pgrp;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (!path || !pathlen || pathlen > PATH_MAX)
|
||||||
|
@@ -879,15 +878,6 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strcpy(ent->opts, mnt->mnt_opts);
|
||||||
|
-
|
||||||
|
- ent->owner = 0;
|
||||||
|
- pgrp = strstr(mnt->mnt_opts, "pgrp=");
|
||||||
|
- if (pgrp) {
|
||||||
|
- char *end = strchr(pgrp, ',');
|
||||||
|
- if (end)
|
||||||
|
- *end = '\0';
|
||||||
|
- sscanf(pgrp, "pgrp=%d", &ent->owner);
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
endmntent(tab);
|
||||||
|
|
||||||
|
@@ -1068,7 +1058,6 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
struct mntent *mnt;
|
||||||
|
struct mnt_list *ent, *mptr;
|
||||||
|
struct mnt_list *tree = NULL;
|
||||||
|
- char *pgrp;
|
||||||
|
size_t plen;
|
||||||
|
int eq;
|
||||||
|
|
||||||
|
@@ -1147,15 +1136,6 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
}
|
||||||
|
strcpy(ent->opts, mnt->mnt_opts);
|
||||||
|
|
||||||
|
- ent->owner = 0;
|
||||||
|
- pgrp = strstr(mnt->mnt_opts, "pgrp=");
|
||||||
|
- if (pgrp) {
|
||||||
|
- char *end = strchr(pgrp, ',');
|
||||||
|
- if (end)
|
||||||
|
- *end = '\0';
|
||||||
|
- sscanf(pgrp, "pgrp=%d", &ent->owner);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
mptr = tree;
|
||||||
|
while (mptr) {
|
||||||
|
int elen = strlen(ent->path);
|
@ -0,0 +1,222 @@
|
|||||||
|
autofs-5.1.5 - log mount call arguments if mount_verbose is set
|
||||||
|
|
||||||
|
From: Lars R. Damerow <lars@pixar.com>
|
||||||
|
|
||||||
|
Override the debug log only setting if mount_verbose is set so that
|
||||||
|
mount parameter information is logged on mount.
|
||||||
|
|
||||||
|
Signed-off-by: Lars R. Damerow <lars@pixar.com>
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/mount_afs.c | 6 +++++-
|
||||||
|
modules/mount_bind.c | 10 +++++++---
|
||||||
|
modules/mount_ext2.c | 16 ++++++++++------
|
||||||
|
modules/mount_generic.c | 14 +++++++++-----
|
||||||
|
modules/mount_nfs.c | 29 +++++++++++++++++------------
|
||||||
|
6 files changed, 49 insertions(+), 27 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -49,6 +49,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use malloc(3) in spawn.c.
|
||||||
|
- add mount_verbose configuration option.
|
||||||
|
- optionally log mount requestor process info.
|
||||||
|
+- log mount call arguments if mount_verbose is set.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_afs.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_afs.c
|
||||||
|
@@ -37,10 +37,14 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
char dest[PATH_MAX + 1];
|
||||||
|
size_t r_len = strlen(root);
|
||||||
|
size_t d_len = r_len + name_len + 2;
|
||||||
|
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
||||||
|
|
||||||
|
if (ap->flags & MOUNT_FLAG_REMOUNT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
+ if (defaults_get_mount_verbose())
|
||||||
|
+ mountlog = &log_info;
|
||||||
|
+
|
||||||
|
if (d_len > PATH_MAX)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
@@ -53,7 +57,7 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
if (dest[strlen(dest)-1] == '/')
|
||||||
|
dest[strlen(dest)-1] = '\0';
|
||||||
|
|
||||||
|
- debug(ap->logopt, MODPREFIX "mounting AFS %s -> %s", dest, what);
|
||||||
|
+ mountlog(ap->logopt, MODPREFIX "mounting AFS %s -> %s", dest, what);
|
||||||
|
|
||||||
|
return symlink(what, dest); /* Try it. If it fails, return the error. */
|
||||||
|
}
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_bind.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_bind.c
|
||||||
|
@@ -81,10 +81,14 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
int err;
|
||||||
|
int i, len;
|
||||||
|
int symlnk = (*name != '/' && (ap->flags & MOUNT_FLAG_SYMLINK));
|
||||||
|
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
||||||
|
|
||||||
|
if (ap->flags & MOUNT_FLAG_REMOUNT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
+ if (defaults_get_mount_verbose())
|
||||||
|
+ mountlog = &log_info;
|
||||||
|
+
|
||||||
|
/* Extract "symlink" pseudo-option which forces local filesystems
|
||||||
|
* to be symlinked instead of bound.
|
||||||
|
*/
|
||||||
|
@@ -164,9 +168,9 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
if (!status)
|
||||||
|
existed = 0;
|
||||||
|
|
||||||
|
- debug(ap->logopt, MODPREFIX
|
||||||
|
- "calling mount --bind -o %s %s %s",
|
||||||
|
- options, what, fullpath);
|
||||||
|
+ mountlog(ap->logopt, MODPREFIX
|
||||||
|
+ "calling mount --bind -o %s %s %s",
|
||||||
|
+ options, what, fullpath);
|
||||||
|
|
||||||
|
err = spawn_bind_mount(ap->logopt, "-o",
|
||||||
|
options, what, fullpath, NULL);
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_ext2.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_ext2.c
|
||||||
|
@@ -47,10 +47,14 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
int err, ro = 0;
|
||||||
|
const char *fsck_prog;
|
||||||
|
int len, status, existed = 1;
|
||||||
|
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
||||||
|
|
||||||
|
if (ap->flags & MOUNT_FLAG_REMOUNT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
+ if (defaults_get_mount_verbose())
|
||||||
|
+ mountlog = &log_info;
|
||||||
|
+
|
||||||
|
/* Root offset of multi-mount */
|
||||||
|
len = strlen(root);
|
||||||
|
if (root[len - 1] == '/') {
|
||||||
|
@@ -121,15 +125,15 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options) {
|
||||||
|
- debug(ap->logopt, MODPREFIX
|
||||||
|
- "calling mount -t %s -o %s %s %s",
|
||||||
|
- fstype, options, what, fullpath);
|
||||||
|
+ mountlog(ap->logopt, MODPREFIX
|
||||||
|
+ "calling mount -t %s -o %s %s %s",
|
||||||
|
+ fstype, options, what, fullpath);
|
||||||
|
err = spawn_mount(ap->logopt, "-t", fstype,
|
||||||
|
"-o", options, what, fullpath, NULL);
|
||||||
|
} else {
|
||||||
|
- debug(ap->logopt,
|
||||||
|
- MODPREFIX "calling mount -t %s %s %s",
|
||||||
|
- fstype, what, fullpath);
|
||||||
|
+ mountlog(ap->logopt,
|
||||||
|
+ MODPREFIX "calling mount -t %s %s %s",
|
||||||
|
+ fstype, what, fullpath);
|
||||||
|
err = spawn_mount(ap->logopt, "-t", fstype, what, fullpath, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_generic.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_generic.c
|
||||||
|
@@ -46,10 +46,14 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
char buf[MAX_ERR_BUF];
|
||||||
|
int err;
|
||||||
|
int len, status, existed = 1;
|
||||||
|
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
||||||
|
|
||||||
|
if (ap->flags & MOUNT_FLAG_REMOUNT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
+ if (defaults_get_mount_verbose())
|
||||||
|
+ mountlog = &log_info;
|
||||||
|
+
|
||||||
|
/* Root offset of multi-mount */
|
||||||
|
len = strlen(root);
|
||||||
|
if (root[len - 1] == '/') {
|
||||||
|
@@ -80,15 +84,15 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
existed = 0;
|
||||||
|
|
||||||
|
if (options && options[0]) {
|
||||||
|
- debug(ap->logopt,
|
||||||
|
- MODPREFIX "calling mount -t %s -o %s %s %s",
|
||||||
|
- fstype, options, what, fullpath);
|
||||||
|
+ mountlog(ap->logopt,
|
||||||
|
+ MODPREFIX "calling mount -t %s -o %s %s %s",
|
||||||
|
+ fstype, options, what, fullpath);
|
||||||
|
|
||||||
|
err = spawn_mount(ap->logopt, "-t", fstype,
|
||||||
|
"-o", options, what, fullpath, NULL);
|
||||||
|
} else {
|
||||||
|
- debug(ap->logopt, MODPREFIX "calling mount -t %s %s %s",
|
||||||
|
- fstype, what, fullpath);
|
||||||
|
+ mountlog(ap->logopt, MODPREFIX "calling mount -t %s %s %s",
|
||||||
|
+ fstype, what, fullpath);
|
||||||
|
err = spawn_mount(ap->logopt, "-t", fstype, what, fullpath, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_nfs.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_nfs.c
|
||||||
|
@@ -77,13 +77,17 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
int port = -1;
|
||||||
|
int ro = 0; /* Set if mount bind should be read-only */
|
||||||
|
int rdma = 0;
|
||||||
|
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
||||||
|
|
||||||
|
if (ap->flags & MOUNT_FLAG_REMOUNT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- debug(ap->logopt,
|
||||||
|
- MODPREFIX "root=%s name=%s what=%s, fstype=%s, options=%s",
|
||||||
|
- root, name, what, fstype, options);
|
||||||
|
+ if (defaults_get_mount_verbose())
|
||||||
|
+ mountlog = &log_info;
|
||||||
|
+
|
||||||
|
+ mountlog(ap->logopt,
|
||||||
|
+ MODPREFIX "root=%s name=%s what=%s, fstype=%s, options=%s",
|
||||||
|
+ root, name, what, fstype, options);
|
||||||
|
|
||||||
|
mount_default_proto = defaults_get_mount_nfs_default_proto();
|
||||||
|
vers = NFS_VERS_DEFAULT | NFS_PROTO_DEFAULT;
|
||||||
|
@@ -203,9 +207,9 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
if ((vers & NFS_PROTO_MASK) == 0)
|
||||||
|
vers |= NFS_PROTO_MASK;
|
||||||
|
|
||||||
|
- debug(ap->logopt, MODPREFIX
|
||||||
|
- "nfs options=\"%s\", nobind=%d, nosymlink=%d, ro=%d",
|
||||||
|
- nfsoptions, nobind, nosymlink, ro);
|
||||||
|
+ mountlog(ap->logopt, MODPREFIX
|
||||||
|
+ "nfs options=\"%s\", nobind=%d, nosymlink=%d, ro=%d",
|
||||||
|
+ nfsoptions, nobind, nosymlink, ro);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!parse_location(ap->logopt, &hosts, what, flags)) {
|
||||||
|
@@ -379,17 +383,18 @@ dont_probe:
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nfsoptions && *nfsoptions) {
|
||||||
|
- debug(ap->logopt,
|
||||||
|
- MODPREFIX "calling mount -t %s " SLOPPY
|
||||||
|
- "-o %s %s %s", fstype, nfsoptions, loc, fullpath);
|
||||||
|
+ mountlog(ap->logopt,
|
||||||
|
+ MODPREFIX "calling mount -t %s " SLOPPY
|
||||||
|
+ "-o %s %s %s", fstype, nfsoptions, loc,
|
||||||
|
+ fullpath);
|
||||||
|
|
||||||
|
err = spawn_mount(ap->logopt,
|
||||||
|
"-t", fstype, SLOPPYOPT "-o",
|
||||||
|
nfsoptions, loc, fullpath, NULL);
|
||||||
|
} else {
|
||||||
|
- debug(ap->logopt,
|
||||||
|
- MODPREFIX "calling mount -t %s %s %s",
|
||||||
|
- fstype, loc, fullpath);
|
||||||
|
+ mountlog(ap->logopt,
|
||||||
|
+ MODPREFIX "calling mount -t %s %s %s",
|
||||||
|
+ fstype, loc, fullpath);
|
||||||
|
err = spawn_mount(ap->logopt,
|
||||||
|
"-t", fstype, loc, fullpath, NULL);
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
autofs-5.1.5 - make expire remaining log level debug
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The log message listing the remaining mounts should be log level
|
||||||
|
debug not info.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 2 +-
|
||||||
|
daemon/indirect.c | 4 ++--
|
||||||
|
3 files changed, 4 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -50,6 +50,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add mount_verbose configuration option.
|
||||||
|
- optionally log mount requestor process info.
|
||||||
|
- log mount call arguments if mount_verbose is set.
|
||||||
|
+- make expire remaining log level debug.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -990,7 +990,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
if (left)
|
||||||
|
- info(ap->logopt, "%d remaining in %s", left, ap->path);
|
||||||
|
+ debug(ap->logopt, "%d remaining in %s", left, ap->path);
|
||||||
|
|
||||||
|
ec.status = left;
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -578,7 +578,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
if (submnts)
|
||||||
|
- info(ap->logopt,
|
||||||
|
+ debug(ap->logopt,
|
||||||
|
"%d submounts remaining in %s", submnts, ap->path);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -586,7 +586,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
* words) the umounts are done by the time we reach here
|
||||||
|
*/
|
||||||
|
if (count)
|
||||||
|
- info(ap->logopt, "%d remaining in %s", count, ap->path);
|
||||||
|
+ debug(ap->logopt, "%d remaining in %s", count, ap->path);
|
||||||
|
|
||||||
|
ec.status = left;
|
||||||
|
|
@ -0,0 +1,134 @@
|
|||||||
|
autofs-5.1.5 - move unlink_mount_tree() to lib/mounts.c
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Both daemon/direct.c and daemon/indirect.c use the same function to
|
||||||
|
lazy umount a list of mounts, move that function to lib/mounts.c.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 2 --
|
||||||
|
daemon/indirect.c | 34 ----------------------------------
|
||||||
|
include/mounts.h | 1 +
|
||||||
|
lib/mounts.c | 35 +++++++++++++++++++++++++++++++++++
|
||||||
|
5 files changed, 37 insertions(+), 36 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -71,6 +71,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- refactor unlink_active_mounts() in direct.c.
|
||||||
|
- don't use tree_is_mounted() for mounted checks.
|
||||||
|
- use single unlink_umount_tree() for both direct and indirect mounts.
|
||||||
|
+- move unlink_mount_tree() to lib/mounts.c.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -49,8 +49,6 @@ pthread_key_t key_mnt_direct_params;
|
||||||
|
pthread_key_t key_mnt_offset_params;
|
||||||
|
pthread_once_t key_mnt_params_once = PTHREAD_ONCE_INIT;
|
||||||
|
|
||||||
|
-int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts);
|
||||||
|
-
|
||||||
|
static void key_mnt_params_destroy(void *arg)
|
||||||
|
{
|
||||||
|
struct mnt_params *mp;
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -40,40 +40,6 @@
|
||||||
|
/* Attribute to create detached thread */
|
||||||
|
extern pthread_attr_t th_attr_detached;
|
||||||
|
|
||||||
|
-int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
|
||||||
|
-{
|
||||||
|
- struct mnt_list *this;
|
||||||
|
- int rv, ret;
|
||||||
|
-
|
||||||
|
- ret = 1;
|
||||||
|
- this = mnts;
|
||||||
|
- while (this) {
|
||||||
|
- if (this->flags & MNTS_AUTOFS)
|
||||||
|
- rv = umount2(this->mp, MNT_DETACH);
|
||||||
|
- else
|
||||||
|
- rv = spawn_umount(ap->logopt, "-l", this->mp, NULL);
|
||||||
|
- if (rv == -1) {
|
||||||
|
- debug(ap->logopt,
|
||||||
|
- "can't unlink %s from mount tree", this->mp);
|
||||||
|
-
|
||||||
|
- switch (errno) {
|
||||||
|
- case EINVAL:
|
||||||
|
- warn(ap->logopt,
|
||||||
|
- "bad superblock or not mounted");
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- case ENOENT:
|
||||||
|
- case EFAULT:
|
||||||
|
- ret = 0;
|
||||||
|
- warn(ap->logopt, "bad path for mount");
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- this = this->next;
|
||||||
|
- }
|
||||||
|
- return ret;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
|
||||||
|
{
|
||||||
|
const char *str_indirect = mount_type_str(t_indirect);
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -100,6 +100,7 @@ int ext_mount_add(struct list_head *, co
|
||||||
|
int ext_mount_remove(struct list_head *, const char *);
|
||||||
|
int ext_mount_inuse(const char *);
|
||||||
|
struct mnt_list *get_mnt_list(const char *path, int include);
|
||||||
|
+int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts);
|
||||||
|
void free_mnt_list(struct mnt_list *list);
|
||||||
|
int is_mounted(const char *mp, unsigned int type);
|
||||||
|
void tree_free_mnt_tree(struct mnt_list *tree);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -881,6 +881,41 @@ local_getmntent_r(FILE *tab, struct mnte
|
||||||
|
return mnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
|
||||||
|
+{
|
||||||
|
+ struct mnt_list *this;
|
||||||
|
+ int rv, ret;
|
||||||
|
+
|
||||||
|
+ ret = 1;
|
||||||
|
+ this = mnts;
|
||||||
|
+ while (this) {
|
||||||
|
+ if (this->flags & MNTS_AUTOFS)
|
||||||
|
+ rv = umount2(this->mp, MNT_DETACH);
|
||||||
|
+ else
|
||||||
|
+ rv = spawn_umount(ap->logopt, "-l", this->mp, NULL);
|
||||||
|
+ if (rv == -1) {
|
||||||
|
+ debug(ap->logopt,
|
||||||
|
+ "can't unlink %s from mount tree", this->mp);
|
||||||
|
+
|
||||||
|
+ switch (errno) {
|
||||||
|
+ case EINVAL:
|
||||||
|
+ warn(ap->logopt,
|
||||||
|
+ "bad superblock or not mounted");
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case ENOENT:
|
||||||
|
+ case EFAULT:
|
||||||
|
+ ret = 0;
|
||||||
|
+ warn(ap->logopt, "bad path for mount");
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ this = this->next;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Get list of mounts under path in longest->shortest order
|
||||||
|
*/
|
@ -0,0 +1,155 @@
|
|||||||
|
autofs-5.1.5 - optionally log mount requestor process info
|
||||||
|
|
||||||
|
From: Lars R. Damerow <lars@pixar.com>
|
||||||
|
|
||||||
|
This information can be helpful to determine who or what is making
|
||||||
|
particular mount requests, especially when used in conjunction with
|
||||||
|
the use_mount_request_log_id option.
|
||||||
|
|
||||||
|
Signed-off-by: Lars R. Damerow <lars@pixar.com>
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 6 ++++++
|
||||||
|
daemon/indirect.c | 6 ++++++
|
||||||
|
include/log.h | 2 ++
|
||||||
|
lib/log.c | 39 +++++++++++++++++++++++++++++++++++++++
|
||||||
|
man/autofs.conf.5.in | 3 ++-
|
||||||
|
redhat/autofs.conf.default.in | 4 +++-
|
||||||
|
samples/autofs.conf.default.in | 4 +++-
|
||||||
|
8 files changed, 62 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -48,6 +48,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add NULL check for get_addr_string() return.
|
||||||
|
- use malloc(3) in spawn.c.
|
||||||
|
- add mount_verbose configuration option.
|
||||||
|
+- optionally log mount requestor process info.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -1242,6 +1242,12 @@ static void *do_mount_direct(void *arg)
|
||||||
|
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state);
|
||||||
|
|
||||||
|
+ if (defaults_get_mount_verbose()) {
|
||||||
|
+ pid_t ppid = log_pidinfo(ap, mt.pid, "requestor");
|
||||||
|
+ if (ppid > 0)
|
||||||
|
+ log_pidinfo(ap, ppid, "parent");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
status = fstat(mt.ioctlfd, &st);
|
||||||
|
if (status == -1) {
|
||||||
|
error(ap->logopt,
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -758,6 +758,12 @@ static void *do_mount_indirect(void *arg
|
||||||
|
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state);
|
||||||
|
|
||||||
|
+ if (defaults_get_mount_verbose()) {
|
||||||
|
+ pid_t ppid = log_pidinfo(ap, mt.pid, "requestor");
|
||||||
|
+ if (ppid > 0)
|
||||||
|
+ log_pidinfo(ap, ppid, "parent");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
len = ncat_path(buf, sizeof(buf), ap->path, mt.name, mt.len);
|
||||||
|
if (!len) {
|
||||||
|
crit(ap->logopt, "path to be mounted is to long");
|
||||||
|
--- autofs-5.1.4.orig/include/log.h
|
||||||
|
+++ autofs-5.1.4/include/log.h
|
||||||
|
@@ -46,6 +46,8 @@ extern void log_crit(unsigned, const cha
|
||||||
|
extern void log_debug(unsigned int, const char* msg, ...);
|
||||||
|
extern void logmsg(const char* msg, ...);
|
||||||
|
|
||||||
|
+extern pid_t log_pidinfo(struct autofs_point *ap, pid_t pid, char *label);
|
||||||
|
+
|
||||||
|
#define debug(opt, msg, args...) \
|
||||||
|
do { log_debug(opt, "%s: " msg, __FUNCTION__, ##args); } while (0)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/lib/log.c
|
||||||
|
+++ autofs-5.1.4/lib/log.c
|
||||||
|
@@ -325,3 +325,42 @@ void log_to_stderr(void)
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+pid_t log_pidinfo(struct autofs_point *ap, pid_t pid, char *label) {
|
||||||
|
+ char buf[PATH_MAX + 1] = "";
|
||||||
|
+ FILE *statfile;
|
||||||
|
+
|
||||||
|
+ pid_t tgid, ppid;
|
||||||
|
+ int uid, euid, gid, egid;
|
||||||
|
+ char comm[64] = "";
|
||||||
|
+
|
||||||
|
+ sprintf(buf, "/proc/%d/status", pid);
|
||||||
|
+ statfile = fopen(buf, "r");
|
||||||
|
+ if (statfile == NULL) {
|
||||||
|
+ info(ap->logopt, "pidinfo %s: failed to open %s", label, buf);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ while (fgets(buf, sizeof(buf), statfile) != NULL) {
|
||||||
|
+ if (strncmp(buf, "Name:", 5) == 0) {
|
||||||
|
+ sscanf(buf, "Name:\t%s", (char *) &comm);
|
||||||
|
+ } else if (strncmp(buf, "Tgid:", 5) == 0) {
|
||||||
|
+ sscanf(buf, "Tgid:\t%d", (int *) &tgid);
|
||||||
|
+ } else if (strncmp(buf, "PPid:", 5) == 0) {
|
||||||
|
+ sscanf(buf, "PPid:\t%d", (int *) &ppid);
|
||||||
|
+ } else if (strncmp(buf, "Uid:", 4) == 0) {
|
||||||
|
+ sscanf(buf,
|
||||||
|
+ "Uid:\t%d\t%d", (int *) &uid, (int *) &euid);
|
||||||
|
+ } else if (strncmp(buf, "Gid:", 4) == 0) {
|
||||||
|
+ sscanf(buf,
|
||||||
|
+ "Gid:\t%d\t%d", (int *) &gid, (int *) &egid);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ fclose(statfile);
|
||||||
|
+
|
||||||
|
+ info(ap->logopt,
|
||||||
|
+ "pidinfo %s: pid:%d comm:%s tgid:%d uid:%d euid:%d gid:%d egid:%d",
|
||||||
|
+ label, pid, comm, tgid, uid, euid, gid, egid);
|
||||||
|
+
|
||||||
|
+ return ppid;
|
||||||
|
+}
|
||||||
|
--- autofs-5.1.4.orig/man/autofs.conf.5.in
|
||||||
|
+++ autofs-5.1.4/man/autofs.conf.5.in
|
||||||
|
@@ -43,7 +43,8 @@ setting.
|
||||||
|
.TP
|
||||||
|
.B mount_verbose
|
||||||
|
.br
|
||||||
|
-Use the verbose flag when spawning mount(8) (program default "no").
|
||||||
|
+Use the verbose flag when spawning mount(8), and log some process info
|
||||||
|
+about the requestor and its parent (program default "no").
|
||||||
|
.TP
|
||||||
|
.B mount_wait
|
||||||
|
.br
|
||||||
|
--- autofs-5.1.4.orig/redhat/autofs.conf.default.in
|
||||||
|
+++ autofs-5.1.4/redhat/autofs.conf.default.in
|
||||||
|
@@ -26,7 +26,9 @@ timeout = 300
|
||||||
|
#
|
||||||
|
#negative_timeout = 60
|
||||||
|
#
|
||||||
|
-# mount_verbose - use the -v flag when calling mount(8).
|
||||||
|
+# mount_verbose - use the -v flag when calling mount(8) and log some
|
||||||
|
+# process information about the requestor and its
|
||||||
|
+# parent.
|
||||||
|
#
|
||||||
|
#mount_verbose = no
|
||||||
|
#
|
||||||
|
--- autofs-5.1.4.orig/samples/autofs.conf.default.in
|
||||||
|
+++ autofs-5.1.4/samples/autofs.conf.default.in
|
||||||
|
@@ -26,7 +26,9 @@ timeout = 300
|
||||||
|
#
|
||||||
|
#negative_timeout = 60
|
||||||
|
#
|
||||||
|
-# mount_verbose - use the -v flag when calling mount(8).
|
||||||
|
+# mount_verbose - use the -v flag when calling mount(8) and log some
|
||||||
|
+# process information about the requestor and its
|
||||||
|
+# parent.
|
||||||
|
#
|
||||||
|
#mount_verbose = no
|
||||||
|
#
|
@ -0,0 +1,116 @@
|
|||||||
|
autofs-5.1.5 - refactor unlink_active_mounts() in direct_c
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
In daemon/direct.c:unlink_active_mounts() the tree_get_mnt_list() call
|
||||||
|
returns 1 for a non-empty list which amounts to a mounted check and then
|
||||||
|
handles the case where the map is being read.
|
||||||
|
|
||||||
|
But the check that's carried out is to distinguish between a readmap
|
||||||
|
and a mount activity which should be handled by the caller instead of
|
||||||
|
burying the check away in the unlink_active_mounts() function.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
daemon/direct.c | 63 +++++++++++++++++++++++++++-----------------------------
|
||||||
|
2 files changed, 32 insertions(+), 32 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -68,6 +68,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- always use PROC_MOUNTS to make mount lists.
|
||||||
|
- add glibc getmntent_r().
|
||||||
|
- use local getmntent_r in table_is_mounted().
|
||||||
|
+- refactor unlink_active_mounts() in direct.c.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -298,37 +298,12 @@ static int unlink_mount_tree(struct auto
|
||||||
|
|
||||||
|
static int unlink_active_mounts(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me)
|
||||||
|
{
|
||||||
|
- struct ioctl_ops *ops = get_ioctl_ops();
|
||||||
|
struct list_head list;
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&list);
|
||||||
|
|
||||||
|
- if (tree_get_mnt_list(mnts, &list, me->key, 1)) {
|
||||||
|
- if (ap->state == ST_READMAP) {
|
||||||
|
- time_t tout = get_exp_timeout(ap, me->source);
|
||||||
|
- int save_ioctlfd, ioctlfd;
|
||||||
|
-
|
||||||
|
- save_ioctlfd = ioctlfd = me->ioctlfd;
|
||||||
|
-
|
||||||
|
- if (ioctlfd == -1)
|
||||||
|
- ops->open(ap->logopt,
|
||||||
|
- &ioctlfd, me->dev, me->key);
|
||||||
|
-
|
||||||
|
- if (ioctlfd < 0) {
|
||||||
|
- error(ap->logopt,
|
||||||
|
- "failed to create ioctl fd for %s",
|
||||||
|
- me->key);
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- ops->timeout(ap->logopt, ioctlfd, tout);
|
||||||
|
-
|
||||||
|
- if (save_ioctlfd == -1)
|
||||||
|
- ops->close(ap->logopt, ioctlfd);
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
+ if (!tree_get_mnt_list(mnts, &list, me->key, 1))
|
||||||
|
+ return 1;
|
||||||
|
|
||||||
|
if (!unlink_mount_tree(ap, &list)) {
|
||||||
|
debug(ap->logopt,
|
||||||
|
@@ -371,16 +346,40 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
if (ret == 0)
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
+ if (ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
|
||||||
|
+ time_t tout = get_exp_timeout(ap, me->source);
|
||||||
|
+ int save_ioctlfd, ioctlfd;
|
||||||
|
+
|
||||||
|
+ save_ioctlfd = ioctlfd = me->ioctlfd;
|
||||||
|
+
|
||||||
|
+ if (ioctlfd == -1)
|
||||||
|
+ ops->open(ap->logopt,
|
||||||
|
+ &ioctlfd, me->dev, me->key);
|
||||||
|
+
|
||||||
|
+ if (ioctlfd < 0) {
|
||||||
|
+ error(ap->logopt,
|
||||||
|
+ "failed to create ioctl fd for %s",
|
||||||
|
+ me->key);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ops->timeout(ap->logopt, ioctlfd, tout);
|
||||||
|
+
|
||||||
|
+ if (save_ioctlfd == -1)
|
||||||
|
+ ops->close(ap->logopt, ioctlfd);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
- * A return of 0 indicates we're re-reading the map.
|
||||||
|
* A return of 1 indicates we successfully unlinked
|
||||||
|
- * the mount tree if there was one. A return of -1
|
||||||
|
- * inducates we failed to unlink the mount tree so
|
||||||
|
+ * the mount tree if there was one. A return of 0
|
||||||
|
+ * indicates we failed to unlink the mount tree so
|
||||||
|
* we have to return a failure.
|
||||||
|
*/
|
||||||
|
ret = unlink_active_mounts(ap, mnts, me);
|
||||||
|
- if (ret == -1 || ret == 0)
|
||||||
|
- return ret;
|
||||||
|
+ if (!ret)
|
||||||
|
+ return -1;
|
||||||
|
|
||||||
|
if (me->ioctlfd != -1) {
|
||||||
|
error(ap->logopt, "active direct mount %s", me->key);
|
@ -0,0 +1,38 @@
|
|||||||
|
autofs-5.1.5 - remove a couple of old debug messages
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Remove a couple of debug log messages from lookup_ghost().
|
||||||
|
These messages have not shown a problem here and should be
|
||||||
|
removed.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/lookup.c | 5 -----
|
||||||
|
2 files changed, 1 insertion(+), 5 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -57,6 +57,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- change expire type naming to better reflect usage.
|
||||||
|
- remove unused function has_fstab_option().
|
||||||
|
- remove unused function reverse_mnt_list().
|
||||||
|
+- remove a couple of old debug messages.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/lookup.c
|
||||||
|
+++ autofs-5.1.4/daemon/lookup.c
|
||||||
|
@@ -793,11 +793,6 @@ int lookup_ghost(struct autofs_point *ap
|
||||||
|
|
||||||
|
/* Directory already exists? */
|
||||||
|
if (!ret) {
|
||||||
|
- /* Shouldn't need this
|
||||||
|
- me->dev = st.st_dev;
|
||||||
|
- me->ino = st.st_ino;
|
||||||
|
- */
|
||||||
|
- debug(ap->logopt, "me->dev %d me->ino %d", me->dev, me->ino);
|
||||||
|
free(fullpath);
|
||||||
|
goto next;
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
autofs-5.1.5 - remove unused function has_fstab_option()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
This function is not used, remove it.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
include/mounts.h | 1 -
|
||||||
|
lib/mounts.c | 29 -----------------------------
|
||||||
|
3 files changed, 1 insertion(+), 30 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -55,6 +55,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix macro expansion in selector values.
|
||||||
|
- also use strictexpire for offsets.
|
||||||
|
- change expire type naming to better reflect usage.
|
||||||
|
+- remove unused function has_fstab_option().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -103,7 +103,6 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
struct mnt_list *reverse_mnt_list(struct mnt_list *list);
|
||||||
|
void free_mnt_list(struct mnt_list *list);
|
||||||
|
int is_mounted(const char *table, const char *path, unsigned int type);
|
||||||
|
-int has_fstab_option(const char *opt);
|
||||||
|
void tree_free_mnt_tree(struct mnt_list *tree);
|
||||||
|
struct mnt_list *tree_make_mnt_tree(const char *table, const char *path);
|
||||||
|
int tree_get_mnt_list(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -1026,35 +1026,6 @@ int is_mounted(const char *table, const
|
||||||
|
return table_is_mounted(table, path, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
-int has_fstab_option(const char *opt)
|
||||||
|
-{
|
||||||
|
- struct mntent *mnt;
|
||||||
|
- struct mntent mnt_wrk;
|
||||||
|
- char buf[PATH_MAX * 3];
|
||||||
|
- FILE *tab;
|
||||||
|
- int ret = 0;
|
||||||
|
-
|
||||||
|
- if (!opt)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- tab = open_setmntent_r(_PATH_MNTTAB);
|
||||||
|
- if (!tab) {
|
||||||
|
- char *estr = strerror_r(errno, buf, PATH_MAX - 1);
|
||||||
|
- logerr("setmntent: %s", estr);
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- while ((mnt = getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
|
||||||
|
- if (hasmntopt(mnt, opt)) {
|
||||||
|
- ret = 1;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- endmntent(tab);
|
||||||
|
-
|
||||||
|
- return ret;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* Since we have to look at the entire mount tree for direct
|
||||||
|
* mounts (all mounts under "/") and we may have a large number
|
@ -0,0 +1,63 @@
|
|||||||
|
autofs-5.1.5 - remove unused function reverse_mnt_list()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
This function is not used, remove it.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
include/mounts.h | 1 -
|
||||||
|
lib/mounts.c | 21 ---------------------
|
||||||
|
3 files changed, 1 insertion(+), 22 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -56,6 +56,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- also use strictexpire for offsets.
|
||||||
|
- change expire type naming to better reflect usage.
|
||||||
|
- remove unused function has_fstab_option().
|
||||||
|
+- remove unused function reverse_mnt_list().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -100,7 +100,6 @@ int ext_mount_add(struct list_head *, co
|
||||||
|
int ext_mount_remove(struct list_head *, const char *);
|
||||||
|
int ext_mount_inuse(const char *);
|
||||||
|
struct mnt_list *get_mnt_list(const char *table, const char *path, int include);
|
||||||
|
-struct mnt_list *reverse_mnt_list(struct mnt_list *list);
|
||||||
|
void free_mnt_list(struct mnt_list *list);
|
||||||
|
int is_mounted(const char *table, const char *path, unsigned int type);
|
||||||
|
void tree_free_mnt_tree(struct mnt_list *tree);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -894,27 +894,6 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/*
|
||||||
|
- * Reverse a list of mounts
|
||||||
|
- */
|
||||||
|
-struct mnt_list *reverse_mnt_list(struct mnt_list *list)
|
||||||
|
-{
|
||||||
|
- struct mnt_list *next, *last;
|
||||||
|
-
|
||||||
|
- if (!list)
|
||||||
|
- return NULL;
|
||||||
|
-
|
||||||
|
- next = list;
|
||||||
|
- last = NULL;
|
||||||
|
- while (next) {
|
||||||
|
- struct mnt_list *this = next;
|
||||||
|
- next = this->next;
|
||||||
|
- this->next = last;
|
||||||
|
- last = this;
|
||||||
|
- }
|
||||||
|
- return last;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
void free_mnt_list(struct mnt_list *list)
|
||||||
|
{
|
||||||
|
struct mnt_list *next;
|
@ -0,0 +1,279 @@
|
|||||||
|
autofs-5.1.5 - use bit flags for autofs mount types in mnt_list
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Several fields in struct mnt_list don't need to be saved as strings
|
||||||
|
so change to using bit flags for them instead.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
daemon/direct.c | 10 ++---
|
||||||
|
daemon/indirect.c | 16 ++++----
|
||||||
|
include/mounts.h | 7 ++-
|
||||||
|
lib/mounts.c | 97 +++++++++++-------------------------------------------
|
||||||
|
5 files changed, 38 insertions(+), 93 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -63,6 +63,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add ignore mount option.
|
||||||
|
- use ignore option for offset mounts as well.
|
||||||
|
- add config option for "ignore" mount option
|
||||||
|
+- use bit flags for autofs mount types in mnt_list.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -271,10 +271,10 @@ static int unlink_mount_tree(struct auto
|
||||||
|
|
||||||
|
mnt = list_entry(p, struct mnt_list, list);
|
||||||
|
|
||||||
|
- if (strcmp(mnt->fs_type, "autofs"))
|
||||||
|
- rv = spawn_umount(ap->logopt, "-l", mnt->path, NULL);
|
||||||
|
- else
|
||||||
|
+ if (mnt->flags & MNTS_AUTOFS)
|
||||||
|
rv = umount2(mnt->path, MNT_DETACH);
|
||||||
|
+ else
|
||||||
|
+ rv = spawn_umount(ap->logopt, "-l", mnt->path, NULL);
|
||||||
|
if (rv == -1) {
|
||||||
|
debug(ap->logopt,
|
||||||
|
"can't unlink %s from mount tree", mnt->path);
|
||||||
|
@@ -925,7 +925,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
if (!me)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- if (!strcmp(next->fs_type, "autofs")) {
|
||||||
|
+ if (next->flags & MNTS_AUTOFS) {
|
||||||
|
struct stat st;
|
||||||
|
int ioctlfd;
|
||||||
|
|
||||||
|
@@ -936,7 +936,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
* one of them and pass on state change.
|
||||||
|
*/
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
||||||
|
- if (strstr(next->opts, "indirect")) {
|
||||||
|
+ if (next->flags & MNTS_INDIRECT) {
|
||||||
|
master_notify_submount(ap, next->path, ap->state);
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
continue;
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -48,10 +48,10 @@ static int unlink_mount_tree(struct auto
|
||||||
|
ret = 1;
|
||||||
|
this = mnts;
|
||||||
|
while (this) {
|
||||||
|
- if (strcmp(this->fs_type, "autofs"))
|
||||||
|
- rv = spawn_umount(ap->logopt, "-l", this->path, NULL);
|
||||||
|
- else
|
||||||
|
+ if (this->flags & MNTS_AUTOFS)
|
||||||
|
rv = umount2(this->path, MNT_DETACH);
|
||||||
|
+ else
|
||||||
|
+ rv = spawn_umount(ap->logopt, "-l", this->path, NULL);
|
||||||
|
if (rv == -1) {
|
||||||
|
debug(ap->logopt,
|
||||||
|
"can't unlink %s from mount tree", this->path);
|
||||||
|
@@ -439,15 +439,15 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
char *ind_key;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- if (!strcmp(next->fs_type, "autofs")) {
|
||||||
|
+ if (next->flags & MNTS_AUTOFS) {
|
||||||
|
/*
|
||||||
|
* If we have submounts check if this path lives below
|
||||||
|
* one of them and pass on the state change.
|
||||||
|
*/
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
||||||
|
- if (strstr(next->opts, "indirect"))
|
||||||
|
+ if (next->flags & MNTS_INDIRECT)
|
||||||
|
master_notify_submount(ap, next->path, ap->state);
|
||||||
|
- else if (strstr(next->opts, "offset")) {
|
||||||
|
+ else if (next->flags & MNTS_OFFSET) {
|
||||||
|
struct map_source *map;
|
||||||
|
struct mapent_cache *mc = NULL;
|
||||||
|
struct mapent *me = NULL;
|
||||||
|
@@ -567,10 +567,10 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
pthread_cleanup_push(mnts_cleanup, mnts);
|
||||||
|
/* Are there any real mounts left */
|
||||||
|
for (next = mnts; next; next = next->next) {
|
||||||
|
- if (strcmp(next->fs_type, "autofs"))
|
||||||
|
+ if (!(next->flags & MNTS_AUTOFS))
|
||||||
|
count++;
|
||||||
|
else {
|
||||||
|
- if (strstr(next->opts, "indirect"))
|
||||||
|
+ if (next->flags & MNTS_INDIRECT)
|
||||||
|
submnts++;
|
||||||
|
else
|
||||||
|
offsets++;
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -35,6 +35,9 @@
|
||||||
|
#define MNTS_ALL 0x0001
|
||||||
|
#define MNTS_REAL 0x0002
|
||||||
|
#define MNTS_AUTOFS 0x0004
|
||||||
|
+#define MNTS_INDIRECT 0x0008
|
||||||
|
+#define MNTS_DIRECT 0x0010
|
||||||
|
+#define MNTS_OFFSET 0x0020
|
||||||
|
|
||||||
|
#define REMOUNT_SUCCESS 0x0000
|
||||||
|
#define REMOUNT_FAIL 0x0001
|
||||||
|
@@ -50,9 +53,7 @@ struct mapent;
|
||||||
|
|
||||||
|
struct mnt_list {
|
||||||
|
char *path;
|
||||||
|
- char *fs_name;
|
||||||
|
- char *fs_type;
|
||||||
|
- char *opts;
|
||||||
|
+ unsigned int flags;
|
||||||
|
/*
|
||||||
|
* List operations ie. get_mnt_list.
|
||||||
|
*/
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -855,29 +855,17 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
}
|
||||||
|
strcpy(ent->path, mnt->mnt_dir);
|
||||||
|
|
||||||
|
- ent->fs_name = malloc(strlen(mnt->mnt_fsname) + 1);
|
||||||
|
- if (!ent->fs_name) {
|
||||||
|
- endmntent(tab);
|
||||||
|
- free_mnt_list(list);
|
||||||
|
- return NULL;
|
||||||
|
- }
|
||||||
|
- strcpy(ent->fs_name, mnt->mnt_fsname);
|
||||||
|
+ if (!strcmp(mnt->mnt_type, "autofs"))
|
||||||
|
+ ent->flags |= MNTS_AUTOFS;
|
||||||
|
|
||||||
|
- ent->fs_type = malloc(strlen(mnt->mnt_type) + 1);
|
||||||
|
- if (!ent->fs_type) {
|
||||||
|
- endmntent(tab);
|
||||||
|
- free_mnt_list(list);
|
||||||
|
- return NULL;
|
||||||
|
- }
|
||||||
|
- strcpy(ent->fs_type, mnt->mnt_type);
|
||||||
|
-
|
||||||
|
- ent->opts = malloc(strlen(mnt->mnt_opts) + 1);
|
||||||
|
- if (!ent->opts) {
|
||||||
|
- endmntent(tab);
|
||||||
|
- free_mnt_list(list);
|
||||||
|
- return NULL;
|
||||||
|
+ if (ent->flags & MNTS_AUTOFS) {
|
||||||
|
+ if (strstr(mnt->mnt_opts, "indirect"))
|
||||||
|
+ ent->flags |= MNTS_INDIRECT;
|
||||||
|
+ else if (strstr(mnt->mnt_opts, "direct"))
|
||||||
|
+ ent->flags |= MNTS_DIRECT;
|
||||||
|
+ else if (strstr(mnt->mnt_opts, "offset"))
|
||||||
|
+ ent->flags |= MNTS_OFFSET;
|
||||||
|
}
|
||||||
|
- strcpy(ent->opts, mnt->mnt_opts);
|
||||||
|
}
|
||||||
|
endmntent(tab);
|
||||||
|
|
||||||
|
@@ -900,15 +888,6 @@ void free_mnt_list(struct mnt_list *list
|
||||||
|
if (this->path)
|
||||||
|
free(this->path);
|
||||||
|
|
||||||
|
- if (this->fs_name)
|
||||||
|
- free(this->fs_name);
|
||||||
|
-
|
||||||
|
- if (this->fs_type)
|
||||||
|
- free(this->fs_type);
|
||||||
|
-
|
||||||
|
- if (this->opts)
|
||||||
|
- free(this->opts);
|
||||||
|
-
|
||||||
|
free(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1028,22 +1007,11 @@ void tree_free_mnt_tree(struct mnt_list
|
||||||
|
list_del(&this->self);
|
||||||
|
|
||||||
|
free(this->path);
|
||||||
|
- free(this->fs_name);
|
||||||
|
- free(this->fs_type);
|
||||||
|
-
|
||||||
|
- if (this->opts)
|
||||||
|
- free(this->opts);
|
||||||
|
|
||||||
|
free(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(tree->path);
|
||||||
|
- free(tree->fs_name);
|
||||||
|
- free(tree->fs_type);
|
||||||
|
-
|
||||||
|
- if (tree->opts)
|
||||||
|
- free(tree->opts);
|
||||||
|
-
|
||||||
|
free(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1103,38 +1071,17 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
}
|
||||||
|
strcpy(ent->path, mnt->mnt_dir);
|
||||||
|
|
||||||
|
- ent->fs_name = malloc(strlen(mnt->mnt_fsname) + 1);
|
||||||
|
- if (!ent->fs_name) {
|
||||||
|
- free(ent->path);
|
||||||
|
- free(ent);
|
||||||
|
- endmntent(tab);
|
||||||
|
- tree_free_mnt_tree(tree);
|
||||||
|
- return NULL;
|
||||||
|
- }
|
||||||
|
- strcpy(ent->fs_name, mnt->mnt_fsname);
|
||||||
|
-
|
||||||
|
- ent->fs_type = malloc(strlen(mnt->mnt_type) + 1);
|
||||||
|
- if (!ent->fs_type) {
|
||||||
|
- free(ent->fs_name);
|
||||||
|
- free(ent->path);
|
||||||
|
- free(ent);
|
||||||
|
- endmntent(tab);
|
||||||
|
- tree_free_mnt_tree(tree);
|
||||||
|
- return NULL;
|
||||||
|
- }
|
||||||
|
- strcpy(ent->fs_type, mnt->mnt_type);
|
||||||
|
+ if (!strcmp(mnt->mnt_type, "autofs"))
|
||||||
|
+ ent->flags |= MNTS_AUTOFS;
|
||||||
|
|
||||||
|
- ent->opts = malloc(strlen(mnt->mnt_opts) + 1);
|
||||||
|
- if (!ent->opts) {
|
||||||
|
- free(ent->fs_type);
|
||||||
|
- free(ent->fs_name);
|
||||||
|
- free(ent->path);
|
||||||
|
- free(ent);
|
||||||
|
- endmntent(tab);
|
||||||
|
- tree_free_mnt_tree(tree);
|
||||||
|
- return NULL;
|
||||||
|
+ if (ent->flags & MNTS_AUTOFS) {
|
||||||
|
+ if (strstr(mnt->mnt_opts, "indirect"))
|
||||||
|
+ ent->flags |= MNTS_INDIRECT;
|
||||||
|
+ else if (strstr(mnt->mnt_opts, "direct"))
|
||||||
|
+ ent->flags |= MNTS_DIRECT;
|
||||||
|
+ else if (strstr(mnt->mnt_opts, "offset"))
|
||||||
|
+ ent->flags |= MNTS_OFFSET;
|
||||||
|
}
|
||||||
|
- strcpy(ent->opts, mnt->mnt_opts);
|
||||||
|
|
||||||
|
mptr = tree;
|
||||||
|
while (mptr) {
|
||||||
|
@@ -1347,17 +1294,13 @@ int tree_is_mounted(struct mnt_list *mnt
|
||||||
|
mptr = list_entry(p, struct mnt_list, entries);
|
||||||
|
|
||||||
|
if (type) {
|
||||||
|
- unsigned int autofs_fs;
|
||||||
|
-
|
||||||
|
- autofs_fs = !strcmp(mptr->fs_type, "autofs");
|
||||||
|
-
|
||||||
|
if (type & MNTS_REAL) {
|
||||||
|
- if (!autofs_fs) {
|
||||||
|
+ if (mptr->flags & MNTS_AUTOFS) {
|
||||||
|
mounted = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (type & MNTS_AUTOFS) {
|
||||||
|
- if (autofs_fs) {
|
||||||
|
+ if (mptr->flags & MNTS_AUTOFS) {
|
||||||
|
mounted = 1;
|
||||||
|
break;
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
autofs-5.1.5 - use ignore option for offset mounts as well
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The pseudo option "ignore" (that's used as a hint that applications
|
||||||
|
should ignore this mount when reporting a list of mounts) has been
|
||||||
|
added to direct and indirect mounts but hasn't been added to offset
|
||||||
|
mounts.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 10 ++++++++++
|
||||||
|
2 files changed, 11 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -61,6 +61,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix amd entry memory leak.
|
||||||
|
- fix unlink_mount_tree() not umounting mounts.
|
||||||
|
- add ignore mount option.
|
||||||
|
+- use ignore option for offset mounts as well.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -756,6 +756,16 @@ int mount_autofs_offset(struct autofs_po
|
||||||
|
mp->options = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
|
||||||
|
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
|
||||||
|
+ (get_kver_major() > 5))) {
|
||||||
|
+ char *tmp = realloc(mp->options, strlen(mp->options) + 7);
|
||||||
|
+ if (tmp) {
|
||||||
|
+ strcat(tmp, ",ignore");
|
||||||
|
+ mp->options = tmp;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(mountpoint, root);
|
@ -0,0 +1,53 @@
|
|||||||
|
autofs-5.1.5 - use local getmntent_r() in get_mnt_list()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Change get_mnt_list() to use the local getmntent_r() instead of
|
||||||
|
the glibc version so that if glibc is changed to support the
|
||||||
|
autofs "ignore" hint automount(8) won't be affected.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/mounts.c | 8 ++++----
|
||||||
|
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -73,6 +73,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use single unlink_umount_tree() for both direct and indirect mounts.
|
||||||
|
- move unlink_mount_tree() to lib/mounts.c.
|
||||||
|
- use local_getmntent_r() for unlink_mount_tree().
|
||||||
|
+- use local getmntent_r() in get_mnt_list().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -956,14 +956,14 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
if (!path || !pathlen || pathlen > PATH_MAX)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- tab = open_setmntent_r(_PROC_MOUNTS);
|
||||||
|
+ tab = open_fopen_r(_PROC_MOUNTS);
|
||||||
|
if (!tab) {
|
||||||
|
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
|
||||||
|
- logerr("setmntent: %s", estr);
|
||||||
|
+ logerr("fopen: %s", estr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- while ((mnt = getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
|
||||||
|
+ while ((mnt = local_getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
|
||||||
|
len = strlen(mnt->mnt_dir);
|
||||||
|
|
||||||
|
if ((!include && len <= pathlen) ||
|
||||||
|
@@ -1020,7 +1020,7 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
ent->flags |= MNTS_OFFSET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- endmntent(tab);
|
||||||
|
+ fclose(tab);
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
autofs-5.1.5 - use local getmntent_r in table_is_mounted()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Use the local_getmntent_r() funtion copied from glibc in the function
|
||||||
|
table_is_mounted() so that if glibc is changed to support the autofs
|
||||||
|
"ignore" hint automount(8) won't be affected.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/mounts.c | 8 ++++----
|
||||||
|
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -67,6 +67,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use mp instead of path in mnt_list entries.
|
||||||
|
- always use PROC_MOUNTS to make mount lists.
|
||||||
|
- add glibc getmntent_r().
|
||||||
|
+- use local getmntent_r in table_is_mounted().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -999,14 +999,14 @@ static int table_is_mounted(const char *
|
||||||
|
if (!mp || !mp_len || mp_len >= PATH_MAX)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- tab = open_setmntent_r(_PROC_MOUNTS);
|
||||||
|
+ tab = open_fopen_r(_PROC_MOUNTS);
|
||||||
|
if (!tab) {
|
||||||
|
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
|
||||||
|
- logerr("setmntent: %s", estr);
|
||||||
|
+ logerr("fopen: %s", estr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- while ((mnt = getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
|
||||||
|
+ while ((mnt = local_getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
|
||||||
|
size_t len = strlen(mnt->mnt_dir);
|
||||||
|
|
||||||
|
if (type) {
|
||||||
|
@@ -1028,7 +1028,7 @@ static int table_is_mounted(const char *
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- endmntent(tab);
|
||||||
|
+ fclose(tab);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
autofs-5.1.5 - use local getmntent_r() in tree_make_mnt_list()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Change tree_make_mnt_list() to use the local getmntent_r() instead of
|
||||||
|
the glibc version so that if glibc is changed to support the autofs
|
||||||
|
"ignore" hint automount(8) won't be affected.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/mounts.c | 8 ++++----
|
||||||
|
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -74,6 +74,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- move unlink_mount_tree() to lib/mounts.c.
|
||||||
|
- use local_getmntent_r() for unlink_mount_tree().
|
||||||
|
- use local getmntent_r() in get_mnt_list().
|
||||||
|
+- use local getmntent_r() in tree_make_mnt_list().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -1182,16 +1182,16 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
size_t plen;
|
||||||
|
int eq;
|
||||||
|
|
||||||
|
- tab = open_setmntent_r(_PROC_MOUNTS);
|
||||||
|
+ tab = open_fopen_r(_PROC_MOUNTS);
|
||||||
|
if (!tab) {
|
||||||
|
char *estr = strerror_r(errno, buf, PATH_MAX - 1);
|
||||||
|
- logerr("setmntent: %s", estr);
|
||||||
|
+ logerr("fopen: %s", estr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
plen = strlen(path);
|
||||||
|
|
||||||
|
- while ((mnt = getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
|
||||||
|
+ while ((mnt = local_getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
|
||||||
|
size_t len = strlen(mnt->mnt_dir);
|
||||||
|
|
||||||
|
/* Not matching path */
|
||||||
|
@@ -1283,7 +1283,7 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
if (!tree)
|
||||||
|
tree = ent;
|
||||||
|
}
|
||||||
|
- endmntent(tab);
|
||||||
|
+ fclose(tab);
|
||||||
|
|
||||||
|
return tree;
|
||||||
|
}
|
@ -0,0 +1,179 @@
|
|||||||
|
autofs-5.1.5 - use local_getmntent_r() for unlink_mount_tree()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Now that unlink_mount_tree() is located in a single location and
|
||||||
|
only one function is used for this, change it to use our local
|
||||||
|
getmntent_r() function so that if glibc is changed to support the
|
||||||
|
autofs "ignore" hint automount(8) won't be affected.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 24 ++++++------------------
|
||||||
|
daemon/indirect.c | 17 ++++++-----------
|
||||||
|
include/mounts.h | 2 +-
|
||||||
|
lib/mounts.c | 45 ++++++++++++++++++++++++++++++++++-----------
|
||||||
|
5 files changed, 48 insertions(+), 41 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -72,6 +72,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- don't use tree_is_mounted() for mounted checks.
|
||||||
|
- use single unlink_umount_tree() for both direct and indirect mounts.
|
||||||
|
- move unlink_mount_tree() to lib/mounts.c.
|
||||||
|
+- use local_getmntent_r() for unlink_mount_tree().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -286,8 +286,6 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
if (ret == 0)
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
- struct mnt_list *mnts;
|
||||||
|
-
|
||||||
|
if (ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
|
||||||
|
time_t tout = get_exp_timeout(ap, me->source);
|
||||||
|
int save_ioctlfd, ioctlfd;
|
||||||
|
@@ -313,22 +311,12 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- mnts = get_mnt_list(me->key, 1);
|
||||||
|
- if (mnts) {
|
||||||
|
- /*
|
||||||
|
- * A return of 1 indicates we successfully unlinked
|
||||||
|
- * the mount tree if there was one. A return of 0
|
||||||
|
- * indicates we failed to unlink the mount tree so
|
||||||
|
- * we have to return a failure.
|
||||||
|
- */
|
||||||
|
- ret = unlink_mount_tree(ap, mnts);
|
||||||
|
- free_mnt_list(mnts);
|
||||||
|
- if (!ret) {
|
||||||
|
- error(ap->logopt,
|
||||||
|
- "already mounted as other than autofs "
|
||||||
|
- "or failed to unlink entry in tree");
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
+ ret = unlink_mount_tree(ap, ap->path);
|
||||||
|
+ if (!ret) {
|
||||||
|
+ error(ap->logopt,
|
||||||
|
+ "already mounted as other than autofs "
|
||||||
|
+ "or failed to unlink entry in tree");
|
||||||
|
+ goto out_err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (me->ioctlfd != -1) {
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -50,7 +50,6 @@ static int do_mount_autofs_indirect(stru
|
||||||
|
const char *map_name = hosts_map_name;
|
||||||
|
const char *type;
|
||||||
|
struct stat st;
|
||||||
|
- struct mnt_list *mnts;
|
||||||
|
int ret;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
@@ -70,16 +69,12 @@ static int do_mount_autofs_indirect(stru
|
||||||
|
if (ret == 0)
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
- mnts = get_mnt_list(ap->path, 1);
|
||||||
|
- if (mnts) {
|
||||||
|
- ret = unlink_mount_tree(ap, mnts);
|
||||||
|
- free_mnt_list(mnts);
|
||||||
|
- if (!ret) {
|
||||||
|
- error(ap->logopt,
|
||||||
|
- "already mounted as other than autofs "
|
||||||
|
- "or failed to unlink entry in tree");
|
||||||
|
- goto out_err;
|
||||||
|
- }
|
||||||
|
+ ret = unlink_mount_tree(ap, ap->path);
|
||||||
|
+ if (!ret) {
|
||||||
|
+ error(ap->logopt,
|
||||||
|
+ "already mounted as other than autofs "
|
||||||
|
+ "or failed to unlink entry in tree");
|
||||||
|
+ goto out_err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -100,7 +100,7 @@ int ext_mount_add(struct list_head *, co
|
||||||
|
int ext_mount_remove(struct list_head *, const char *);
|
||||||
|
int ext_mount_inuse(const char *);
|
||||||
|
struct mnt_list *get_mnt_list(const char *path, int include);
|
||||||
|
-int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts);
|
||||||
|
+int unlink_mount_tree(struct autofs_point *ap, const char *mp);
|
||||||
|
void free_mnt_list(struct mnt_list *list);
|
||||||
|
int is_mounted(const char *mp, unsigned int type);
|
||||||
|
void tree_free_mnt_tree(struct mnt_list *tree);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -881,21 +881,44 @@ local_getmntent_r(FILE *tab, struct mnte
|
||||||
|
return mnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
|
||||||
|
+int unlink_mount_tree(struct autofs_point *ap, const char *mp)
|
||||||
|
{
|
||||||
|
- struct mnt_list *this;
|
||||||
|
- int rv, ret;
|
||||||
|
+ FILE *tab;
|
||||||
|
+ struct mntent *mnt;
|
||||||
|
+ struct mntent mnt_wrk;
|
||||||
|
+ char buf[PATH_MAX * 3];
|
||||||
|
+ unsigned int mp_len = strlen(mp);
|
||||||
|
+ int rv, ret = 1;
|
||||||
|
|
||||||
|
- ret = 1;
|
||||||
|
- this = mnts;
|
||||||
|
- while (this) {
|
||||||
|
- if (this->flags & MNTS_AUTOFS)
|
||||||
|
- rv = umount2(this->mp, MNT_DETACH);
|
||||||
|
+ tab = open_fopen_r(_PROC_MOUNTS);
|
||||||
|
+ if (!tab) {
|
||||||
|
+ char *estr = strerror_r(errno, buf, PATH_MAX - 1);
|
||||||
|
+ logerr("fopen: %s", estr);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ while ((mnt = local_getmntent_r(tab, &mnt_wrk, buf, PATH_MAX * 3))) {
|
||||||
|
+ unsigned int mnt_dir_len;
|
||||||
|
+ int is_autofs;
|
||||||
|
+
|
||||||
|
+ if (strncmp(mnt->mnt_dir, mp, mp_len))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ mnt_dir_len = strlen(mnt->mnt_dir);
|
||||||
|
+ is_autofs = !strcmp(mnt->mnt_type, "autofs");
|
||||||
|
+
|
||||||
|
+ if (mnt_dir_len == mp_len && !is_autofs) {
|
||||||
|
+ ret = 0;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (is_autofs)
|
||||||
|
+ rv = umount2(mnt->mnt_dir, MNT_DETACH);
|
||||||
|
else
|
||||||
|
- rv = spawn_umount(ap->logopt, "-l", this->mp, NULL);
|
||||||
|
+ rv = spawn_umount(ap->logopt, "-l", mnt->mnt_dir, NULL);
|
||||||
|
if (rv == -1) {
|
||||||
|
debug(ap->logopt,
|
||||||
|
- "can't unlink %s from mount tree", this->mp);
|
||||||
|
+ "can't unlink %s from mount tree", mnt->mnt_dir);
|
||||||
|
|
||||||
|
switch (errno) {
|
||||||
|
case EINVAL:
|
||||||
|
@@ -910,8 +933,8 @@ int unlink_mount_tree(struct autofs_poin
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- this = this->next;
|
||||||
|
}
|
||||||
|
+ fclose(tab);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
161
SOURCES/autofs-5.1.5-use-malloc-in-spawn_c.patch
Normal file
161
SOURCES/autofs-5.1.5-use-malloc-in-spawn_c.patch
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
autofs-5.1.5 - use malloc(3) in spawn.c
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Use malloc(3) in spawn.c functions instead of alloca(3) as a failure
|
||||||
|
return for this function is undefined.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/spawn.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------
|
||||||
|
2 files changed, 45 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -46,6 +46,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- add systemd service command line option.
|
||||||
|
- support strictexpire mount option.
|
||||||
|
- add NULL check for get_addr_string() return.
|
||||||
|
+- use malloc(3) in spawn.c.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/spawn.c
|
||||||
|
+++ autofs-5.1.4/daemon/spawn.c
|
||||||
|
@@ -521,22 +521,33 @@ int spawnv(unsigned logopt, const char *
|
||||||
|
int spawnl(unsigned logopt, const char *prog, ...)
|
||||||
|
{
|
||||||
|
va_list arg;
|
||||||
|
- int argc;
|
||||||
|
+ int argc, ret;
|
||||||
|
char **argv, **p;
|
||||||
|
+ unsigned int argv_len;
|
||||||
|
|
||||||
|
va_start(arg, prog);
|
||||||
|
for (argc = 1; va_arg(arg, char *); argc++);
|
||||||
|
va_end(arg);
|
||||||
|
|
||||||
|
- if (!(argv = alloca(sizeof(char *) * argc)))
|
||||||
|
+ argv_len = sizeof(char *) * (argc + 1);
|
||||||
|
+ argv = malloc(argv_len);
|
||||||
|
+ if (!argv) {
|
||||||
|
+ char buf[MAX_ERR_BUF];
|
||||||
|
+ char *estr = strerror_r(errno, buf, sizeof(buf));
|
||||||
|
+ crit(logopt, "malloc: %s", estr);
|
||||||
|
return -1;
|
||||||
|
+ }
|
||||||
|
+ memset(argv, 0, argv_len);
|
||||||
|
|
||||||
|
va_start(arg, prog);
|
||||||
|
p = argv;
|
||||||
|
while ((*p++ = va_arg(arg, char *)));
|
||||||
|
va_end(arg);
|
||||||
|
|
||||||
|
- return do_spawn(logopt, -1, SPAWN_OPT_NONE, prog, (const char **) argv);
|
||||||
|
+ ret = do_spawn(logopt, -1, SPAWN_OPT_NONE, prog, (const char **) argv);
|
||||||
|
+ free(argv);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int spawn_mount(unsigned logopt, ...)
|
||||||
|
@@ -554,6 +565,7 @@ int spawn_mount(unsigned logopt, ...)
|
||||||
|
int update_mtab = 1, ret, printed = 0;
|
||||||
|
unsigned int wait = defaults_get_mount_wait();
|
||||||
|
char buf[PATH_MAX + 1];
|
||||||
|
+ unsigned int argv_len;
|
||||||
|
|
||||||
|
/* If we use mount locking we can't validate the location */
|
||||||
|
#ifdef ENABLE_MOUNT_LOCKING
|
||||||
|
@@ -579,8 +591,15 @@ int spawn_mount(unsigned logopt, ...)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Alloc 1 extra slot in case we need to use the "-f" option */
|
||||||
|
- if (!(argv = alloca(sizeof(char *) * (argc + 2))))
|
||||||
|
+ argv_len = sizeof(char *) * (argc + 2);
|
||||||
|
+ argv = malloc(argv_len);
|
||||||
|
+ if (!argv) {
|
||||||
|
+ char buf[MAX_ERR_BUF];
|
||||||
|
+ char *estr = strerror_r(errno, buf, sizeof(buf));
|
||||||
|
+ crit(logopt, "malloc: %s", estr);
|
||||||
|
return -1;
|
||||||
|
+ }
|
||||||
|
+ memset(argv, 0, argv_len);
|
||||||
|
|
||||||
|
argv[0] = arg0;
|
||||||
|
|
||||||
|
@@ -655,6 +674,7 @@ int spawn_mount(unsigned logopt, ...)
|
||||||
|
umount(argv[argc]);
|
||||||
|
ret = MNT_FORCE_FAIL;
|
||||||
|
}
|
||||||
|
+ free(argv);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@@ -683,6 +703,7 @@ int spawn_bind_mount(unsigned logopt, ..
|
||||||
|
int update_mtab = 1, ret, printed = 0;
|
||||||
|
unsigned int wait = defaults_get_mount_wait();
|
||||||
|
char buf[PATH_MAX + 1];
|
||||||
|
+ unsigned int argv_len;
|
||||||
|
|
||||||
|
/* If we use mount locking we can't validate the location */
|
||||||
|
#ifdef ENABLE_MOUNT_LOCKING
|
||||||
|
@@ -711,8 +732,15 @@ int spawn_bind_mount(unsigned logopt, ..
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!(argv = alloca(sizeof(char *) * (argc + 2))))
|
||||||
|
+ argv_len = sizeof(char *) * (argc + 2);
|
||||||
|
+ argv = malloc(argv_len);
|
||||||
|
+ if (!argv) {
|
||||||
|
+ char buf[MAX_ERR_BUF];
|
||||||
|
+ char *estr = strerror_r(errno, buf, sizeof(buf));
|
||||||
|
+ crit(logopt, "malloc: %s", estr);
|
||||||
|
return -1;
|
||||||
|
+ }
|
||||||
|
+ memset(argv, 0, argv_len);
|
||||||
|
|
||||||
|
argv[0] = arg0;
|
||||||
|
argv[1] = bind;
|
||||||
|
@@ -774,6 +802,7 @@ int spawn_bind_mount(unsigned logopt, ..
|
||||||
|
umount(argv[argc]);
|
||||||
|
ret = MNT_FORCE_FAIL;
|
||||||
|
}
|
||||||
|
+ free(argv);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@@ -796,6 +825,7 @@ int spawn_umount(unsigned logopt, ...)
|
||||||
|
int update_mtab = 1, ret, printed = 0;
|
||||||
|
unsigned int wait = defaults_get_umount_wait();
|
||||||
|
char buf[PATH_MAX + 1];
|
||||||
|
+ unsigned int argv_len;
|
||||||
|
|
||||||
|
#ifdef ENABLE_MOUNT_LOCKING
|
||||||
|
options = SPAWN_OPT_LOCK;
|
||||||
|
@@ -821,8 +851,15 @@ int spawn_umount(unsigned logopt, ...)
|
||||||
|
if (arg_c)
|
||||||
|
argc++;;
|
||||||
|
|
||||||
|
- if (!(argv = alloca(sizeof(char *) * (argc + 1))))
|
||||||
|
+ argv_len = sizeof(char *) * (argc + 1);
|
||||||
|
+ argv = malloc(argv_len);
|
||||||
|
+ if (!argv) {
|
||||||
|
+ char buf[MAX_ERR_BUF];
|
||||||
|
+ char *estr = strerror_r(errno, buf, sizeof(buf));
|
||||||
|
+ crit(logopt, "malloc: %s", estr);
|
||||||
|
return -1;
|
||||||
|
+ }
|
||||||
|
+ memset(argv, 0, argv_len);
|
||||||
|
|
||||||
|
p = argv;
|
||||||
|
*p++ = arg0;
|
||||||
|
@@ -870,6 +907,7 @@ int spawn_umount(unsigned logopt, ...)
|
||||||
|
"and /etc/mtab will differ");
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
+ free(argv);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
@ -0,0 +1,436 @@
|
|||||||
|
autofs-5.1.5 - use mp instead of path in mnt_list entries
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Use the simpler, more instructive mp instead of path in the
|
||||||
|
mnt_list structure.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
daemon/direct.c | 18 ++++++-------
|
||||||
|
daemon/indirect.c | 22 ++++++++--------
|
||||||
|
include/mounts.h | 4 +--
|
||||||
|
lib/mounts.c | 70 +++++++++++++++++++++++++++---------------------------
|
||||||
|
5 files changed, 58 insertions(+), 57 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -64,6 +64,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use ignore option for offset mounts as well.
|
||||||
|
- add config option for "ignore" mount option
|
||||||
|
- use bit flags for autofs mount types in mnt_list.
|
||||||
|
+- use mp instead of path in mnt_list entries.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -272,12 +272,12 @@ static int unlink_mount_tree(struct auto
|
||||||
|
mnt = list_entry(p, struct mnt_list, list);
|
||||||
|
|
||||||
|
if (mnt->flags & MNTS_AUTOFS)
|
||||||
|
- rv = umount2(mnt->path, MNT_DETACH);
|
||||||
|
+ rv = umount2(mnt->mp, MNT_DETACH);
|
||||||
|
else
|
||||||
|
- rv = spawn_umount(ap->logopt, "-l", mnt->path, NULL);
|
||||||
|
+ rv = spawn_umount(ap->logopt, "-l", mnt->mp, NULL);
|
||||||
|
if (rv == -1) {
|
||||||
|
debug(ap->logopt,
|
||||||
|
- "can't unlink %s from mount tree", mnt->path);
|
||||||
|
+ "can't unlink %s from mount tree", mnt->mp);
|
||||||
|
|
||||||
|
switch (errno) {
|
||||||
|
case EINVAL:
|
||||||
|
@@ -920,7 +920,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
*/
|
||||||
|
pthread_cleanup_push(master_source_lock_cleanup, ap->entry);
|
||||||
|
master_source_readlock(ap->entry);
|
||||||
|
- me = lookup_source_mapent(ap, next->path, LKP_DISTINCT);
|
||||||
|
+ me = lookup_source_mapent(ap, next->mp, LKP_DISTINCT);
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
if (!me)
|
||||||
|
continue;
|
||||||
|
@@ -937,7 +937,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
*/
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
||||||
|
if (next->flags & MNTS_INDIRECT) {
|
||||||
|
- master_notify_submount(ap, next->path, ap->state);
|
||||||
|
+ master_notify_submount(ap, next->mp, ap->state);
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -968,7 +968,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
cache_writelock(me->mc);
|
||||||
|
if (me->ioctlfd != -1 &&
|
||||||
|
fstat(me->ioctlfd, &st) != -1 &&
|
||||||
|
- !count_mounts(ap, next->path, st.st_dev)) {
|
||||||
|
+ !count_mounts(ap, next->mp, st.st_dev)) {
|
||||||
|
ops->close(ap->logopt, me->ioctlfd);
|
||||||
|
me->ioctlfd = -1;
|
||||||
|
cache_unlock(me->mc);
|
||||||
|
@@ -979,7 +979,7 @@ void *expire_proc_direct(void *arg)
|
||||||
|
|
||||||
|
ioctlfd = me->ioctlfd;
|
||||||
|
|
||||||
|
- ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
|
||||||
|
+ ret = ops->expire(ap->logopt, ioctlfd, next->mp, how);
|
||||||
|
if (ret) {
|
||||||
|
left++;
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
@@ -1002,10 +1002,10 @@ void *expire_proc_direct(void *arg)
|
||||||
|
if (ap->state == ST_EXPIRE || ap->state == ST_PRUNE)
|
||||||
|
pthread_testcancel();
|
||||||
|
|
||||||
|
- debug(ap->logopt, "send expire to trigger %s", next->path);
|
||||||
|
+ debug(ap->logopt, "send expire to trigger %s", next->mp);
|
||||||
|
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
||||||
|
- ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
|
||||||
|
+ ret = ops->expire(ap->logopt, ioctlfd, next->mp, how);
|
||||||
|
if (ret)
|
||||||
|
left++;
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -49,12 +49,12 @@ static int unlink_mount_tree(struct auto
|
||||||
|
this = mnts;
|
||||||
|
while (this) {
|
||||||
|
if (this->flags & MNTS_AUTOFS)
|
||||||
|
- rv = umount2(this->path, MNT_DETACH);
|
||||||
|
+ rv = umount2(this->mp, MNT_DETACH);
|
||||||
|
else
|
||||||
|
- rv = spawn_umount(ap->logopt, "-l", this->path, NULL);
|
||||||
|
+ rv = spawn_umount(ap->logopt, "-l", this->mp, NULL);
|
||||||
|
if (rv == -1) {
|
||||||
|
debug(ap->logopt,
|
||||||
|
- "can't unlink %s from mount tree", this->path);
|
||||||
|
+ "can't unlink %s from mount tree", this->mp);
|
||||||
|
|
||||||
|
switch (errno) {
|
||||||
|
case EINVAL:
|
||||||
|
@@ -446,7 +446,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
*/
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
||||||
|
if (next->flags & MNTS_INDIRECT)
|
||||||
|
- master_notify_submount(ap, next->path, ap->state);
|
||||||
|
+ master_notify_submount(ap, next->mp, ap->state);
|
||||||
|
else if (next->flags & MNTS_OFFSET) {
|
||||||
|
struct map_source *map;
|
||||||
|
struct mapent_cache *mc = NULL;
|
||||||
|
@@ -454,13 +454,13 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
/* It's got a mount, deal with in the outer loop */
|
||||||
|
- if (is_mounted(_PATH_MOUNTED, next->path, MNTS_REAL)) {
|
||||||
|
+ if (is_mounted(_PATH_MOUNTED, next->mp, MNTS_REAL)) {
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Don't touch submounts */
|
||||||
|
- if (master_find_submount(ap, next->path)) {
|
||||||
|
+ if (master_find_submount(ap, next->mp)) {
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@@ -471,7 +471,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
while (map) {
|
||||||
|
mc = map->mc;
|
||||||
|
cache_writelock(mc);
|
||||||
|
- me = cache_lookup_distinct(mc, next->path);
|
||||||
|
+ me = cache_lookup_distinct(mc, next->mp);
|
||||||
|
if (me)
|
||||||
|
break;
|
||||||
|
cache_unlock(mc);
|
||||||
|
@@ -513,7 +513,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
* If the mount corresponds to an offset trigger then
|
||||||
|
* the key is the path, otherwise it's the last component.
|
||||||
|
*/
|
||||||
|
- ind_key = strrchr(next->path, '/');
|
||||||
|
+ ind_key = strrchr(next->mp, '/');
|
||||||
|
if (ind_key)
|
||||||
|
ind_key++;
|
||||||
|
|
||||||
|
@@ -526,7 +526,7 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
*/
|
||||||
|
pthread_cleanup_push(master_source_lock_cleanup, ap->entry);
|
||||||
|
master_source_readlock(ap->entry);
|
||||||
|
- me = lookup_source_mapent(ap, next->path, LKP_DISTINCT);
|
||||||
|
+ me = lookup_source_mapent(ap, next->mp, LKP_DISTINCT);
|
||||||
|
if (!me && ind_key)
|
||||||
|
me = lookup_source_mapent(ap, ind_key, LKP_NORMAL);
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
@@ -538,10 +538,10 @@ void *expire_proc_indirect(void *arg)
|
||||||
|
cache_unlock(me->mc);
|
||||||
|
}
|
||||||
|
|
||||||
|
- debug(ap->logopt, "expire %s", next->path);
|
||||||
|
+ debug(ap->logopt, "expire %s", next->mp);
|
||||||
|
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state);
|
||||||
|
- ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
|
||||||
|
+ ret = ops->expire(ap->logopt, ioctlfd, next->mp, how);
|
||||||
|
if (ret)
|
||||||
|
left++;
|
||||||
|
pthread_setcancelstate(cur_state, NULL);
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -52,7 +52,7 @@ extern const unsigned int t_offset;
|
||||||
|
struct mapent;
|
||||||
|
|
||||||
|
struct mnt_list {
|
||||||
|
- char *path;
|
||||||
|
+ char *mp;
|
||||||
|
unsigned int flags;
|
||||||
|
/*
|
||||||
|
* List operations ie. get_mnt_list.
|
||||||
|
@@ -101,7 +101,7 @@ int ext_mount_remove(struct list_head *,
|
||||||
|
int ext_mount_inuse(const char *);
|
||||||
|
struct mnt_list *get_mnt_list(const char *table, const char *path, int include);
|
||||||
|
void free_mnt_list(struct mnt_list *list);
|
||||||
|
-int is_mounted(const char *table, const char *path, unsigned int type);
|
||||||
|
+int is_mounted(const char *table, const char *mp, unsigned int type);
|
||||||
|
void tree_free_mnt_tree(struct mnt_list *tree);
|
||||||
|
struct mnt_list *tree_make_mnt_tree(const char *table, const char *path);
|
||||||
|
int tree_get_mnt_list(struct mnt_list *mnts, struct list_head *list, const char *path, int include);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -817,8 +817,8 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
strncmp(mnt->mnt_dir, path, pathlen) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- /* Not a subdirectory of requested path ? */
|
||||||
|
- /* pathlen == 1 => everything is subdir */
|
||||||
|
+ /* Not a subdirectory of requested mp? */
|
||||||
|
+ /* mp_len == 1 => everything is subdir */
|
||||||
|
if (pathlen > 1 && len > pathlen &&
|
||||||
|
mnt->mnt_dir[pathlen] != '/')
|
||||||
|
continue;
|
||||||
|
@@ -834,7 +834,7 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
mptr = list;
|
||||||
|
last = NULL;
|
||||||
|
while (mptr) {
|
||||||
|
- if (len >= strlen(mptr->path))
|
||||||
|
+ if (len >= strlen(mptr->mp))
|
||||||
|
break;
|
||||||
|
last = mptr;
|
||||||
|
mptr = mptr->next;
|
||||||
|
@@ -847,13 +847,13 @@ struct mnt_list *get_mnt_list(const char
|
||||||
|
|
||||||
|
ent->next = mptr;
|
||||||
|
|
||||||
|
- ent->path = malloc(len + 1);
|
||||||
|
- if (!ent->path) {
|
||||||
|
+ ent->mp = malloc(len + 1);
|
||||||
|
+ if (!ent->mp) {
|
||||||
|
endmntent(tab);
|
||||||
|
free_mnt_list(list);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
- strcpy(ent->path, mnt->mnt_dir);
|
||||||
|
+ strcpy(ent->mp, mnt->mnt_dir);
|
||||||
|
|
||||||
|
if (!strcmp(mnt->mnt_type, "autofs"))
|
||||||
|
ent->flags |= MNTS_AUTOFS;
|
||||||
|
@@ -885,23 +885,23 @@ void free_mnt_list(struct mnt_list *list
|
||||||
|
|
||||||
|
next = this->next;
|
||||||
|
|
||||||
|
- if (this->path)
|
||||||
|
- free(this->path);
|
||||||
|
+ if (this->mp)
|
||||||
|
+ free(this->mp);
|
||||||
|
|
||||||
|
free(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int table_is_mounted(const char *table, const char *path, unsigned int type)
|
||||||
|
+static int table_is_mounted(const char *table, const char *mp, unsigned int type)
|
||||||
|
{
|
||||||
|
struct mntent *mnt;
|
||||||
|
struct mntent mnt_wrk;
|
||||||
|
char buf[PATH_MAX * 3];
|
||||||
|
- size_t pathlen = strlen(path);
|
||||||
|
+ size_t mp_len = strlen(mp);
|
||||||
|
FILE *tab;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
- if (!path || !pathlen || pathlen >= PATH_MAX)
|
||||||
|
+ if (!mp || !mp_len || mp_len >= PATH_MAX)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
tab = open_setmntent_r(table);
|
||||||
|
@@ -928,7 +928,7 @@ static int table_is_mounted(const char *
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (pathlen == len && !strncmp(path, mnt->mnt_dir, pathlen)) {
|
||||||
|
+ if (mp_len == len && !strncmp(mp, mnt->mnt_dir, mp_len)) {
|
||||||
|
ret = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -938,7 +938,7 @@ static int table_is_mounted(const char *
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int ioctl_is_mounted(const char *table, const char *path, unsigned int type)
|
||||||
|
+static int ioctl_is_mounted(const char *table, const char *mp, unsigned int type)
|
||||||
|
{
|
||||||
|
struct ioctl_ops *ops = get_ioctl_ops();
|
||||||
|
unsigned int mounted;
|
||||||
|
@@ -947,9 +947,9 @@ static int ioctl_is_mounted(const char *
|
||||||
|
/* If the ioctl fails fall back to the potentially resource
|
||||||
|
* intensive mount table check.
|
||||||
|
*/
|
||||||
|
- ret = ops->ismountpoint(LOGOPT_NONE, -1, path, &mounted);
|
||||||
|
+ ret = ops->ismountpoint(LOGOPT_NONE, -1, mp, &mounted);
|
||||||
|
if (ret == -1)
|
||||||
|
- return table_is_mounted(table, path, type);
|
||||||
|
+ return table_is_mounted(table, mp, type);
|
||||||
|
|
||||||
|
if (mounted) {
|
||||||
|
switch (type) {
|
||||||
|
@@ -964,14 +964,14 @@ static int ioctl_is_mounted(const char *
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int is_mounted(const char *table, const char *path, unsigned int type)
|
||||||
|
+int is_mounted(const char *table, const char *mp, unsigned int type)
|
||||||
|
{
|
||||||
|
struct ioctl_ops *ops = get_ioctl_ops();
|
||||||
|
|
||||||
|
if (ops->ismountpoint)
|
||||||
|
- return ioctl_is_mounted(table, path, type);
|
||||||
|
+ return ioctl_is_mounted(table, mp, type);
|
||||||
|
else
|
||||||
|
- return table_is_mounted(table, path, type);
|
||||||
|
+ return table_is_mounted(table, mp, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1006,12 +1006,12 @@ void tree_free_mnt_tree(struct mnt_list
|
||||||
|
|
||||||
|
list_del(&this->self);
|
||||||
|
|
||||||
|
- free(this->path);
|
||||||
|
+ free(this->mp);
|
||||||
|
|
||||||
|
free(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
- free(tree->path);
|
||||||
|
+ free(tree->mp);
|
||||||
|
free(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1062,14 +1062,14 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
INIT_LIST_HEAD(&ent->entries);
|
||||||
|
INIT_LIST_HEAD(&ent->sublist);
|
||||||
|
|
||||||
|
- ent->path = malloc(len + 1);
|
||||||
|
- if (!ent->path) {
|
||||||
|
+ ent->mp = malloc(len + 1);
|
||||||
|
+ if (!ent->mp) {
|
||||||
|
endmntent(tab);
|
||||||
|
free(ent);
|
||||||
|
tree_free_mnt_tree(tree);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
- strcpy(ent->path, mnt->mnt_dir);
|
||||||
|
+ strcpy(ent->mp, mnt->mnt_dir);
|
||||||
|
|
||||||
|
if (!strcmp(mnt->mnt_type, "autofs"))
|
||||||
|
ent->flags |= MNTS_AUTOFS;
|
||||||
|
@@ -1085,8 +1085,8 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
|
||||||
|
mptr = tree;
|
||||||
|
while (mptr) {
|
||||||
|
- int elen = strlen(ent->path);
|
||||||
|
- int mlen = strlen(mptr->path);
|
||||||
|
+ int elen = strlen(ent->mp);
|
||||||
|
+ int mlen = strlen(mptr->mp);
|
||||||
|
|
||||||
|
if (elen < mlen) {
|
||||||
|
if (mptr->left) {
|
||||||
|
@@ -1106,7 +1106,7 @@ struct mnt_list *tree_make_mnt_tree(cons
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- eq = strcmp(ent->path, mptr->path);
|
||||||
|
+ eq = strcmp(ent->mp, mptr->mp);
|
||||||
|
if (eq < 0) {
|
||||||
|
if (mptr->left)
|
||||||
|
mptr = mptr->left;
|
||||||
|
@@ -1146,7 +1146,7 @@ int tree_get_mnt_list(struct mnt_list *m
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
plen = strlen(path);
|
||||||
|
- mlen = strlen(mnts->path);
|
||||||
|
+ mlen = strlen(mnts->mp);
|
||||||
|
if (mlen < plen)
|
||||||
|
return tree_get_mnt_list(mnts->right, list, path, include);
|
||||||
|
else {
|
||||||
|
@@ -1155,10 +1155,10 @@ int tree_get_mnt_list(struct mnt_list *m
|
||||||
|
tree_get_mnt_list(mnts->left, list, path, include);
|
||||||
|
|
||||||
|
if ((!include && mlen <= plen) ||
|
||||||
|
- strncmp(mnts->path, path, plen))
|
||||||
|
+ strncmp(mnts->mp, path, plen))
|
||||||
|
goto skip;
|
||||||
|
|
||||||
|
- if (plen > 1 && mlen > plen && mnts->path[plen] != '/')
|
||||||
|
+ if (plen > 1 && mlen > plen && mnts->mp[plen] != '/')
|
||||||
|
goto skip;
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&mnts->list);
|
||||||
|
@@ -1193,7 +1193,7 @@ int tree_get_mnt_sublist(struct mnt_list
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
plen = strlen(path);
|
||||||
|
- mlen = strlen(mnts->path);
|
||||||
|
+ mlen = strlen(mnts->mp);
|
||||||
|
if (mlen < plen)
|
||||||
|
return tree_get_mnt_sublist(mnts->right, list, path, include);
|
||||||
|
else {
|
||||||
|
@@ -1202,10 +1202,10 @@ int tree_get_mnt_sublist(struct mnt_list
|
||||||
|
tree_get_mnt_sublist(mnts->left, list, path, include);
|
||||||
|
|
||||||
|
if ((!include && mlen <= plen) ||
|
||||||
|
- strncmp(mnts->path, path, plen))
|
||||||
|
+ strncmp(mnts->mp, path, plen))
|
||||||
|
goto skip;
|
||||||
|
|
||||||
|
- if (plen > 1 && mlen > plen && mnts->path[plen] != '/')
|
||||||
|
+ if (plen > 1 && mlen > plen && mnts->mp[plen] != '/')
|
||||||
|
goto skip;
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&mnts->sublist);
|
||||||
|
@@ -1237,7 +1237,7 @@ int tree_find_mnt_ents(struct mnt_list *
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
plen = strlen(path);
|
||||||
|
- mlen = strlen(mnts->path);
|
||||||
|
+ mlen = strlen(mnts->mp);
|
||||||
|
if (mlen < plen)
|
||||||
|
return tree_find_mnt_ents(mnts->right, list, path);
|
||||||
|
else if (mlen > plen)
|
||||||
|
@@ -1247,7 +1247,7 @@ int tree_find_mnt_ents(struct mnt_list *
|
||||||
|
|
||||||
|
tree_find_mnt_ents(mnts->left, list, path);
|
||||||
|
|
||||||
|
- if (!strcmp(mnts->path, path)) {
|
||||||
|
+ if (!strcmp(mnts->mp, path)) {
|
||||||
|
INIT_LIST_HEAD(&mnts->entries);
|
||||||
|
list_add(&mnts->entries, list);
|
||||||
|
}
|
||||||
|
@@ -1258,7 +1258,7 @@ int tree_find_mnt_ents(struct mnt_list *
|
||||||
|
|
||||||
|
this = list_entry(p, struct mnt_list, self);
|
||||||
|
|
||||||
|
- if (!strcmp(this->path, path)) {
|
||||||
|
+ if (!strcmp(this->mp, path)) {
|
||||||
|
INIT_LIST_HEAD(&this->entries);
|
||||||
|
list_add(&this->entries, list);
|
||||||
|
}
|
@ -0,0 +1,271 @@
|
|||||||
|
autofs-5.1.5 - use single unlink_umount_tree() for both direct and indirect mounts
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Use the same function, unlink_umount_tree(), for forced unlink of mounts
|
||||||
|
for both indirect and direct mounts.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
daemon/direct.c | 96 +++++++++++++---------------------------------------
|
||||||
|
daemon/indirect.c | 2 -
|
||||||
|
daemon/state.c | 17 +--------
|
||||||
|
include/automount.h | 2 -
|
||||||
|
5 files changed, 30 insertions(+), 88 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -70,6 +70,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use local getmntent_r in table_is_mounted().
|
||||||
|
- refactor unlink_active_mounts() in direct.c.
|
||||||
|
- don't use tree_is_mounted() for mounted checks.
|
||||||
|
+- use single unlink_umount_tree() for both direct and indirect mounts.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -49,6 +49,8 @@ pthread_key_t key_mnt_direct_params;
|
||||||
|
pthread_key_t key_mnt_offset_params;
|
||||||
|
pthread_once_t key_mnt_params_once = PTHREAD_ONCE_INIT;
|
||||||
|
|
||||||
|
+int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts);
|
||||||
|
+
|
||||||
|
static void key_mnt_params_destroy(void *arg)
|
||||||
|
{
|
||||||
|
struct mnt_params *mp;
|
||||||
|
@@ -256,64 +258,8 @@ done:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int unlink_mount_tree(struct autofs_point *ap, struct list_head *list)
|
||||||
|
-{
|
||||||
|
- struct list_head *p;
|
||||||
|
- int rv, ret;
|
||||||
|
-
|
||||||
|
- ret = 1;
|
||||||
|
- list_for_each(p, list) {
|
||||||
|
- struct mnt_list *mnt;
|
||||||
|
-
|
||||||
|
- mnt = list_entry(p, struct mnt_list, list);
|
||||||
|
-
|
||||||
|
- if (mnt->flags & MNTS_AUTOFS)
|
||||||
|
- rv = umount2(mnt->mp, MNT_DETACH);
|
||||||
|
- else
|
||||||
|
- rv = spawn_umount(ap->logopt, "-l", mnt->mp, NULL);
|
||||||
|
- if (rv == -1) {
|
||||||
|
- debug(ap->logopt,
|
||||||
|
- "can't unlink %s from mount tree", mnt->mp);
|
||||||
|
-
|
||||||
|
- switch (errno) {
|
||||||
|
- case EINVAL:
|
||||||
|
- warn(ap->logopt,
|
||||||
|
- "bad superblock or not mounted");
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- case ENOENT:
|
||||||
|
- case EFAULT:
|
||||||
|
- ret = 0;
|
||||||
|
- warn(ap->logopt, "bad path for mount");
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- return ret;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static int unlink_active_mounts(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me)
|
||||||
|
-{
|
||||||
|
- struct list_head list;
|
||||||
|
-
|
||||||
|
- INIT_LIST_HEAD(&list);
|
||||||
|
-
|
||||||
|
- if (!tree_get_mnt_list(mnts, &list, me->key, 1))
|
||||||
|
- return 1;
|
||||||
|
-
|
||||||
|
- if (!unlink_mount_tree(ap, &list)) {
|
||||||
|
- debug(ap->logopt,
|
||||||
|
- "already mounted as other than autofs "
|
||||||
|
- "or failed to unlink entry in tree");
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return 1;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
int do_mount_autofs_direct(struct autofs_point *ap,
|
||||||
|
- struct mnt_list *mnts, struct mapent *me,
|
||||||
|
- time_t timeout)
|
||||||
|
+ struct mapent *me, time_t timeout)
|
||||||
|
{
|
||||||
|
const char *str_direct = mount_type_str(t_direct);
|
||||||
|
struct ioctl_ops *ops = get_ioctl_ops();
|
||||||
|
@@ -342,6 +288,8 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
if (ret == 0)
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
+ struct mnt_list *mnts;
|
||||||
|
+
|
||||||
|
if (ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
|
||||||
|
time_t tout = get_exp_timeout(ap, me->source);
|
||||||
|
int save_ioctlfd, ioctlfd;
|
||||||
|
@@ -367,15 +315,23 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * A return of 1 indicates we successfully unlinked
|
||||||
|
- * the mount tree if there was one. A return of 0
|
||||||
|
- * indicates we failed to unlink the mount tree so
|
||||||
|
- * we have to return a failure.
|
||||||
|
- */
|
||||||
|
- ret = unlink_active_mounts(ap, mnts, me);
|
||||||
|
- if (!ret)
|
||||||
|
- return -1;
|
||||||
|
+ mnts = get_mnt_list(me->key, 1);
|
||||||
|
+ if (mnts) {
|
||||||
|
+ /*
|
||||||
|
+ * A return of 1 indicates we successfully unlinked
|
||||||
|
+ * the mount tree if there was one. A return of 0
|
||||||
|
+ * indicates we failed to unlink the mount tree so
|
||||||
|
+ * we have to return a failure.
|
||||||
|
+ */
|
||||||
|
+ ret = unlink_mount_tree(ap, mnts);
|
||||||
|
+ free_mnt_list(mnts);
|
||||||
|
+ if (!ret) {
|
||||||
|
+ error(ap->logopt,
|
||||||
|
+ "already mounted as other than autofs "
|
||||||
|
+ "or failed to unlink entry in tree");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (me->ioctlfd != -1) {
|
||||||
|
error(ap->logopt, "active direct mount %s", me->key);
|
||||||
|
@@ -494,7 +450,6 @@ int mount_autofs_direct(struct autofs_po
|
||||||
|
struct map_source *map;
|
||||||
|
struct mapent_cache *nc, *mc;
|
||||||
|
struct mapent *me, *ne, *nested;
|
||||||
|
- struct mnt_list *mnts;
|
||||||
|
time_t now = monotonic_time(NULL);
|
||||||
|
|
||||||
|
if (strcmp(ap->path, "/-")) {
|
||||||
|
@@ -510,8 +465,6 @@ int mount_autofs_direct(struct autofs_po
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- mnts = tree_make_mnt_tree("/");
|
||||||
|
- pthread_cleanup_push(mnts_cleanup, mnts);
|
||||||
|
pthread_cleanup_push(master_source_lock_cleanup, ap->entry);
|
||||||
|
master_source_readlock(ap->entry);
|
||||||
|
nc = ap->entry->master->nc;
|
||||||
|
@@ -539,7 +492,7 @@ int mount_autofs_direct(struct autofs_po
|
||||||
|
if (ne) {
|
||||||
|
if (map->master_line < ne->age) {
|
||||||
|
/* TODO: check return, locking me */
|
||||||
|
- do_mount_autofs_direct(ap, mnts, me, timeout);
|
||||||
|
+ do_mount_autofs_direct(ap, me, timeout);
|
||||||
|
}
|
||||||
|
me = cache_enumerate(mc, me);
|
||||||
|
continue;
|
||||||
|
@@ -556,7 +509,7 @@ int mount_autofs_direct(struct autofs_po
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: check return, locking me */
|
||||||
|
- do_mount_autofs_direct(ap, mnts, me, timeout);
|
||||||
|
+ do_mount_autofs_direct(ap, me, timeout);
|
||||||
|
|
||||||
|
me = cache_enumerate(mc, me);
|
||||||
|
}
|
||||||
|
@@ -565,7 +518,6 @@ int mount_autofs_direct(struct autofs_po
|
||||||
|
}
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
- pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -40,7 +40,7 @@
|
||||||
|
/* Attribute to create detached thread */
|
||||||
|
extern pthread_attr_t th_attr_detached;
|
||||||
|
|
||||||
|
-static int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
|
||||||
|
+int unlink_mount_tree(struct autofs_point *ap, struct mnt_list *mnts)
|
||||||
|
{
|
||||||
|
struct mnt_list *this;
|
||||||
|
int rv, ret;
|
||||||
|
--- autofs-5.1.4.orig/daemon/state.c
|
||||||
|
+++ autofs-5.1.4/daemon/state.c
|
||||||
|
@@ -350,14 +350,7 @@ static void do_readmap_cleanup(void *arg
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void tree_mnts_cleanup(void *arg)
|
||||||
|
-{
|
||||||
|
- struct mnt_list *mnts = (struct mnt_list *) arg;
|
||||||
|
- tree_free_mnt_tree(mnts);
|
||||||
|
- return;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void do_readmap_mount(struct autofs_point *ap, struct mnt_list *mnts,
|
||||||
|
+static void do_readmap_mount(struct autofs_point *ap,
|
||||||
|
struct map_source *map, struct mapent *me, time_t now)
|
||||||
|
{
|
||||||
|
struct mapent_cache *nc;
|
||||||
|
@@ -444,7 +437,7 @@ static void do_readmap_mount(struct auto
|
||||||
|
debug(ap->logopt,
|
||||||
|
"%s is mounted", me->key);
|
||||||
|
} else
|
||||||
|
- do_mount_autofs_direct(ap, mnts, me, get_exp_timeout(ap, map));
|
||||||
|
+ do_mount_autofs_direct(ap, me, get_exp_timeout(ap, map));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -455,7 +448,6 @@ static void *do_readmap(void *arg)
|
||||||
|
struct map_source *map;
|
||||||
|
struct mapent_cache *nc, *mc;
|
||||||
|
struct readmap_args *ra;
|
||||||
|
- struct mnt_list *mnts;
|
||||||
|
int status;
|
||||||
|
time_t now;
|
||||||
|
|
||||||
|
@@ -499,8 +491,6 @@ static void *do_readmap(void *arg)
|
||||||
|
struct mapent *me;
|
||||||
|
unsigned int append_alarm = !ap->exp_runfreq;
|
||||||
|
|
||||||
|
- mnts = tree_make_mnt_tree("/");
|
||||||
|
- pthread_cleanup_push(tree_mnts_cleanup, mnts);
|
||||||
|
nc = ap->entry->master->nc;
|
||||||
|
cache_readlock(nc);
|
||||||
|
pthread_cleanup_push(cache_lock_cleanup, nc);
|
||||||
|
@@ -518,7 +508,7 @@ static void *do_readmap(void *arg)
|
||||||
|
cache_readlock(mc);
|
||||||
|
me = cache_enumerate(mc, NULL);
|
||||||
|
while (me) {
|
||||||
|
- do_readmap_mount(ap, mnts, map, me, now);
|
||||||
|
+ do_readmap_mount(ap, map, me, now);
|
||||||
|
me = cache_enumerate(mc, me);
|
||||||
|
}
|
||||||
|
lookup_prune_one_cache(ap, map->mc, now);
|
||||||
|
@@ -538,7 +528,6 @@ static void *do_readmap(void *arg)
|
||||||
|
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
- pthread_cleanup_pop(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -606,7 +606,7 @@ void *expire_proc_indirect(void *);
|
||||||
|
void *expire_proc_direct(void *);
|
||||||
|
int expire_offsets_direct(struct autofs_point *ap, struct mapent *me, int now);
|
||||||
|
int mount_autofs_indirect(struct autofs_point *ap, const char *root);
|
||||||
|
-int do_mount_autofs_direct(struct autofs_point *ap, struct mnt_list *mnts, struct mapent *me, time_t timeout);
|
||||||
|
+int do_mount_autofs_direct(struct autofs_point *ap, struct mapent *me, time_t timeout);
|
||||||
|
int mount_autofs_direct(struct autofs_point *ap);
|
||||||
|
int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, const char *root, const char *offset);
|
||||||
|
void submount_signal_parent(struct autofs_point *ap, unsigned int success);
|
202
SOURCES/autofs-5.1.6-add-a-hash-index-to-mnt_list.patch
Normal file
202
SOURCES/autofs-5.1.6-add-a-hash-index-to-mnt_list.patch
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
autofs-5.1.6 - add a hash index to mnt_list
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add a hash index (and utility functions) to struct mnt_list.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
include/mounts.h | 8 +++
|
||||||
|
lib/mounts.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 144 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -121,6 +121,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- change mountpoint to mp in struct ext_mount.
|
||||||
|
- make external mounts independent of amd_entry.
|
||||||
|
- make external mounts use simpler hashtable.
|
||||||
|
+- add a hash index to mnt_list.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -54,10 +54,16 @@ struct mapent;
|
||||||
|
struct mnt_list {
|
||||||
|
char *mp;
|
||||||
|
unsigned int flags;
|
||||||
|
+
|
||||||
|
+ /* Hash of all mounts */
|
||||||
|
+ struct hlist_node hash;
|
||||||
|
+ unsigned int ref;
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* List operations ie. get_mnt_list.
|
||||||
|
*/
|
||||||
|
struct mnt_list *next;
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Tree operations ie. tree_make_tree,
|
||||||
|
* tree_get_mnt_list etc.
|
||||||
|
@@ -100,6 +106,8 @@ char *make_mnt_name_string(char *path);
|
||||||
|
int ext_mount_add(const char *, const char *);
|
||||||
|
int ext_mount_remove(const char *);
|
||||||
|
int ext_mount_inuse(const char *);
|
||||||
|
+struct mnt_list *mnts_lookup_mount(const char *mp);
|
||||||
|
+void mnts_put_mount(struct mnt_list *mnt);
|
||||||
|
struct mnt_list *get_mnt_list(const char *path, int include);
|
||||||
|
int unlink_mount_tree(struct autofs_point *ap, const char *mp);
|
||||||
|
void free_mnt_list(struct mnt_list *list);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -63,6 +63,11 @@ struct ext_mount {
|
||||||
|
static DEFINE_HASHTABLE(ext_mounts_hash, EXT_MOUNTS_HASH_BITS);
|
||||||
|
static pthread_mutex_t ext_mount_hash_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
|
+#define MNTS_HASH_BITS 7
|
||||||
|
+
|
||||||
|
+static DEFINE_HASHTABLE(mnts_hash, MNTS_HASH_BITS);
|
||||||
|
+static pthread_mutex_t mnts_hash_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
+
|
||||||
|
unsigned int linux_version_code(void)
|
||||||
|
{
|
||||||
|
struct utsname my_utsname;
|
||||||
|
@@ -832,6 +837,136 @@ done:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void mnts_hash_mutex_lock(void)
|
||||||
|
+{
|
||||||
|
+ int status = pthread_mutex_lock(&mnts_hash_mutex);
|
||||||
|
+ if (status)
|
||||||
|
+ fatal(status);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void mnts_hash_mutex_unlock(void)
|
||||||
|
+{
|
||||||
|
+ int status = pthread_mutex_unlock(&mnts_hash_mutex);
|
||||||
|
+ if (status)
|
||||||
|
+ fatal(status);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct mnt_list *mnts_lookup(const char *mp)
|
||||||
|
+{
|
||||||
|
+ uint32_t hval = hash(mp, HASH_SIZE(mnts_hash));
|
||||||
|
+ struct mnt_list *this;
|
||||||
|
+
|
||||||
|
+ if (hlist_empty(&mnts_hash[hval]))
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ hlist_for_each_entry(this, &mnts_hash[hval], hash) {
|
||||||
|
+ if (!strcmp(this->mp, mp) && this->ref)
|
||||||
|
+ return this;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct mnt_list *mnts_alloc_mount(const char *mp)
|
||||||
|
+{
|
||||||
|
+ struct mnt_list *this;
|
||||||
|
+
|
||||||
|
+ this = malloc(sizeof(*this));
|
||||||
|
+ if (!this)
|
||||||
|
+ goto done;
|
||||||
|
+ memset(this, 0, sizeof(*this));
|
||||||
|
+
|
||||||
|
+ this->mp = strdup(mp);
|
||||||
|
+ if (!this->mp) {
|
||||||
|
+ free(this);
|
||||||
|
+ this = NULL;
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ this->ref = 1;
|
||||||
|
+ INIT_HLIST_NODE(&this->hash);
|
||||||
|
+done:
|
||||||
|
+ return this;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void __mnts_get_mount(struct mnt_list *mnt)
|
||||||
|
+{
|
||||||
|
+ mnt->ref++;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void __mnts_put_mount(struct mnt_list *mnt)
|
||||||
|
+{
|
||||||
|
+ mnt->ref--;
|
||||||
|
+ if (!mnt->ref) {
|
||||||
|
+ hash_del(&mnt->hash);
|
||||||
|
+ free(mnt->mp);
|
||||||
|
+ free(mnt);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct mnt_list *mnts_new_mount(const char *mp)
|
||||||
|
+{
|
||||||
|
+ struct mnt_list *this;
|
||||||
|
+
|
||||||
|
+ this = mnts_lookup(mp);
|
||||||
|
+ if (this) {
|
||||||
|
+ __mnts_get_mount(this);
|
||||||
|
+ goto done;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ this = mnts_alloc_mount(mp);
|
||||||
|
+ if (!this)
|
||||||
|
+ goto done;
|
||||||
|
+
|
||||||
|
+ hash_add_str(mnts_hash, &this->hash, this->mp);
|
||||||
|
+done:
|
||||||
|
+ return this;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct mnt_list *mnts_get_mount(const char *mp)
|
||||||
|
+{
|
||||||
|
+ struct mnt_list *this;
|
||||||
|
+
|
||||||
|
+ this = mnts_lookup(mp);
|
||||||
|
+ if (this) {
|
||||||
|
+ __mnts_get_mount(this);
|
||||||
|
+ return this;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return mnts_new_mount(mp);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct mnt_list *__mnts_lookup_mount(const char *mp)
|
||||||
|
+{
|
||||||
|
+ struct mnt_list *this;
|
||||||
|
+
|
||||||
|
+ this = mnts_lookup(mp);
|
||||||
|
+ if (this)
|
||||||
|
+ __mnts_get_mount(this);
|
||||||
|
+
|
||||||
|
+ return this;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+struct mnt_list *mnts_lookup_mount(const char *mp)
|
||||||
|
+{
|
||||||
|
+ struct mnt_list *this;
|
||||||
|
+
|
||||||
|
+ mnts_hash_mutex_lock();
|
||||||
|
+ this = __mnts_lookup_mount(mp);
|
||||||
|
+ mnts_hash_mutex_unlock();
|
||||||
|
+
|
||||||
|
+ return this;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void mnts_put_mount(struct mnt_list *mnt)
|
||||||
|
+{
|
||||||
|
+ if (!mnt)
|
||||||
|
+ return;
|
||||||
|
+ mnts_hash_mutex_lock();
|
||||||
|
+ __mnts_put_mount(mnt);
|
||||||
|
+ mnts_hash_mutex_unlock();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* From glibc decode_name() */
|
||||||
|
/* Since the values in a line are separated by spaces, a name cannot
|
||||||
|
* contain a space. Therefore some programs encode spaces in names
|
@ -0,0 +1,248 @@
|
|||||||
|
autofs-5.1.6 - add force unlink mounts and exit option
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add a automount program option to force an unlink umount of all
|
||||||
|
existing mounts under configured autofs mount points then exit.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 51 +++++++++++++++++++++++++++++++++------------------
|
||||||
|
daemon/direct.c | 12 +++++++++++-
|
||||||
|
daemon/indirect.c | 21 ++++++++++++++++-----
|
||||||
|
include/automount.h | 1 +
|
||||||
|
lib/master.c | 6 ++++--
|
||||||
|
man/automount.8 | 6 ++++++
|
||||||
|
7 files changed, 72 insertions(+), 26 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -89,6 +89,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use bit flag for force unlink mounts.
|
||||||
|
- improve force unlink option description.
|
||||||
|
- remove command fifo on autofs mount fail.
|
||||||
|
+- add force unlink mounts and exit option.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -1153,8 +1153,13 @@ static int mount_autofs(struct autofs_po
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
- if (autofs_init_ap(ap) != 0)
|
||||||
|
- return -1;
|
||||||
|
+ /* No need to create comms fds and command fifo if
|
||||||
|
+ * unlinking mounts and exiting.
|
||||||
|
+ */
|
||||||
|
+ if (!(do_force_unlink & UNLINK_AND_EXIT)) {
|
||||||
|
+ if (autofs_init_ap(ap) != 0)
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (ap->type == LKP_DIRECT)
|
||||||
|
status = mount_autofs_direct(ap);
|
||||||
|
@@ -1859,7 +1864,8 @@ void *handle_mounts(void *arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mount_autofs(ap, root) < 0) {
|
||||||
|
- crit(ap->logopt, "mount of %s failed!", ap->path);
|
||||||
|
+ if (!(do_force_unlink & UNLINK_AND_EXIT))
|
||||||
|
+ crit(ap->logopt, "mount of %s failed!", ap->path);
|
||||||
|
suc->status = 1;
|
||||||
|
umount_autofs(ap, root, 1);
|
||||||
|
free(root);
|
||||||
|
@@ -1951,6 +1957,7 @@ static void usage(void)
|
||||||
|
" -C --dont-check-daemon\n"
|
||||||
|
" don't check if daemon is already running\n"
|
||||||
|
" -F --force forceably clean up known automounts at start\n"
|
||||||
|
+ " -U --force-exit forceably clean up known automounts and exit\n"
|
||||||
|
" -V --version print version, build config and exit\n"
|
||||||
|
, program);
|
||||||
|
}
|
||||||
|
@@ -2202,7 +2209,7 @@ int main(int argc, char *argv[])
|
||||||
|
time_t timeout;
|
||||||
|
time_t age = monotonic_time(NULL);
|
||||||
|
struct rlimit rlim;
|
||||||
|
- const char *options = "+hp:t:vmdD:SfVrO:l:n:CFM";
|
||||||
|
+ const char *options = "+hp:t:vmdD:SfVrO:l:n:CFUM";
|
||||||
|
static const struct option long_options[] = {
|
||||||
|
{"help", 0, 0, 'h'},
|
||||||
|
{"pid-file", 1, 0, 'p'},
|
||||||
|
@@ -2220,6 +2227,7 @@ int main(int argc, char *argv[])
|
||||||
|
{"set-log-priority", 1, 0, 'l'},
|
||||||
|
{"dont-check-daemon", 0, 0, 'C'},
|
||||||
|
{"force", 0, 0, 'F'},
|
||||||
|
+ {"force-exit", 0, 0, 'U'},
|
||||||
|
{"master-wait", 1, 0, 'M'},
|
||||||
|
{0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
@@ -2342,6 +2350,11 @@ int main(int argc, char *argv[])
|
||||||
|
do_force_unlink = UNLINK_AND_CONT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case 'U':
|
||||||
|
+ flags |= DAEMON_FLAGS_FOREGROUND;
|
||||||
|
+ do_force_unlink = UNLINK_AND_EXIT;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
case '?':
|
||||||
|
case ':':
|
||||||
|
printf("%s: Ambiguous or unknown options\n", program);
|
||||||
|
@@ -2657,25 +2670,27 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * Mmm ... reset force unlink umount so we don't also do this
|
||||||
|
- * in future when we receive a HUP signal.
|
||||||
|
- */
|
||||||
|
- do_force_unlink = 0;
|
||||||
|
+ if (!(do_force_unlink & UNLINK_AND_EXIT)) {
|
||||||
|
+ /*
|
||||||
|
+ * Mmm ... reset force unlink umount so we don't also do
|
||||||
|
+ * this in future when we receive a HUP signal.
|
||||||
|
+ */
|
||||||
|
+ do_force_unlink = 0;
|
||||||
|
|
||||||
|
- if (start_pipefd[1] != -1) {
|
||||||
|
- st_stat = 0;
|
||||||
|
- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
|
||||||
|
- close(start_pipefd[1]);
|
||||||
|
- }
|
||||||
|
+ if (start_pipefd[1] != -1) {
|
||||||
|
+ st_stat = 0;
|
||||||
|
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
|
||||||
|
+ close(start_pipefd[1]);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
#ifdef WITH_SYSTEMD
|
||||||
|
- if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE)
|
||||||
|
- sd_notify(1, "READY=1");
|
||||||
|
+ if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE)
|
||||||
|
+ sd_notify(1, "READY=1");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
- state_mach_thid = pthread_self();
|
||||||
|
- statemachine(NULL);
|
||||||
|
+ state_mach_thid = pthread_self();
|
||||||
|
+ statemachine(NULL);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
master_kill(master_list);
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -286,7 +286,14 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
if (ret == 0)
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
- if (ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
|
||||||
|
+ /* I don't remember why this is here for the force
|
||||||
|
+ * unlink case. I don't think it should be but I may
|
||||||
|
+ * have done it for a reason so keep it for the unlink
|
||||||
|
+ * and continue case but not for the unlink and exit
|
||||||
|
+ * case.
|
||||||
|
+ */
|
||||||
|
+ if (!(do_force_unlink & UNLINK_AND_EXIT) &&
|
||||||
|
+ ap->state == ST_READMAP && is_mounted(me->key, MNTS_ALL)) {
|
||||||
|
time_t tout = get_exp_timeout(ap, me->source);
|
||||||
|
int save_ioctlfd, ioctlfd;
|
||||||
|
|
||||||
|
@@ -319,6 +326,9 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
goto out_err;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (do_force_unlink & UNLINK_AND_EXIT)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
if (me->ioctlfd != -1) {
|
||||||
|
error(ap->logopt, "active direct mount %s", me->key);
|
||||||
|
return -1;
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -76,6 +76,9 @@ static int do_mount_autofs_indirect(stru
|
||||||
|
"or failed to unlink entry in tree");
|
||||||
|
goto out_err;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (do_force_unlink & UNLINK_AND_EXIT)
|
||||||
|
+ return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
options = make_options_string(ap->path,
|
||||||
|
@@ -163,12 +166,20 @@ int mount_autofs_indirect(struct autofs_
|
||||||
|
int status;
|
||||||
|
int map;
|
||||||
|
|
||||||
|
+ /* Don't read the map if the unlink and exit option has been
|
||||||
|
+ * given. do_mount_autofs_indirect() will return -1 if this
|
||||||
|
+ * option has been given so there's no need to do anything
|
||||||
|
+ * else.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
/* TODO: read map, determine map type is OK */
|
||||||
|
- if (lookup_nss_read_map(ap, NULL, now))
|
||||||
|
- lookup_prune_cache(ap, now);
|
||||||
|
- else {
|
||||||
|
- error(ap->logopt, "failed to read map for %s", ap->path);
|
||||||
|
- return -1;
|
||||||
|
+ if (!(do_force_unlink & UNLINK_AND_EXIT)) {
|
||||||
|
+ if (lookup_nss_read_map(ap, NULL, now))
|
||||||
|
+ lookup_prune_cache(ap, now);
|
||||||
|
+ else {
|
||||||
|
+ error(ap->logopt, "failed to read map for %s", ap->path);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
status = do_mount_autofs_indirect(ap, root);
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -591,6 +591,7 @@ struct autofs_point {
|
||||||
|
};
|
||||||
|
|
||||||
|
#define UNLINK_AND_CONT 0x01
|
||||||
|
+#define UNLINK_AND_EXIT 0x02
|
||||||
|
|
||||||
|
/* Foreably unlink existing mounts at startup. */
|
||||||
|
extern int do_force_unlink;
|
||||||
|
--- autofs-5.1.4.orig/lib/master.c
|
||||||
|
+++ autofs-5.1.4/lib/master.c
|
||||||
|
@@ -1358,7 +1358,8 @@ static int master_do_mount(struct master
|
||||||
|
suc.done = 0;
|
||||||
|
suc.status = 0;
|
||||||
|
|
||||||
|
- debug(ap->logopt, "mounting %s", entry->path);
|
||||||
|
+ if (!(do_force_unlink & UNLINK_AND_EXIT))
|
||||||
|
+ debug(ap->logopt, "mounting %s", entry->path);
|
||||||
|
|
||||||
|
status = pthread_create(&thid, &th_attr, handle_mounts, &suc);
|
||||||
|
if (status) {
|
||||||
|
@@ -1376,7 +1377,8 @@ static int master_do_mount(struct master
|
||||||
|
}
|
||||||
|
|
||||||
|
if (suc.status) {
|
||||||
|
- error(ap->logopt, "failed to startup mount");
|
||||||
|
+ if (!(do_force_unlink & UNLINK_AND_EXIT))
|
||||||
|
+ error(ap->logopt, "failed to startup mount");
|
||||||
|
handle_mounts_startup_cond_destroy(&suc);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--- autofs-5.1.4.orig/man/automount.8
|
||||||
|
+++ autofs-5.1.4/man/automount.8
|
||||||
|
@@ -121,6 +121,12 @@ Don't check if the daemon is currently r
|
||||||
|
Force an unlink umount of existing mounts under configured autofs managed
|
||||||
|
mount points during startup. This can cause problems for processes with
|
||||||
|
working directories within these mounts (see NOTES).
|
||||||
|
+.TP
|
||||||
|
+.I "\-U, \-\-force-exit"
|
||||||
|
+Force an unlink umount of existing mounts under configured autofs managed
|
||||||
|
+mount points and exit rather than continuing the startup. This can cause
|
||||||
|
+problems for processes with working directories within these mounts (see
|
||||||
|
+NOTES).
|
||||||
|
.SH ARGUMENTS
|
||||||
|
\fBautomount\fP takes one optional argument, the name of the master map to
|
||||||
|
use.
|
334
SOURCES/autofs-5.1.6-add-hashtable-implementation.patch
Normal file
334
SOURCES/autofs-5.1.6-add-hashtable-implementation.patch
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
autofs-5.1.6 - add hashtable implementation
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Include the (slightly modified) Linux kernel hashtable implementation.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
include/automount.h | 19 -----
|
||||||
|
include/hash.h | 101 +++++++++++++++++++++++++++++++
|
||||||
|
include/hashtable.h | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 269 insertions(+), 18 deletions(-)
|
||||||
|
create mode 100644 include/hash.h
|
||||||
|
create mode 100644 include/hashtable.h
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -117,6 +117,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- make bind mounts propagation slave by default.
|
||||||
|
- fix browse dir not re-created on symlink expire.
|
||||||
|
- update list.h.
|
||||||
|
+- add hashtable implementation.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/include/automount.h
|
||||||
|
+++ autofs-5.1.4/include/automount.h
|
||||||
|
@@ -22,6 +22,7 @@
|
||||||
|
#include <mntent.h>
|
||||||
|
#include "config.h"
|
||||||
|
#include "list.h"
|
||||||
|
+#include "hash.h"
|
||||||
|
|
||||||
|
#include <linux/auto_fs4.h>
|
||||||
|
|
||||||
|
@@ -143,24 +144,6 @@ struct autofs_point;
|
||||||
|
#define UMOUNT_RETRIES 8
|
||||||
|
#define EXPIRE_RETRIES 3
|
||||||
|
|
||||||
|
-static u_int32_t inline hash(const char *key, unsigned int size)
|
||||||
|
-{
|
||||||
|
- u_int32_t hashval;
|
||||||
|
- char *s = (char *) key;
|
||||||
|
-
|
||||||
|
- for (hashval = 0; *s != '\0';) {
|
||||||
|
- hashval += (unsigned char) *s++;
|
||||||
|
- hashval += (hashval << 10);
|
||||||
|
- hashval ^= (hashval >> 6);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- hashval += (hashval << 3);
|
||||||
|
- hashval ^= (hashval >> 11);
|
||||||
|
- hashval += (hashval << 15);
|
||||||
|
-
|
||||||
|
- return hashval % size;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
struct mapent_cache {
|
||||||
|
pthread_rwlock_t rwlock;
|
||||||
|
unsigned int size;
|
||||||
|
--- /dev/null
|
||||||
|
+++ autofs-5.1.4/include/hash.h
|
||||||
|
@@ -0,0 +1,101 @@
|
||||||
|
+#ifndef _LINUX_HASH_H
|
||||||
|
+#define _LINUX_HASH_H
|
||||||
|
+/* Fast hashing routine for ints, longs and pointers.
|
||||||
|
+ (C) 2002 Nadia Yvette Chambers, IBM */
|
||||||
|
+
|
||||||
|
+#include <sys/types.h>
|
||||||
|
+#include <stdint.h>
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * The "GOLDEN_RATIO_PRIME" is used in ifs/btrfs/brtfs_inode.h and
|
||||||
|
+ * fs/inode.c. It's not actually prime any more (the previous primes
|
||||||
|
+ * were actively bad for hashing), but the name remains.
|
||||||
|
+ */
|
||||||
|
+#if __WORDSIZE == 32
|
||||||
|
+#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_32
|
||||||
|
+#define hash_long(val, bits) hash_32(val, bits)
|
||||||
|
+#elif __WORDSIZE == 64
|
||||||
|
+#define hash_long(val, bits) hash_64(val, bits)
|
||||||
|
+#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_64
|
||||||
|
+#else
|
||||||
|
+#error Wordsize not 32 or 64
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+/* String based hash function */
|
||||||
|
+static uint32_t inline hash(const char *key, unsigned int size)
|
||||||
|
+{
|
||||||
|
+ u_int32_t hashval;
|
||||||
|
+ char *s = (char *) key;
|
||||||
|
+
|
||||||
|
+ for (hashval = 0; *s != '\0';) {
|
||||||
|
+ hashval += (unsigned char) *s++;
|
||||||
|
+ hashval += (hashval << 10);
|
||||||
|
+ hashval ^= (hashval >> 6);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ hashval += (hashval << 3);
|
||||||
|
+ hashval ^= (hashval >> 11);
|
||||||
|
+ hashval += (hashval << 15);
|
||||||
|
+
|
||||||
|
+ return hashval % size;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * This hash multiplies the input by a large odd number and takes the
|
||||||
|
+ * high bits. Since multiplication propagates changes to the most
|
||||||
|
+ * significant end only, it is essential that the high bits of the
|
||||||
|
+ * product be used for the hash value.
|
||||||
|
+ *
|
||||||
|
+ * Chuck Lever verified the effectiveness of this technique:
|
||||||
|
+ * http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf
|
||||||
|
+ *
|
||||||
|
+ * Although a random odd number will do, it turns out that the golden
|
||||||
|
+ * ratio phi = (sqrt(5)-1)/2, or its negative, has particularly nice
|
||||||
|
+ * properties. (See Knuth vol 3, section 6.4, exercise 9.)
|
||||||
|
+ *
|
||||||
|
+ * These are the negative, (1 - phi) = phi**2 = (3 - sqrt(5))/2,
|
||||||
|
+ * which is very slightly easier to multiply by and makes no
|
||||||
|
+ * difference to the hash distribution.
|
||||||
|
+ */
|
||||||
|
+#define GOLDEN_RATIO_32 0x61C88647
|
||||||
|
+#define GOLDEN_RATIO_64 0x61C8864680B583EBull
|
||||||
|
+
|
||||||
|
+static inline uint32_t __hash_32(uint32_t val)
|
||||||
|
+{
|
||||||
|
+ return val * GOLDEN_RATIO_32;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline uint32_t hash_32(uint32_t val, unsigned int bits)
|
||||||
|
+{
|
||||||
|
+ /* High bits are more random, so use them. */
|
||||||
|
+ return __hash_32(val) >> (32 - bits);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static __always_inline uint32_t hash_64(uint64_t val, unsigned int bits)
|
||||||
|
+{
|
||||||
|
+#if __WORDSIZE == 64
|
||||||
|
+ /* 64x64-bit multiply is efficient on all 64-bit processors */
|
||||||
|
+ return val * GOLDEN_RATIO_64 >> (64 - bits);
|
||||||
|
+#else
|
||||||
|
+ /* Hash 64 bits using only 32x32-bit multiply. */
|
||||||
|
+ return hash_32((uint32_t) val ^ __hash_32(val >> 32), bits);
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline uint32_t hash_ptr(const void *ptr, unsigned int bits)
|
||||||
|
+{
|
||||||
|
+ return hash_long((unsigned long) ptr, bits);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* This really should be called fold32_ptr; it does no hashing to speak of. */
|
||||||
|
+static inline uint32_t hash32_ptr(const void *ptr)
|
||||||
|
+{
|
||||||
|
+ unsigned long val = (unsigned long) ptr;
|
||||||
|
+
|
||||||
|
+#if __WORDSIZE == 64
|
||||||
|
+ val ^= (val >> 32);
|
||||||
|
+#endif
|
||||||
|
+ return (uint32_t) val;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* _LINUX_HASH_H */
|
||||||
|
--- /dev/null
|
||||||
|
+++ autofs-5.1.4/include/hashtable.h
|
||||||
|
@@ -0,0 +1,166 @@
|
||||||
|
+/*
|
||||||
|
+ * Statically sized hash table implementation
|
||||||
|
+ * (C) 2012 Sasha Levin <levinsasha928@gmail.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#ifndef _LINUX_HASHTABLE_H
|
||||||
|
+#define _LINUX_HASHTABLE_H
|
||||||
|
+
|
||||||
|
+#include "list.h"
|
||||||
|
+#include "hash.h"
|
||||||
|
+
|
||||||
|
+#ifndef ARRAY_SIZE
|
||||||
|
+#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+static inline unsigned int ilog2(unsigned long val) {
|
||||||
|
+ unsigned int ret = -1;
|
||||||
|
+
|
||||||
|
+ while (val != 0) {
|
||||||
|
+ val >>= 1;
|
||||||
|
+ ret++;
|
||||||
|
+ }
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define DEFINE_HASHTABLE(name, bits) \
|
||||||
|
+ struct hlist_head name[1 << (bits)] = \
|
||||||
|
+ { [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT }
|
||||||
|
+
|
||||||
|
+#define DECLARE_HASHTABLE(name, bits) \
|
||||||
|
+ struct hlist_head name[1 << (bits)]
|
||||||
|
+
|
||||||
|
+#define HASH_SIZE(name) (ARRAY_SIZE(name))
|
||||||
|
+#define HASH_BITS(name) ilog2(HASH_SIZE(name))
|
||||||
|
+
|
||||||
|
+/* Use hash_32 when possible to allow for fast 32bit hashing in 64bit kernels. */
|
||||||
|
+#define hash_min(val, bits) \
|
||||||
|
+ (sizeof(val) <= 4 ? hash_32(val, bits) : hash_long(val, bits))
|
||||||
|
+
|
||||||
|
+static inline void __hash_init(struct hlist_head *ht, unsigned int sz)
|
||||||
|
+{
|
||||||
|
+ unsigned int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < sz; i++)
|
||||||
|
+ INIT_HLIST_HEAD(&ht[i]);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_init - initialize a hash table
|
||||||
|
+ * @hashtable: hashtable to be initialized
|
||||||
|
+ *
|
||||||
|
+ * Calculates the size of the hashtable from the given parameter, otherwise
|
||||||
|
+ * same as hash_init_size.
|
||||||
|
+ *
|
||||||
|
+ * This has to be a macro since HASH_BITS() will not work on pointers since
|
||||||
|
+ * it calculates the size during preprocessing.
|
||||||
|
+ */
|
||||||
|
+#define hash_init(hashtable) __hash_init(hashtable, HASH_SIZE(hashtable))
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_add - add an object to a hashtable
|
||||||
|
+ * @hashtable: hashtable to add to
|
||||||
|
+ * @node: the &struct hlist_node of the object to be added
|
||||||
|
+ * @key: the key of the object to be added
|
||||||
|
+ */
|
||||||
|
+#define hash_add(hashtable, node, key) \
|
||||||
|
+ hlist_add_head(node, &hashtable[hash_min(key, HASH_BITS(hashtable))])
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_add_str - add a string object to a hashtable
|
||||||
|
+ * @hashtable: hashtable to add to
|
||||||
|
+ * @node: the &struct hlist_node of the object to be added
|
||||||
|
+ * @key: the string key of the object to be added
|
||||||
|
+ */
|
||||||
|
+#define hash_add_str(hashtable, node, key) \
|
||||||
|
+ hlist_add_head(node, &hashtable[hash(key, HASH_SIZE(hashtable))])
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_hashed - check whether an object is in any hashtable
|
||||||
|
+ * @node: the &struct hlist_node of the object to be checked
|
||||||
|
+ */
|
||||||
|
+static inline int hash_hashed(struct hlist_node *node)
|
||||||
|
+{
|
||||||
|
+ return !hlist_unhashed(node);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline int __hash_empty(struct hlist_head *ht, unsigned int sz)
|
||||||
|
+{
|
||||||
|
+ unsigned int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < sz; i++)
|
||||||
|
+ if (!hlist_empty(&ht[i]))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_empty - check whether a hashtable is empty
|
||||||
|
+ * @hashtable: hashtable to check
|
||||||
|
+ *
|
||||||
|
+ * This has to be a macro since HASH_BITS() will not work on pointers since
|
||||||
|
+ * it calculates the size during preprocessing.
|
||||||
|
+ */
|
||||||
|
+#define hash_empty(hashtable) __hash_empty(hashtable, HASH_SIZE(hashtable))
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_del - remove an object from a hashtable
|
||||||
|
+ * @node: &struct hlist_node of the object to remove
|
||||||
|
+ */
|
||||||
|
+static inline void hash_del(struct hlist_node *node)
|
||||||
|
+{
|
||||||
|
+ hlist_del_init(node);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_for_each - iterate over a hashtable
|
||||||
|
+ * @name: hashtable to iterate
|
||||||
|
+ * @bkt: integer to use as bucket loop cursor
|
||||||
|
+ * @obj: the type * to use as a loop cursor for each entry
|
||||||
|
+ * @member: the name of the hlist_node within the struct
|
||||||
|
+ */
|
||||||
|
+#define hash_for_each(name, bkt, obj, member) \
|
||||||
|
+ for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\
|
||||||
|
+ (bkt)++)\
|
||||||
|
+ hlist_for_each_entry(obj, &name[bkt], member)
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_for_each_safe - iterate over a hashtable safe against removal of
|
||||||
|
+ * hash entry
|
||||||
|
+ * @name: hashtable to iterate
|
||||||
|
+ * @bkt: integer to use as bucket loop cursor
|
||||||
|
+ * @tmp: a &struct used for temporary storage
|
||||||
|
+ * @obj: the type * to use as a loop cursor for each entry
|
||||||
|
+ * @member: the name of the hlist_node within the struct
|
||||||
|
+ */
|
||||||
|
+#define hash_for_each_safe(name, bkt, tmp, obj, member) \
|
||||||
|
+ for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\
|
||||||
|
+ (bkt)++)\
|
||||||
|
+ hlist_for_each_entry_safe(obj, tmp, &name[bkt], member)
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_for_each_possible - iterate over all possible objects hashing to the
|
||||||
|
+ * same bucket
|
||||||
|
+ * @name: hashtable to iterate
|
||||||
|
+ * @obj: the type * to use as a loop cursor for each entry
|
||||||
|
+ * @member: the name of the hlist_node within the struct
|
||||||
|
+ * @key: the key of the objects to iterate over
|
||||||
|
+ */
|
||||||
|
+#define hash_for_each_possible(name, obj, member, key) \
|
||||||
|
+ hlist_for_each_entry(obj, &name[hash_min(key, HASH_BITS(name))], member)
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * hash_for_each_possible_safe - iterate over all possible objects hashing to the
|
||||||
|
+ * same bucket safe against removals
|
||||||
|
+ * @name: hashtable to iterate
|
||||||
|
+ * @obj: the type * to use as a loop cursor for each entry
|
||||||
|
+ * @tmp: a &struct used for temporary storage
|
||||||
|
+ * @member: the name of the hlist_node within the struct
|
||||||
|
+ * @key: the key of the objects to iterate over
|
||||||
|
+ */
|
||||||
|
+#define hash_for_each_possible_safe(name, obj, tmp, member, key) \
|
||||||
|
+ hlist_for_each_entry_safe(obj, tmp,\
|
||||||
|
+ &name[hash_min(key, HASH_BITS(name))], member)
|
||||||
|
+
|
||||||
|
+#endif
|
@ -0,0 +1,225 @@
|
|||||||
|
autofs-5.1.6 - add helper to construct mount point path
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add convenience helper to construct mount point path.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
include/mounts.h | 3 +++
|
||||||
|
lib/mounts.c | 23 +++++++++++++++++++++++
|
||||||
|
modules/mount_bind.c | 19 +++++--------------
|
||||||
|
modules/mount_changer.c | 19 +++++--------------
|
||||||
|
modules/mount_ext2.c | 19 +++++--------------
|
||||||
|
modules/mount_generic.c | 19 +++++--------------
|
||||||
|
modules/mount_nfs.c | 21 ++++++++-------------
|
||||||
|
8 files changed, 55 insertions(+), 69 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -135,6 +135,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- move submount check into conditional_alarm_add().
|
||||||
|
- move lib/master.c to daemon/master.c.
|
||||||
|
- use master_list_empty() for list empty check.
|
||||||
|
+- add helper to construct mount point path.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -94,6 +94,9 @@ unsigned int linux_version_code(void);
|
||||||
|
int check_nfs_mount_version(struct nfs_mount_vers *, struct nfs_mount_vers *);
|
||||||
|
extern unsigned int nfs_mount_uses_string_options;
|
||||||
|
|
||||||
|
+int mount_fullpath(char *fullpath, size_t max_len,
|
||||||
|
+ const char *root, const char *name);
|
||||||
|
+
|
||||||
|
struct amd_entry;
|
||||||
|
|
||||||
|
struct substvar *addstdenv(struct substvar *sv, const char *prefix);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -339,6 +339,29 @@ int check_nfs_mount_version(struct nfs_m
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+int mount_fullpath(char *fullpath, size_t max_len,
|
||||||
|
+ const char *root, const char *name)
|
||||||
|
+{
|
||||||
|
+ int last, len;
|
||||||
|
+
|
||||||
|
+ last = strlen(root) - 1;
|
||||||
|
+
|
||||||
|
+ /* Root offset of multi-mount or direct or offset mount.
|
||||||
|
+ * Direct or offset mount, name (or root) is absolute path.
|
||||||
|
+ */
|
||||||
|
+ if (root[last] == '/' || *name == '/')
|
||||||
|
+ len = snprintf(fullpath, max_len, "%s", root);
|
||||||
|
+ else
|
||||||
|
+ len = snprintf(fullpath, max_len, "%s/%s", root, name);
|
||||||
|
+
|
||||||
|
+ if (len >= max_len)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ fullpath[len] = '\0';
|
||||||
|
+
|
||||||
|
+ return len;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static char *set_env_name(const char *prefix, const char *name, char *buf)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_bind.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_bind.c
|
||||||
|
@@ -122,21 +122,12 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Root offset of multi-mount */
|
||||||
|
- len = strlen(root);
|
||||||
|
- if (root[len - 1] == '/') {
|
||||||
|
- len = snprintf(fullpath, len, "%s", root);
|
||||||
|
- } else if (*name == '/') {
|
||||||
|
- /*
|
||||||
|
- * Direct or offset mount, name is absolute path so
|
||||||
|
- * don't use root (but with move mount changes root
|
||||||
|
- * is now the same as name).
|
||||||
|
- */
|
||||||
|
- len = sprintf(fullpath, "%s", root);
|
||||||
|
- } else {
|
||||||
|
- len = sprintf(fullpath, "%s/%s", root, name);
|
||||||
|
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
|
||||||
|
+ if (!len) {
|
||||||
|
+ error(ap->logopt,
|
||||||
|
+ MODPREFIX "mount point path too long");
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
- fullpath[len] = '\0';
|
||||||
|
|
||||||
|
i = len;
|
||||||
|
while (--i > 0 && fullpath[i] == '/')
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_changer.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_changer.c
|
||||||
|
@@ -59,21 +59,12 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
|
||||||
|
fstype = "iso9660";
|
||||||
|
|
||||||
|
- /* Root offset of multi-mount */
|
||||||
|
- len = strlen(root);
|
||||||
|
- if (root[len - 1] == '/') {
|
||||||
|
- len = snprintf(fullpath, len, "%s", root);
|
||||||
|
- } else if (*name == '/') {
|
||||||
|
- /*
|
||||||
|
- * Direct or offset mount, name is absolute path so
|
||||||
|
- * don't use root (but with move mount changes root
|
||||||
|
- * is now the same as name).
|
||||||
|
- */
|
||||||
|
- len = sprintf(fullpath, "%s", root);
|
||||||
|
- } else {
|
||||||
|
- len = sprintf(fullpath, "%s/%s", root, name);
|
||||||
|
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
|
||||||
|
+ if (!len) {
|
||||||
|
+ error(ap->logopt,
|
||||||
|
+ MODPREFIX "mount point path too long");
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
- fullpath[len] = '\0';
|
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX "calling umount %s", what);
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_ext2.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_ext2.c
|
||||||
|
@@ -55,21 +55,12 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
if (defaults_get_mount_verbose())
|
||||||
|
mountlog = &log_info;
|
||||||
|
|
||||||
|
- /* Root offset of multi-mount */
|
||||||
|
- len = strlen(root);
|
||||||
|
- if (root[len - 1] == '/') {
|
||||||
|
- len = snprintf(fullpath, len, "%s", root);
|
||||||
|
- } else if (*name == '/') {
|
||||||
|
- /*
|
||||||
|
- * Direct or offset mount, name is absolute path so
|
||||||
|
- * don't use root (but with move mount changes root
|
||||||
|
- * is now the same as name).
|
||||||
|
- */
|
||||||
|
- len = sprintf(fullpath, "%s", root);
|
||||||
|
- } else {
|
||||||
|
- len = sprintf(fullpath, "%s/%s", root, name);
|
||||||
|
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
|
||||||
|
+ if (!len) {
|
||||||
|
+ error(ap->logopt,
|
||||||
|
+ MODPREFIX "mount point path too long");
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
- fullpath[len] = '\0';
|
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_generic.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_generic.c
|
||||||
|
@@ -54,21 +54,12 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
if (defaults_get_mount_verbose())
|
||||||
|
mountlog = &log_info;
|
||||||
|
|
||||||
|
- /* Root offset of multi-mount */
|
||||||
|
- len = strlen(root);
|
||||||
|
- if (root[len - 1] == '/') {
|
||||||
|
- len = snprintf(fullpath, len, "%s", root);
|
||||||
|
- } else if (*name == '/') {
|
||||||
|
- /*
|
||||||
|
- * Direct or offset mount, name is absolute path so
|
||||||
|
- * don't use root (but with move mount changes root
|
||||||
|
- * is now the same as name).
|
||||||
|
- */
|
||||||
|
- len = sprintf(fullpath, "%s", root);
|
||||||
|
- } else {
|
||||||
|
- len = sprintf(fullpath, "%s/%s", root, name);
|
||||||
|
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
|
||||||
|
+ if (!len) {
|
||||||
|
+ error(ap->logopt,
|
||||||
|
+ MODPREFIX "mount point path too long");
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
- fullpath[len] = '\0';
|
||||||
|
|
||||||
|
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/modules/mount_nfs.c
|
||||||
|
+++ autofs-5.1.4/modules/mount_nfs.c
|
||||||
|
@@ -212,6 +212,14 @@ int mount_mount(struct autofs_point *ap,
|
||||||
|
nfsoptions, nobind, nosymlink, ro);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Construct mount point directory */
|
||||||
|
+ len = mount_fullpath(fullpath, PATH_MAX, root, name);
|
||||||
|
+ if (!len) {
|
||||||
|
+ error(ap->logopt,
|
||||||
|
+ MODPREFIX "mount point path too long");
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!parse_location(ap->logopt, &hosts, what, flags)) {
|
||||||
|
info(ap->logopt, MODPREFIX "no hosts available");
|
||||||
|
return 1;
|
||||||
|
@@ -266,19 +274,6 @@ dont_probe:
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* Construct and perhaps create mount point directory */
|
||||||
|
-
|
||||||
|
- /* Root offset of multi-mount */
|
||||||
|
- len = strlen(root);
|
||||||
|
- if (root[len - 1] == '/') {
|
||||||
|
- len = snprintf(fullpath, len, "%s", root);
|
||||||
|
- } else if (*name == '/') {
|
||||||
|
- len = sprintf(fullpath, "%s", root);
|
||||||
|
- } else {
|
||||||
|
- len = sprintf(fullpath, "%s/%s", root, name);
|
||||||
|
- }
|
||||||
|
- fullpath[len] = '\0';
|
||||||
|
-
|
||||||
|
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
|
||||||
|
|
||||||
|
status = mkdir_path(fullpath, mp_mode);
|
@ -0,0 +1,66 @@
|
|||||||
|
autofs-5.1.6 - add sss ECONREFUSED return handling
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The sss library has returned ECONNREFUSED for the case of sssd not
|
||||||
|
running for a long time now but autofs doesn't catch it, fix that.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/lookup_sss.c | 9 +++++++++
|
||||||
|
2 files changed, 10 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 5a3d785..2a45829 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -94,6 +94,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix lookup_nss_read_master() nsswicth check return.
|
||||||
|
- fix typo in open_sss_lib().
|
||||||
|
- fix sss_master_map_wait timing.
|
||||||
|
+- add sss ECONREFUSED return handling.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
|
||||||
|
index fbb6193..c393296 100644
|
||||||
|
--- a/modules/lookup_sss.c
|
||||||
|
+++ b/modules/lookup_sss.c
|
||||||
|
@@ -297,6 +297,9 @@ int lookup_read_master(struct master *master, time_t age, void *context)
|
||||||
|
if (ret) {
|
||||||
|
unsigned int retries;
|
||||||
|
|
||||||
|
+ if (ret == ECONNREFUSED)
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
+
|
||||||
|
if (ret != ENOENT)
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
|
||||||
|
@@ -308,6 +311,8 @@ int lookup_read_master(struct master *master, time_t age, void *context)
|
||||||
|
ctxt, ctxt->mapname, &sss_ctxt,
|
||||||
|
retries);
|
||||||
|
if (ret) {
|
||||||
|
+ if (ret == ECONNREFUSED)
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
if (ret == ENOENT)
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
@@ -415,6 +420,8 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context)
|
||||||
|
|
||||||
|
ret = setautomntent(ap->logopt, ctxt, ctxt->mapname, &sss_ctxt);
|
||||||
|
if (ret) {
|
||||||
|
+ if (ret == ECONNREFUSED)
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
if (ret == ENOENT)
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
@@ -525,6 +532,8 @@ static int lookup_one(struct autofs_point *ap,
|
||||||
|
|
||||||
|
ret = setautomntent(ap->logopt, ctxt, ctxt->mapname, &sss_ctxt);
|
||||||
|
if (ret) {
|
||||||
|
+ if (ret == ECONNREFUSED)
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
if (ret == ENOENT)
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
@ -0,0 +1,120 @@
|
|||||||
|
autofs-5.1.6 - add support for new sss autofs proto version call
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Add sss protocol feature version function existence check and local get
|
||||||
|
function.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
modules/lookup_sss.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 45 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 1830730..7c22aa1 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -96,6 +96,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix sss_master_map_wait timing.
|
||||||
|
- add sss ECONREFUSED return handling.
|
||||||
|
- use mapname in sss context for setautomntent().
|
||||||
|
+- add support for new sss autofs proto version call.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
|
||||||
|
index c44c55d..3819981 100644
|
||||||
|
--- a/modules/lookup_sss.c
|
||||||
|
+++ b/modules/lookup_sss.c
|
||||||
|
@@ -37,11 +37,29 @@
|
||||||
|
|
||||||
|
#define SSS_SO_NAME "libsss_autofs"
|
||||||
|
|
||||||
|
+/* If the sss library protocol version is greater than 0 there are
|
||||||
|
+ * more possibile error returns from the sss autofs library calls.
|
||||||
|
+ *
|
||||||
|
+ * If ECONNREFUSED is returned then sssd is not running or not
|
||||||
|
+ * configured on the system, immediately return an unavailable
|
||||||
|
+ * status.
|
||||||
|
+ *
|
||||||
|
+ * A return of EHOSTDOWN means sss backend server is down so we
|
||||||
|
+ * should retry.
|
||||||
|
+ *
|
||||||
|
+ * With older sss ilibrary we can get a return of ENOENT for the
|
||||||
|
+ * above cases so also wait in that case since we can't be sure
|
||||||
|
+ * the map doesn't exist.
|
||||||
|
+ */
|
||||||
|
+#define SSS_PROTO_VERSION 1
|
||||||
|
+
|
||||||
|
+unsigned int _sss_auto_protocol_version(unsigned int);
|
||||||
|
int _sss_setautomntent(const char *, void **);
|
||||||
|
int _sss_getautomntent_r(char **, char **, void *);
|
||||||
|
int _sss_getautomntbyname_r(char *, char **, void *);
|
||||||
|
int _sss_endautomntent(void **);
|
||||||
|
|
||||||
|
+typedef unsigned int (*protocol_version_t) (unsigned int);
|
||||||
|
typedef int (*setautomntent_t) (const char *, void **);
|
||||||
|
typedef int (*getautomntent_t) (char **, char **, void *);
|
||||||
|
typedef int (*getautomntbyname_t) (char *, char **, void *);
|
||||||
|
@@ -50,6 +68,7 @@ typedef int (*endautomntent_t) (void **);
|
||||||
|
struct lookup_context {
|
||||||
|
const char *mapname;
|
||||||
|
void *dlhandle;
|
||||||
|
+ protocol_version_t protocol_version;
|
||||||
|
setautomntent_t setautomntent;
|
||||||
|
getautomntent_t getautomntent_r;
|
||||||
|
getautomntbyname_t getautomntbyname_r;
|
||||||
|
@@ -58,6 +77,8 @@ struct lookup_context {
|
||||||
|
};
|
||||||
|
|
||||||
|
int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */
|
||||||
|
+int sss_proto_version = SSS_PROTO_VERSION; /* 0 => initial version,
|
||||||
|
+ * >= 1 => new error handling. */
|
||||||
|
|
||||||
|
static int open_sss_lib(struct lookup_context *ctxt)
|
||||||
|
{
|
||||||
|
@@ -78,6 +99,11 @@ static int open_sss_lib(struct lookup_context *ctxt)
|
||||||
|
return 1;
|
||||||
|
ctxt->dlhandle = dh;
|
||||||
|
|
||||||
|
+ /* Don't fail on NULL, it's simply not present in this version of the
|
||||||
|
+ * sss autofs library.
|
||||||
|
+ */
|
||||||
|
+ ctxt->protocol_version = (protocol_version_t) dlsym(dh, "_sss_auto_protocol_version");
|
||||||
|
+
|
||||||
|
ctxt->setautomntent = (setautomntent_t) dlsym(dh, "_sss_setautomntent");
|
||||||
|
if (!ctxt->setautomntent)
|
||||||
|
goto lib_names_fail;
|
||||||
|
@@ -193,6 +219,7 @@ int lookup_reinit(const char *mapfmt,
|
||||||
|
}
|
||||||
|
|
||||||
|
new->dlhandle = ctxt->dlhandle;
|
||||||
|
+ new->protocol_version = ctxt->protocol_version;
|
||||||
|
new->setautomntent = ctxt->setautomntent;
|
||||||
|
new->getautomntent_r = ctxt->getautomntent_r;
|
||||||
|
new->getautomntbyname_r = ctxt->getautomntbyname_r;
|
||||||
|
@@ -219,6 +246,23 @@ static int setautomntent(unsigned int logopt,
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static unsigned int proto_version(struct lookup_context *ctxt)
|
||||||
|
+{
|
||||||
|
+ unsigned int proto_version = 0;
|
||||||
|
+
|
||||||
|
+ if (ctxt->protocol_version) {
|
||||||
|
+ /* If ctxt->protocol_version() is defined it's assumed
|
||||||
|
+ * that for sss_proto_version <= sss autofs library
|
||||||
|
+ * protocol version ctxt->protocol_version() will
|
||||||
|
+ * return the version requested by autofs to indicate
|
||||||
|
+ * it userstands what the autofs module is capable of
|
||||||
|
+ * handling.
|
||||||
|
+ */
|
||||||
|
+ proto_version = ctxt->protocol_version(sss_proto_version);
|
||||||
|
+ }
|
||||||
|
+ return proto_version;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int setautomntent_wait(unsigned int logopt,
|
||||||
|
struct lookup_context *ctxt,
|
||||||
|
void **sss_ctxt, unsigned int retries)
|
@ -0,0 +1,74 @@
|
|||||||
|
autofs-5.1.6 - change mountpoint to mp in struct ext_mount
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Use simple name mp instead of mountpoint in struct ext_mount.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/mounts.c | 14 +++++++-------
|
||||||
|
2 files changed, 8 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -118,6 +118,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix browse dir not re-created on symlink expire.
|
||||||
|
- update list.h.
|
||||||
|
- add hashtable implementation.
|
||||||
|
+- change mountpoint to mp in struct ext_mount.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -54,7 +54,7 @@ static size_t maxgrpbuf = 0;
|
||||||
|
#define EXT_MOUNTS_HASH_SIZE 50
|
||||||
|
|
||||||
|
struct ext_mount {
|
||||||
|
- char *mountpoint;
|
||||||
|
+ char *mp;
|
||||||
|
unsigned int umount;
|
||||||
|
struct list_head mount;
|
||||||
|
struct list_head mounts;
|
||||||
|
@@ -743,9 +743,9 @@ static void ext_mounts_hash_init(void)
|
||||||
|
ext_mounts_hash_init_done = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static struct ext_mount *ext_mount_lookup(const char *mountpoint)
|
||||||
|
+static struct ext_mount *ext_mount_lookup(const char *mp)
|
||||||
|
{
|
||||||
|
- u_int32_t hval = hash(mountpoint, EXT_MOUNTS_HASH_SIZE);
|
||||||
|
+ u_int32_t hval = hash(mp, EXT_MOUNTS_HASH_SIZE);
|
||||||
|
struct list_head *p, *head;
|
||||||
|
|
||||||
|
if (!ext_mounts_hash_init_done)
|
||||||
|
@@ -757,7 +757,7 @@ static struct ext_mount *ext_mount_looku
|
||||||
|
head = &ext_mounts_hash[hval];
|
||||||
|
list_for_each(p, head) {
|
||||||
|
struct ext_mount *this = list_entry(p, struct ext_mount, mount);
|
||||||
|
- if (!strcmp(this->mountpoint, mountpoint))
|
||||||
|
+ if (!strcmp(this->mp, mp))
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
@@ -788,8 +788,8 @@ int ext_mount_add(struct list_head *entr
|
||||||
|
if (!em)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
- em->mountpoint = strdup(path);
|
||||||
|
- if (!em->mountpoint) {
|
||||||
|
+ em->mp = strdup(path);
|
||||||
|
+ if (!em->mp) {
|
||||||
|
free(em);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
@@ -828,7 +828,7 @@ int ext_mount_remove(struct list_head *e
|
||||||
|
if (em->umount)
|
||||||
|
ret = 1;
|
||||||
|
if (list_empty(&em->mount)) {
|
||||||
|
- free(em->mountpoint);
|
||||||
|
+ free(em->mp);
|
||||||
|
free(em);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,101 @@
|
|||||||
|
autofs-5.1.6 - cleanup stale logpri fifo pipes on unlink and exit
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
If the unlink and exit option is given then stale fifo pipe files
|
||||||
|
need to be cleaned up since the entire tree of mounts below autofs
|
||||||
|
managed directories will be unlinked as well as the autofs mounts
|
||||||
|
themselves.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||||
|
2 files changed, 52 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -90,6 +90,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- improve force unlink option description.
|
||||||
|
- remove command fifo on autofs mount fail.
|
||||||
|
- add force unlink mounts and exit option.
|
||||||
|
+- cleanup stale logpri fifo pipes on unlink and exit.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -60,7 +60,8 @@ unsigned int nfs_mount_uses_string_optio
|
||||||
|
static struct nfs_mount_vers vers, check = {1, 1, 1};
|
||||||
|
|
||||||
|
/* autofs fifo name prefix */
|
||||||
|
-const char *fifodir = AUTOFS_FIFO_DIR "/autofs.fifo";
|
||||||
|
+#define FIFO_NAME_PREFIX "autofs.fifo"
|
||||||
|
+const char *fifodir = AUTOFS_FIFO_DIR "/" FIFO_NAME_PREFIX;
|
||||||
|
|
||||||
|
const char *global_options; /* Global option, from command line */
|
||||||
|
|
||||||
|
@@ -887,6 +888,48 @@ out_free:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void cleanup_stale_logpri_fifo_pipes(void)
|
||||||
|
+{
|
||||||
|
+ size_t prefix_len = strlen(FIFO_NAME_PREFIX);
|
||||||
|
+ char *dir = AUTOFS_FIFO_DIR;
|
||||||
|
+ size_t dir_len = strlen(dir);
|
||||||
|
+ struct dirent *dent;
|
||||||
|
+ DIR *dfd;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ dfd = opendir(dir);
|
||||||
|
+ if (!dfd) {
|
||||||
|
+ warn(LOGOPT_ANY, "failed to open fifo dir %s", dir);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ while ((dent = readdir(dfd))) {
|
||||||
|
+ char fifo_path[PATH_MAX];
|
||||||
|
+
|
||||||
|
+ if (!(dent->d_type & DT_FIFO))
|
||||||
|
+ continue;
|
||||||
|
+ if (strncmp(FIFO_NAME_PREFIX, dent->d_name, prefix_len))
|
||||||
|
+ continue;
|
||||||
|
+ if ((dir_len + 1 + strlen(dent->d_name)) >= PATH_MAX) {
|
||||||
|
+ warn(LOGOPT_ANY, "fifo path too long for buffer");
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ strcpy(fifo_path, dir);
|
||||||
|
+ strcat(fifo_path, "/");
|
||||||
|
+ strcat(fifo_path, dent->d_name);
|
||||||
|
+
|
||||||
|
+ ret = unlink(fifo_path);
|
||||||
|
+ if (ret == -1) {
|
||||||
|
+ char buf[MAX_ERR_BUF];
|
||||||
|
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
+ warn(LOGOPT_ANY, "unlink of fifo failed: %s", estr);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ closedir(dfd);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void handle_fifo_message(struct autofs_point *ap, int fd)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
@@ -2670,7 +2713,13 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!(do_force_unlink & UNLINK_AND_EXIT)) {
|
||||||
|
+ /* If the option to unlink all autofs mounts and exit has
|
||||||
|
+ * been given remove logpri fifo files as all the mounts
|
||||||
|
+ * will be detached leaving them stale.
|
||||||
|
+ */
|
||||||
|
+ if (do_force_unlink & UNLINK_AND_EXIT)
|
||||||
|
+ cleanup_stale_logpri_fifo_pipes();
|
||||||
|
+ else {
|
||||||
|
/*
|
||||||
|
* Mmm ... reset force unlink umount so we don't also do
|
||||||
|
* this in future when we receive a HUP signal.
|
49
SOURCES/autofs-5.1.6-dont-prune-offset-map-entries.patch
Normal file
49
SOURCES/autofs-5.1.6-dont-prune-offset-map-entries.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
autofs-5.1.6 - dont prune offset map entries
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Indirect maps create offset map entries for multi-mount map entries on
|
||||||
|
deamnd and remove them when they expire.
|
||||||
|
|
||||||
|
Since they are created based on an owning map entry they don't correspond
|
||||||
|
to an actual map entry so they, and their owning map entry, should never
|
||||||
|
be pruned.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/lookup.c | 9 +++++++++
|
||||||
|
2 files changed, 10 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/CHANGELOG b/CHANGELOG
|
||||||
|
index 3608345..34b160e 100644
|
||||||
|
--- a/CHANGELOG
|
||||||
|
+++ b/CHANGELOG
|
||||||
|
@@ -109,6 +109,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- refactor sss getautomntbyname().
|
||||||
|
- improve sss getautomntbyname() error handling.
|
||||||
|
- use a valid timeout in lookup_prune_one_cache().
|
||||||
|
+- dont prune offset map entries.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
diff --git a/daemon/lookup.c b/daemon/lookup.c
|
||||||
|
index 8bf1335..2de622e 100644
|
||||||
|
--- a/daemon/lookup.c
|
||||||
|
+++ b/daemon/lookup.c
|
||||||
|
@@ -1355,6 +1355,15 @@ void lookup_prune_one_cache(struct autofs_point *ap, struct mapent_cache *mc, ti
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ap->type == LKP_INDIRECT) {
|
||||||
|
+ /* Don't prune offset map entries since they are
|
||||||
|
+ * created on demand and managed by expire and don't
|
||||||
|
+ * prune the multi-map owner map entry.
|
||||||
|
+ */
|
||||||
|
+ if (*me->key == '/' || me->multi == me) {
|
||||||
|
+ me = cache_enumerate(mc, me);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* If the map hasn't been read (nobrowse
|
||||||
|
* indirect mounts) then keep cached entries
|
||||||
|
* for POSITIVE_TIMEOUT.
|
@ -0,0 +1,310 @@
|
|||||||
|
autofs-5.1.6 - fix a regression with map instance lookup
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Commit b66deff4241d ("autofs-5.1.3 - fix possible map instance memory
|
||||||
|
leak") introduced a regression.
|
||||||
|
|
||||||
|
The change didn't fix the memory leak and also failed to fix the race
|
||||||
|
updating the map instance list that caused it.
|
||||||
|
|
||||||
|
To fix this get rid of the horible temporary map usage and update the
|
||||||
|
instance list in place. Doing this causes some additional allocations
|
||||||
|
and frees but is somewhat simpler overall and avoids the race.
|
||||||
|
|
||||||
|
Fixes: b66deff4241d ("autofs-5.1.3 - fix possible map instance memory leak")
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
daemon/lookup.c | 180 +++++++++++++++++++++++---------------------------------
|
||||||
|
2 files changed, 76 insertions(+), 105 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -76,6 +76,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- use local getmntent_r() in get_mnt_list().
|
||||||
|
- use local getmntent_r() in tree_make_mnt_list().
|
||||||
|
- fix missing initialization of autofs_point flags.
|
||||||
|
+- fix a regression with map instance lookup.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/lookup.c
|
||||||
|
+++ autofs-5.1.4/daemon/lookup.c
|
||||||
|
@@ -64,6 +64,10 @@ static char *find_map_path(struct autofs
|
||||||
|
char *search_path;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
+ /* Absolute path, just return a copy */
|
||||||
|
+ if (mname[0] == '/')
|
||||||
|
+ return strdup(mname);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* This is different to the way it is in amd.
|
||||||
|
* autofs will always try to locate maps in AUTOFS_MAP_DIR
|
||||||
|
@@ -373,14 +377,27 @@ static int read_file_source_instance(str
|
||||||
|
char src_prog[] = "program";
|
||||||
|
struct stat st;
|
||||||
|
char *type, *format;
|
||||||
|
+ char *path;
|
||||||
|
+
|
||||||
|
+ if (map->argc < 1) {
|
||||||
|
+ error(ap->logopt, "invalid arguments for autofs_point");
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (stat(map->argv[0], &st) == -1) {
|
||||||
|
- warn(ap->logopt, "file map %s not found", map->argv[0]);
|
||||||
|
+ path = find_map_path(ap, map);
|
||||||
|
+ if (!path)
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
+
|
||||||
|
+ if (stat(path, &st) == -1) {
|
||||||
|
+ warn(ap->logopt, "file map %s not found", path);
|
||||||
|
+ free(path);
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!S_ISREG(st.st_mode))
|
||||||
|
+ if (!S_ISREG(st.st_mode)) {
|
||||||
|
+ free(path);
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (st.st_mode & __S_IEXEC)
|
||||||
|
type = src_prog;
|
||||||
|
@@ -391,9 +408,23 @@ static int read_file_source_instance(str
|
||||||
|
|
||||||
|
instance = master_find_source_instance(map, type, format, 0, NULL);
|
||||||
|
if (!instance) {
|
||||||
|
- int argc = map->argc;
|
||||||
|
- const char **argv = map->argv;
|
||||||
|
+ const char **argv;
|
||||||
|
+ int argc;
|
||||||
|
+
|
||||||
|
+ argc = map->argc;
|
||||||
|
+ argv = copy_argv(map->argc, map->argv);
|
||||||
|
+ if (!argv) {
|
||||||
|
+ error(ap->logopt, "failed to copy args");
|
||||||
|
+ free(path);
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
+ }
|
||||||
|
+ if (argv[0])
|
||||||
|
+ free((char *) argv[0]);
|
||||||
|
+ argv[0] = path;
|
||||||
|
+ path = NULL;
|
||||||
|
+
|
||||||
|
instance = master_add_source_instance(map, type, format, age, argc, argv);
|
||||||
|
+ free_argv(argc, argv);
|
||||||
|
if (!instance)
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
instance->recurse = map->recurse;
|
||||||
|
@@ -401,6 +432,9 @@ static int read_file_source_instance(str
|
||||||
|
}
|
||||||
|
instance->stale = map->stale;
|
||||||
|
|
||||||
|
+ if (path)
|
||||||
|
+ free(path);
|
||||||
|
+
|
||||||
|
return do_read_map(ap, instance, age);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -476,16 +510,11 @@ static int lookup_map_read_map(struct au
|
||||||
|
static enum nsswitch_status read_map_source(struct nss_source *this,
|
||||||
|
struct autofs_point *ap, struct map_source *map, time_t age)
|
||||||
|
{
|
||||||
|
- enum nsswitch_status result;
|
||||||
|
- struct map_source tmap;
|
||||||
|
- char *path;
|
||||||
|
-
|
||||||
|
if (strcasecmp(this->source, "files")) {
|
||||||
|
return read_source_instance(ap, map, this->source, age);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * autofs built-in map for nsswitch "files" is "file".
|
||||||
|
* This is a special case as we need to append the
|
||||||
|
* normal location to the map name.
|
||||||
|
* note: It's invalid to specify a relative path.
|
||||||
|
@@ -496,50 +525,7 @@ static enum nsswitch_status read_map_sou
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
- this->source[4] = '\0';
|
||||||
|
- tmap.flags = map->flags;
|
||||||
|
- tmap.type = this->source;
|
||||||
|
- tmap.format = map->format;
|
||||||
|
- tmap.name = map->name;
|
||||||
|
- tmap.lookup = map->lookup;
|
||||||
|
- tmap.mc = map->mc;
|
||||||
|
- tmap.instance = map->instance;
|
||||||
|
- tmap.exp_timeout = map->exp_timeout;
|
||||||
|
- tmap.recurse = map->recurse;
|
||||||
|
- tmap.depth = map->depth;
|
||||||
|
- tmap.stale = map->stale;
|
||||||
|
- tmap.argc = 0;
|
||||||
|
- tmap.argv = NULL;
|
||||||
|
-
|
||||||
|
- path = find_map_path(ap, map);
|
||||||
|
- if (!path)
|
||||||
|
- return NSS_STATUS_UNKNOWN;
|
||||||
|
-
|
||||||
|
- if (map->argc >= 1) {
|
||||||
|
- tmap.argc = map->argc;
|
||||||
|
- tmap.argv = copy_argv(map->argc, map->argv);
|
||||||
|
- if (!tmap.argv) {
|
||||||
|
- error(ap->logopt, "failed to copy args");
|
||||||
|
- free(path);
|
||||||
|
- return NSS_STATUS_UNKNOWN;
|
||||||
|
- }
|
||||||
|
- if (tmap.argv[0])
|
||||||
|
- free((char *) tmap.argv[0]);
|
||||||
|
- tmap.argv[0] = path;
|
||||||
|
- } else {
|
||||||
|
- error(ap->logopt, "invalid arguments for autofs_point");
|
||||||
|
- free(path);
|
||||||
|
- return NSS_STATUS_UNKNOWN;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- pthread_cleanup_push(argv_cleanup, &tmap);
|
||||||
|
- result = read_file_source_instance(ap, &tmap, age);
|
||||||
|
- pthread_cleanup_pop(1);
|
||||||
|
-
|
||||||
|
- if (!map->instance)
|
||||||
|
- map->instance = tmap.instance;
|
||||||
|
-
|
||||||
|
- return result;
|
||||||
|
+ return read_file_source_instance(ap, map, age);
|
||||||
|
}
|
||||||
|
|
||||||
|
int lookup_nss_read_map(struct autofs_point *ap, struct map_source *source, time_t age)
|
||||||
|
@@ -925,17 +911,30 @@ static int lookup_name_file_source_insta
|
||||||
|
time_t age = monotonic_time(NULL);
|
||||||
|
struct stat st;
|
||||||
|
char *type, *format;
|
||||||
|
+ char *path;
|
||||||
|
|
||||||
|
if (*name == '/' && map->flags & MAP_FLAG_FORMAT_AMD)
|
||||||
|
return lookup_amd_instance(ap, map, name, name_len);
|
||||||
|
|
||||||
|
- if (stat(map->argv[0], &st) == -1) {
|
||||||
|
+ if (map->argc < 1) {
|
||||||
|
+ error(ap->logopt, "invalid arguments for autofs_point");
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ path = find_map_path(ap, map);
|
||||||
|
+ if (!path)
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
+
|
||||||
|
+ if (stat(path, &st) == -1) {
|
||||||
|
debug(ap->logopt, "file map not found");
|
||||||
|
+ free(path);
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!S_ISREG(st.st_mode))
|
||||||
|
+ if (!S_ISREG(st.st_mode)) {
|
||||||
|
+ free(path);
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (st.st_mode & __S_IEXEC)
|
||||||
|
type = src_prog;
|
||||||
|
@@ -946,15 +945,32 @@ static int lookup_name_file_source_insta
|
||||||
|
|
||||||
|
instance = master_find_source_instance(map, type, format, 0, NULL);
|
||||||
|
if (!instance) {
|
||||||
|
- int argc = map->argc;
|
||||||
|
- const char **argv = map->argv;
|
||||||
|
+ const char **argv;
|
||||||
|
+ int argc;
|
||||||
|
+
|
||||||
|
+ argc = map->argc;
|
||||||
|
+ argv = copy_argv(map->argc, map->argv);
|
||||||
|
+ if (!argv) {
|
||||||
|
+ error(ap->logopt, "failed to copy args");
|
||||||
|
+ free(path);
|
||||||
|
+ return NSS_STATUS_UNKNOWN;
|
||||||
|
+ }
|
||||||
|
+ if (argv[0])
|
||||||
|
+ free((char *) argv[0]);
|
||||||
|
+ argv[0] = path;
|
||||||
|
+ path = NULL;
|
||||||
|
+
|
||||||
|
instance = master_add_source_instance(map, type, format, age, argc, argv);
|
||||||
|
+ free_argv(argc, argv);
|
||||||
|
if (!instance)
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
instance->recurse = map->recurse;
|
||||||
|
instance->depth = map->depth;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (path)
|
||||||
|
+ free(path);
|
||||||
|
+
|
||||||
|
return do_lookup_mount(ap, instance, name, name_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1030,10 +1046,6 @@ static enum nsswitch_status lookup_map_n
|
||||||
|
struct autofs_point *ap, struct map_source *map,
|
||||||
|
const char *name, int name_len)
|
||||||
|
{
|
||||||
|
- enum nsswitch_status result;
|
||||||
|
- struct map_source tmap;
|
||||||
|
- char *path;
|
||||||
|
-
|
||||||
|
if (strcasecmp(this->source, "files"))
|
||||||
|
return lookup_name_source_instance(ap, map,
|
||||||
|
this->source, name, name_len);
|
||||||
|
@@ -1050,49 +1062,7 @@ static enum nsswitch_status lookup_map_n
|
||||||
|
return NSS_STATUS_NOTFOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
- this->source[4] = '\0';
|
||||||
|
- tmap.flags = map->flags;
|
||||||
|
- tmap.type = this->source;
|
||||||
|
- tmap.format = map->format;
|
||||||
|
- tmap.name = map->name;
|
||||||
|
- tmap.mc = map->mc;
|
||||||
|
- tmap.instance = map->instance;
|
||||||
|
- tmap.exp_timeout = map->exp_timeout;
|
||||||
|
- tmap.recurse = map->recurse;
|
||||||
|
- tmap.depth = map->depth;
|
||||||
|
- tmap.argc = 0;
|
||||||
|
- tmap.argv = NULL;
|
||||||
|
-
|
||||||
|
- path = find_map_path(ap, map);
|
||||||
|
- if (!path)
|
||||||
|
- return NSS_STATUS_UNKNOWN;
|
||||||
|
-
|
||||||
|
- if (map->argc >= 1) {
|
||||||
|
- tmap.argc = map->argc;
|
||||||
|
- tmap.argv = copy_argv(map->argc, map->argv);
|
||||||
|
- if (!tmap.argv) {
|
||||||
|
- error(ap->logopt, "failed to copy args");
|
||||||
|
- free(path);
|
||||||
|
- return NSS_STATUS_UNKNOWN;
|
||||||
|
- }
|
||||||
|
- if (tmap.argv[0])
|
||||||
|
- free((char *) tmap.argv[0]);
|
||||||
|
- tmap.argv[0] = path;
|
||||||
|
- } else {
|
||||||
|
- error(ap->logopt, "invalid arguments for autofs_point");
|
||||||
|
- free(path);
|
||||||
|
- return NSS_STATUS_UNKNOWN;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- result = lookup_name_file_source_instance(ap, &tmap, name, name_len);
|
||||||
|
-
|
||||||
|
- if (!map->instance)
|
||||||
|
- map->instance = tmap.instance;
|
||||||
|
-
|
||||||
|
- /* path is freed in free_argv */
|
||||||
|
- free_argv(tmap.argc, tmap.argv);
|
||||||
|
-
|
||||||
|
- return result;
|
||||||
|
+ return lookup_name_file_source_instance(ap, map, name, name_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct map_source *lookup_get_map_source(struct master_mapent *entry)
|
273
SOURCES/autofs-5.1.6-fix-autofs-mount-options-construction.patch
Normal file
273
SOURCES/autofs-5.1.6-fix-autofs-mount-options-construction.patch
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
autofs-5.1.6 - fix autofs mount options construction
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
There's an off by one length error in the autofs mount options
|
||||||
|
construction.
|
||||||
|
|
||||||
|
Consolidate the options construction into make_options_string() and
|
||||||
|
use snprintf() to verify the options length calculation is correct.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1
|
||||||
|
daemon/direct.c | 46 ++-----------------------
|
||||||
|
daemon/indirect.c | 23 +-----------
|
||||||
|
include/mounts.h | 3 +
|
||||||
|
lib/mounts.c | 98 +++++++++++++++++++++++++++++++++++++++++++++---------
|
||||||
|
5 files changed, 92 insertions(+), 79 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -80,6 +80,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix trailing dollar sun entry expansion.
|
||||||
|
- initialize struct addrinfo for getaddrinfo() calls.
|
||||||
|
- fix quoted string length calc in expandsunent().
|
||||||
|
+- fix autofs mount options construction.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -348,29 +348,10 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mp->options) {
|
||||||
|
- mp->options = make_options_string(ap->path, ap->kpipefd, str_direct);
|
||||||
|
+ mp->options = make_options_string(ap->path,
|
||||||
|
+ ap->kpipefd, str_direct, ap->flags);
|
||||||
|
if (!mp->options)
|
||||||
|
return 0;
|
||||||
|
-
|
||||||
|
- if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
|
||||||
|
- ((get_kver_major() == 5 && get_kver_minor() > 3) ||
|
||||||
|
- (get_kver_major() > 5))) {
|
||||||
|
- char *tmp = realloc(mp->options, strlen(mp->options) + 12);
|
||||||
|
- if (tmp) {
|
||||||
|
- strcat(tmp, ",strictexpire");
|
||||||
|
- mp->options = tmp;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if ((ap->flags & MOUNT_FLAG_IGNORE) &&
|
||||||
|
- ((get_kver_major() == 5 && get_kver_minor() > 4) ||
|
||||||
|
- (get_kver_major() > 5))) {
|
||||||
|
- char *tmp = realloc(mp->options, strlen(mp->options) + 7);
|
||||||
|
- if (tmp) {
|
||||||
|
- strcat(tmp, ",ignore");
|
||||||
|
- mp->options = tmp;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||||||
|
@@ -676,29 +657,10 @@ int mount_autofs_offset(struct autofs_po
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mp->options) {
|
||||||
|
- mp->options = make_options_string(ap->path, ap->kpipefd, str_offset);
|
||||||
|
+ mp->options = make_options_string(ap->path,
|
||||||
|
+ ap->kpipefd, str_offset, ap->flags);
|
||||||
|
if (!mp->options)
|
||||||
|
return MOUNT_OFFSET_OK;
|
||||||
|
-
|
||||||
|
- if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
|
||||||
|
- ((get_kver_major() == 5 && get_kver_minor() > 3) ||
|
||||||
|
- (get_kver_major() > 5))) {
|
||||||
|
- char *tmp = realloc(mp->options, strlen(mp->options) + 12);
|
||||||
|
- if (tmp) {
|
||||||
|
- strcat(tmp, ",strictexpire");
|
||||||
|
- mp->options = tmp;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if ((ap->flags & MOUNT_FLAG_IGNORE) &&
|
||||||
|
- ((get_kver_major() == 5 && get_kver_minor() > 4) ||
|
||||||
|
- (get_kver_major() > 5))) {
|
||||||
|
- char *tmp = realloc(mp->options, strlen(mp->options) + 7);
|
||||||
|
- if (tmp) {
|
||||||
|
- strcat(tmp, ",ignore");
|
||||||
|
- mp->options = tmp;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(mountpoint, root);
|
||||||
|
--- autofs-5.1.4.orig/daemon/indirect.c
|
||||||
|
+++ autofs-5.1.4/daemon/indirect.c
|
||||||
|
@@ -78,32 +78,13 @@ static int do_mount_autofs_indirect(stru
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- options = make_options_string(ap->path, ap->kpipefd, str_indirect);
|
||||||
|
+ options = make_options_string(ap->path,
|
||||||
|
+ ap->kpipefd, str_indirect, ap->flags);
|
||||||
|
if (!options) {
|
||||||
|
error(ap->logopt, "options string error");
|
||||||
|
goto out_err;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
|
||||||
|
- ((get_kver_major() == 5 && get_kver_minor() > 3) ||
|
||||||
|
- (get_kver_major() > 5))) {
|
||||||
|
- char *tmp = realloc(options, strlen(options) + 12);
|
||||||
|
- if (tmp) {
|
||||||
|
- strcat(tmp, ",strictexpire");
|
||||||
|
- options = tmp;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if ((ap->flags & MOUNT_FLAG_IGNORE) &&
|
||||||
|
- ((get_kver_major() == 5 && get_kver_minor() > 4) ||
|
||||||
|
- (get_kver_major() > 5))) {
|
||||||
|
- char *tmp = realloc(options, strlen(options) + 7);
|
||||||
|
- if (tmp) {
|
||||||
|
- strcat(tmp, ",ignore");
|
||||||
|
- options = tmp;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* In case the directory doesn't exist, try to mkdir it */
|
||||||
|
if (mkdir_path(root, mp_mode) < 0) {
|
||||||
|
if (errno != EEXIST && errno != EROFS) {
|
||||||
|
--- autofs-5.1.4.orig/include/mounts.h
|
||||||
|
+++ autofs-5.1.4/include/mounts.h
|
||||||
|
@@ -94,7 +94,8 @@ void free_amd_entry_list(struct list_hea
|
||||||
|
unsigned int query_kproto_ver(void);
|
||||||
|
unsigned int get_kver_major(void);
|
||||||
|
unsigned int get_kver_minor(void);
|
||||||
|
-char *make_options_string(char *path, int kernel_pipefd, const char *extra);
|
||||||
|
+char *make_options_string(char *path, int pipefd,
|
||||||
|
+ const char *type, unsigned int flags);
|
||||||
|
char *make_mnt_name_string(char *path);
|
||||||
|
int ext_mount_add(struct list_head *, const char *, unsigned int);
|
||||||
|
int ext_mount_remove(struct list_head *, const char *);
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -599,43 +599,111 @@ void free_amd_entry_list(struct list_hea
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int cacl_max_options_len(unsigned int flags)
|
||||||
|
+{
|
||||||
|
+ unsigned int kver_major = get_kver_major();
|
||||||
|
+ unsigned int kver_minor = get_kver_minor();
|
||||||
|
+ int max_len;
|
||||||
|
+
|
||||||
|
+ /* %d and %u are maximum lenght of 10 and mount type is maximum
|
||||||
|
+ * length of 9 (e. ",indirect").
|
||||||
|
+ * The base temaplate is "fd=%d,pgrp=%u,minproto=5,maxproto=%d"
|
||||||
|
+ * plus the length of mount type plus 1 for the NULL.
|
||||||
|
+ */
|
||||||
|
+ max_len = 79 + 1;
|
||||||
|
+
|
||||||
|
+ if (kver_major < 5 || (kver_major == 5 && kver_minor < 4))
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ /* maybe add ",strictexpire" */
|
||||||
|
+ if (flags & MOUNT_FLAG_STRICTEXPIRE)
|
||||||
|
+ max_len += 13;
|
||||||
|
+
|
||||||
|
+ if (kver_major == 5 && kver_minor < 5)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ /* maybe add ",ignore" */
|
||||||
|
+ if (flags & MOUNT_FLAG_IGNORE)
|
||||||
|
+ max_len += 7;
|
||||||
|
+out:
|
||||||
|
+ return max_len;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Make common autofs mount options string
|
||||||
|
*/
|
||||||
|
-char *make_options_string(char *path, int pipefd, const char *extra)
|
||||||
|
+char *make_options_string(char *path, int pipefd,
|
||||||
|
+ const char *type, unsigned int flags)
|
||||||
|
{
|
||||||
|
+ unsigned int kver_major = get_kver_major();
|
||||||
|
+ unsigned int kver_minor = get_kver_minor();
|
||||||
|
char *options;
|
||||||
|
- int len;
|
||||||
|
+ int max_len, len, new;
|
||||||
|
|
||||||
|
- options = malloc(MAX_OPTIONS_LEN + 1);
|
||||||
|
+ max_len = cacl_max_options_len(flags);
|
||||||
|
+
|
||||||
|
+ options = malloc(max_len);
|
||||||
|
if (!options) {
|
||||||
|
logerr("can't malloc options string");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (extra)
|
||||||
|
- len = snprintf(options, MAX_OPTIONS_LEN,
|
||||||
|
+ if (type)
|
||||||
|
+ len = snprintf(options, max_len,
|
||||||
|
options_template_extra,
|
||||||
|
pipefd, (unsigned) getpgrp(),
|
||||||
|
- AUTOFS_MAX_PROTO_VERSION, extra);
|
||||||
|
+ AUTOFS_MAX_PROTO_VERSION, type);
|
||||||
|
else
|
||||||
|
- len = snprintf(options, MAX_OPTIONS_LEN, options_template,
|
||||||
|
+ len = snprintf(options, max_len, options_template,
|
||||||
|
pipefd, (unsigned) getpgrp(),
|
||||||
|
AUTOFS_MAX_PROTO_VERSION);
|
||||||
|
|
||||||
|
- if (len >= MAX_OPTIONS_LEN) {
|
||||||
|
- logerr("buffer to small for options - truncated");
|
||||||
|
- len = MAX_OPTIONS_LEN - 1;
|
||||||
|
+ if (len < 0)
|
||||||
|
+ goto error_out;
|
||||||
|
+
|
||||||
|
+ if (len >= max_len)
|
||||||
|
+ goto truncated;
|
||||||
|
+
|
||||||
|
+ if (kver_major < 5 || (kver_major == 5 && kver_minor < 4))
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ /* maybe add ",strictexpire" */
|
||||||
|
+ if (flags & MOUNT_FLAG_STRICTEXPIRE) {
|
||||||
|
+ new = snprintf(options + len,
|
||||||
|
+ max_len, "%s", ",strictexpire");
|
||||||
|
+ if (new < 0)
|
||||||
|
+ goto error_out;
|
||||||
|
+ len += new;
|
||||||
|
+ if (len >= max_len)
|
||||||
|
+ goto truncated;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (len < 0) {
|
||||||
|
- logerr("failed to malloc autofs mount options for %s", path);
|
||||||
|
- free(options);
|
||||||
|
- return NULL;
|
||||||
|
+ if (kver_major == 5 && kver_minor < 5)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ /* maybe add ",ignore" */
|
||||||
|
+ if (flags & MOUNT_FLAG_IGNORE) {
|
||||||
|
+ new = snprintf(options + len,
|
||||||
|
+ max_len, "%s", ",ignore");
|
||||||
|
+ if (new < 0)
|
||||||
|
+ goto error_out;
|
||||||
|
+ len += new;
|
||||||
|
+ if (len >= max_len)
|
||||||
|
+ goto truncated;
|
||||||
|
}
|
||||||
|
+out:
|
||||||
|
options[len] = '\0';
|
||||||
|
-
|
||||||
|
return options;
|
||||||
|
+
|
||||||
|
+truncated:
|
||||||
|
+ logerr("buffer to small for options - truncated");
|
||||||
|
+ len = max_len -1;
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+error_out:
|
||||||
|
+ logerr("error constructing mount options string for %s", path);
|
||||||
|
+ free(options);
|
||||||
|
+ return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *make_mnt_name_string(char *path)
|
@ -0,0 +1,52 @@
|
|||||||
|
autofs-5.1.6 - fix browse dir not re-created on symlink expire
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
If symlinks are being used for mounts and the autofs mount has browse mode
|
||||||
|
enabled when a symlink is removed at expire the browse mode directory needs
|
||||||
|
to be re-created.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/automount.c | 19 +++++++++++++++++++
|
||||||
|
2 files changed, 20 insertions(+)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -115,6 +115,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- remove unused function dump_master().
|
||||||
|
- fix additional typing errors.
|
||||||
|
- make bind mounts propagation slave by default.
|
||||||
|
+- fix browse dir not re-created on symlink expire.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/automount.c
|
||||||
|
+++ autofs-5.1.4/daemon/automount.c
|
||||||
|
@@ -651,6 +651,25 @@ int umount_multi(struct autofs_point *ap
|
||||||
|
"failed to remove symlink %s", path);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
+ /* Check if the autofs mount has browse mode enabled.
|
||||||
|
+ * If so re-create the directory entry.
|
||||||
|
+ */
|
||||||
|
+ if (ap->flags | MOUNT_FLAG_GHOST) {
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ /* If the browse directory create fails log an
|
||||||
|
+ * error and continue anyway since the expire
|
||||||
|
+ * has succeeded.
|
||||||
|
+ */
|
||||||
|
+ ret = mkdir_path(path, mp_mode);
|
||||||
|
+ if (ret && errno != EEXIST) {
|
||||||
|
+ char buf[MAX_ERR_BUF];
|
||||||
|
+ char *estr;
|
||||||
|
+ estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
||||||
|
+ warn(ap->logopt,
|
||||||
|
+ "mkdir_path %s failed: %s", path, estr);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
/* Check for an external mount and attempt umount if needed */
|
||||||
|
mounts_mutex_lock(ap);
|
||||||
|
entry = __master_find_amdmount(ap, path);
|
@ -0,0 +1,40 @@
|
|||||||
|
autofs-5.1.6 - fix direct mount unlink_mount_tree() path
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Oops!
|
||||||
|
|
||||||
|
The path used if unlink_mount_tree() is called for direct mount entries
|
||||||
|
is not correct, fix it.
|
||||||
|
|
||||||
|
Note: the mount table handling has changed and using the --force option
|
||||||
|
with automount when direct mount maps are large will result in somewhat
|
||||||
|
larger overhead.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
daemon/direct.c | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -83,6 +83,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix autofs mount options construction.
|
||||||
|
- mount_nfs.c fix local rdma share not mounting.
|
||||||
|
- fix incorrect systemctl command syntax in autofs(8).
|
||||||
|
+- fix direct mount unlink_mount_tree() path.
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/daemon/direct.c
|
||||||
|
+++ autofs-5.1.4/daemon/direct.c
|
||||||
|
@@ -311,7 +311,7 @@ int do_mount_autofs_direct(struct autofs
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = unlink_mount_tree(ap, ap->path);
|
||||||
|
+ ret = unlink_mount_tree(ap, me->key);
|
||||||
|
if (!ret) {
|
||||||
|
error(ap->logopt,
|
||||||
|
"already mounted as other than autofs "
|
36
SOURCES/autofs-5.1.6-fix-double-quoting-in-auto.smb.patch
Normal file
36
SOURCES/autofs-5.1.6-fix-double-quoting-in-auto.smb.patch
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
autofs-5.1.6 - fix double quoting in auto.smb
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The example program mount script installed to /etc/auto.smb incorrectly
|
||||||
|
adds a quote for the trailing dollar of special Windows mounts. But they
|
||||||
|
are already surrounded by double quotes. This may have been handled by
|
||||||
|
mount.cifs at some point but it's failing now.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
samples/auto.smb | 2 --
|
||||||
|
2 files changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/samples/auto.smb
|
||||||
|
+++ autofs-5.1.4/samples/auto.smb
|
||||||
|
@@ -75,8 +75,6 @@ $SMBCLIENT $smbopts -gL "$key" 2>/dev/nu
|
||||||
|
dir = $2
|
||||||
|
loc = $2
|
||||||
|
# Enclose mount dir and location in quotes
|
||||||
|
- # Double quote "$" in location as it is special
|
||||||
|
- gsub(/\$$/, "\\$", loc);
|
||||||
|
gsub(/\&/,"\\\\&",loc)
|
||||||
|
print " \\\n\t \"/" dir "\"", "\"://" key "/" loc "\""
|
||||||
|
}
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -81,6 +81,7 @@
|
||||||
|
- fix kernel mount status notification.
|
||||||
|
- fix set open file limit.
|
||||||
|
- improve descriptor open error reporting.
|
||||||
|
+- fix double quoting in auto.smb.
|
||||||
|
|
||||||
|
xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix flag file permission.
|
@ -0,0 +1,35 @@
|
|||||||
|
autofs-5.1.6 - fix double quoting of ampersand in auto.smb as well
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
The example program mount script installed to /etc/auto.smb incorrectly
|
||||||
|
adds a quote for the & character that causes mount failures. But the
|
||||||
|
produced map entry is already surrounded by double quotes. This may have
|
||||||
|
been handled by mount.cifs at some point but it's failing now.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
samples/auto.smb | 1 -
|
||||||
|
2 files changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/samples/auto.smb
|
||||||
|
+++ autofs-5.1.4/samples/auto.smb
|
||||||
|
@@ -75,7 +75,6 @@ $SMBCLIENT $smbopts -gL "$key" 2>/dev/nu
|
||||||
|
dir = $2
|
||||||
|
loc = $2
|
||||||
|
# Enclose mount dir and location in quotes
|
||||||
|
- gsub(/\&/,"\\\\&",loc)
|
||||||
|
print " \\\n\t \"/" dir "\"", "\"://" key "/" loc "\""
|
||||||
|
}
|
||||||
|
END { if (!first) print "\n"; else exit 1 }
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -82,6 +82,7 @@
|
||||||
|
- fix set open file limit.
|
||||||
|
- improve descriptor open error reporting.
|
||||||
|
- fix double quoting in auto.smb.
|
||||||
|
+- fix double quoting of ampersand in auto.smb as well.
|
||||||
|
|
||||||
|
xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix flag file permission.
|
@ -0,0 +1,47 @@
|
|||||||
|
autofs-5.1.6 - fix empty mounts list return from unlink_mount_tree()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
If there are no appropriate mounts found by get_mnt_list() then
|
||||||
|
unlink_mount_tree() should return 1 not 0 since if there are no
|
||||||
|
mounts to umount this shouldn't cause a failure return.
|
||||||
|
|
||||||
|
Also, if a real error occurs in get_mnt_list() we should check for
|
||||||
|
it and return a failure from unlink_mount_tree() since that would
|
||||||
|
be mount table not found or out of memory. If that's ignored things
|
||||||
|
would only get worse from that point.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/mounts.c | 8 ++++++--
|
||||||
|
2 files changed, 7 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -75,6 +75,7 @@
|
||||||
|
- fix direct mount deadlock.
|
||||||
|
- fix lookup_prune_one_cache() refactoring change.
|
||||||
|
- add missing description of null map option.
|
||||||
|
+- fix empty mounts list return from unlink_mount_tree().
|
||||||
|
|
||||||
|
xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix flag file permission.
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -2115,9 +2115,13 @@ int unlink_mount_tree(struct autofs_poin
|
||||||
|
struct mnt_list *mnts, *mnt;
|
||||||
|
int rv, ret = 1;
|
||||||
|
|
||||||
|
+ errno = 0;
|
||||||
|
mnts = get_mnt_list(mp, 1);
|
||||||
|
- if (!mnts)
|
||||||
|
- return 0;
|
||||||
|
+ if (!mnts) {
|
||||||
|
+ if (errno)
|
||||||
|
+ return 0;
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
for (mnt = mnts; mnt; mnt = mnt->next) {
|
||||||
|
if (mnt->flags & MNTS_AUTOFS)
|
@ -0,0 +1,33 @@
|
|||||||
|
autofs-5.1.6 - fix incorrect logical compare in unlink_mount_tree()
|
||||||
|
|
||||||
|
From: Ian Kent <raven@themaw.net>
|
||||||
|
|
||||||
|
Fix silly mistake using or instead of and in unlink_mount_tree().
|
||||||
|
|
||||||
|
Signed-off-by: Ian Kent <raven@themaw.net>
|
||||||
|
---
|
||||||
|
CHANGELOG | 1 +
|
||||||
|
lib/mounts.c | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- autofs-5.1.4.orig/CHANGELOG
|
||||||
|
+++ autofs-5.1.4/CHANGELOG
|
||||||
|
@@ -85,6 +85,7 @@ xx/xx/2018 autofs-5.1.5
|
||||||
|
- fix incorrect systemctl command syntax in autofs(8).
|
||||||
|
- fix direct mount unlink_mount_tree() path.
|
||||||
|
- fix unlink mounts umount order.
|
||||||
|
+- fix incorrect logical compare in unlink_mount_tree().
|
||||||
|
|
||||||
|
19/12/2017 autofs-5.1.4
|
||||||
|
- fix spec file url.
|
||||||
|
--- autofs-5.1.4.orig/lib/mounts.c
|
||||||
|
+++ autofs-5.1.4/lib/mounts.c
|
||||||
|
@@ -959,7 +959,7 @@ int unlink_mount_tree(struct autofs_poin
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (mnt = mnts; mnt; mnt = mnt->next) {
|
||||||
|
- if (mnt->flags | MNTS_AUTOFS)
|
||||||
|
+ if (mnt->flags & MNTS_AUTOFS)
|
||||||
|
rv = umount2(mnt->mp, MNT_DETACH);
|
||||||
|
else
|
||||||
|
rv = spawn_umount(ap->logopt, "-l", mnt->mp, NULL);
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user