diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch deleted file mode 100644 index e8288852..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch +++ /dev/null @@ -1,66 +0,0 @@ -autofs-5.1.4 - Makefiles.rules: remove 'samples' from SUBDIRS - -From: NeilBrown - -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 -Signed-off-by: Ian Kent ---- - 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..2464e741 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 - diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-account-for-libnsl-changes.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-account-for-libnsl-changes.patch deleted file mode 100644 index baf0af13..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-account-for-libnsl-changes.patch +++ /dev/null @@ -1,557 +0,0 @@ -autofs-5.1.4 - account for recent libnsl changes - -From: Ian Kent - -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 - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory -+ 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) diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-NULL-check-in-prepare_attempt_prefix.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-NULL-check-in-prepare_attempt_prefix.patch deleted file mode 100644 index 72297326..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-NULL-check-in-prepare_attempt_prefix.patch +++ /dev/null @@ -1,38 +0,0 @@ -autofs-5.1.4 - add NULL check in prepare_attempt_prefix() - -From: Ian Kent - -prepare_attempt_prefix() calls calloc(3) and continues without -checking if the allocation succeeded. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - lib/log.c | 2 ++ - 2 files changed, 3 insertions(+) - -diff --git a/CHANGELOG b/CHANGELOG -index 0a56df5a..ad9932a2 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -43,6 +43,7 @@ xx/xx/2018 autofs-5.1.5 - - better handle hesiod support not built in. - - fix indent in automount(8) man page. - - remove autofs4 module load code. -+- add NULL check in prepare_attempt_prefix(). - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/lib/log.c b/lib/log.c -index f6ab77c1..41f95fe8 100644 ---- a/lib/log.c -+++ b/lib/log.c -@@ -44,6 +44,8 @@ static char *prepare_attempt_prefix(const char *msg) - - 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); diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch deleted file mode 100644 index ff3f5cc6..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch +++ /dev/null @@ -1,42 +0,0 @@ -autofs-5.1.4 - add an example fedfs master map entry to the installed master map - -From: Ian Kent - -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 ---- - 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. - # diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch deleted file mode 100644 index 536165e8..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch +++ /dev/null @@ -1,184 +0,0 @@ -autofs-5.1.4 - add conditional inclusion of fedfs binaries - -From: Ian Kent - -Add conditional inclusion of the fedfs binaries. - -Using configure a --with-fedfs is needed to build and install -the fedfs binaries. - -Using rpmbuild -tb it's necessary to add the option ---without fedfs to exclude the fedfs binaries from the resulting -rpm package. - -Signed-off-by: Ian Kent ---- - 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() diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch deleted file mode 100644 index 814ae30f..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch +++ /dev/null @@ -1,121 +0,0 @@ -autofs-5.1.4 - add error handling for ext_mount_add() - -From: Ian Kent - -Add error handling (memory allocation failures) for ext_mount_add(). - -Signed-off-by: Ian Kent ---- - 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); diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch deleted file mode 100644 index 68633045..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch +++ /dev/null @@ -1,402 +0,0 @@ -autofs-5.1.4 - add fedfs-getsrvinfo.c - -From: Ian Kent - -Add the fedfs domain information discovery library functions. - -Signed-off-by: Ian Kent ---- - 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 -+#endif -+ -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#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_ */ diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-map-nfs4_c.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-map-nfs4_c.patch deleted file mode 100644 index 1563f68e..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-map-nfs4_c.patch +++ /dev/null @@ -1,342 +0,0 @@ -autofs-5.1.4 - add fedfs-map-nfs4.c - -From: Ian Kent - -Add build (and install) of the fedfs program map, fedfs-map-nfs4. - -Signed-off-by: Ian Kent ---- - 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 -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#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 -+ * -+ * 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 -+ -+/** -+ * 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 */ diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch deleted file mode 100644 index a7607f15..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch +++ /dev/null @@ -1,44 +0,0 @@ -autofs-5.1.4 - add-man page note about extra slashes in paths - -From: Ian Kent - -Make note of the effect unnecessary multiple slashes can have in map -paths in auto.master(5). - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - man/auto.master.5.in | 8 ++++++++ - 2 files changed, 9 insertions(+) - -diff --git a/CHANGELOG b/CHANGELOG -index 92e60df9..14eb1de8 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -26,6 +26,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. -diff --git a/man/auto.master.5.in b/man/auto.master.5.in -index 55a6acd0..e9afb97f 100644 ---- a/man/auto.master.5.in -+++ b/man/auto.master.5.in -@@ -66,6 +66,14 @@ will process the map according to the specification described below for - 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 diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-master-map-pseudo-options-for-mount-propagation.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-master-map-pseudo-options-for-mount-propagation.patch deleted file mode 100644 index 21425dd9..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-master-map-pseudo-options-for-mount-propagation.patch +++ /dev/null @@ -1,191 +0,0 @@ -autofs-5.1.4 - add master map pseudo options for mount propagation - -From: Ian Kent - -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 ---- - 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(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 88829564..4765a66e 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -35,6 +35,7 @@ xx/xx/2018 autofs-5.1.5 - - fix program usage message. - - 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. -diff --git a/include/automount.h b/include/automount.h -index e5c19d23..417dacbb 100644 ---- a/include/automount.h -+++ b/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 */ -diff --git a/lib/master_parse.y b/lib/master_parse.y -index 5d687a70..84ca5ca1 100644 ---- a/lib/master_parse.y -+++ b/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 map - %type 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 *buffer, unsigned int default_timeout, unsigne - 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) -diff --git a/lib/master_tok.l b/lib/master_tok.l -index 41ac4995..f4e940ce 100644 ---- a/lib/master_tok.l -+++ b/lib/master_tok.l -@@ -389,6 +389,8 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTWS}) - -?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); } -diff --git a/man/auto.master.5.in b/man/auto.master.5.in -index e9afb97f..68242d45 100644 ---- a/man/auto.master.5.in -+++ b/man/auto.master.5.in -@@ -199,6 +199,18 @@ entries only, either in the master map (so it effects all map entries) - 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 -diff --git a/modules/mount_bind.c b/modules/mount_bind.c -index fe1ad9b6..b64cdccc 100644 ---- a/modules/mount_bind.c -+++ b/modules/mount_bind.c -@@ -186,17 +186,25 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int - 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 { diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-mount_fedfs_c.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-mount_fedfs_c.patch deleted file mode 100644 index 9bda028a..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-mount_fedfs_c.patch +++ /dev/null @@ -1,696 +0,0 @@ -autofs-5.1.4 - add mount.fedfs.c - -From: Ian Kent - -Add build and install of the mount.fedfs binary. - -Signed-off-by: Ian Kent ---- - 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 -+#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: " -+ "\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 -+#else -+# undef setlocale -+# define setlocale(Category, Locale) ({}) /* empty */ -+#endif -+ -+#ifdef ENABLE_NLS -+# include -+# 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 -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#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); -+} diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-systemd-service-command-line-option.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-systemd-service-command-line-option.patch deleted file mode 100644 index e7060caf..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-systemd-service-command-line-option.patch +++ /dev/null @@ -1,147 +0,0 @@ -autofs-5.1.4 - add systemd service command line option - -From: Ian Kent - -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 ---- - 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(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 4e1d9c98..21fc9ca7 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -47,6 +47,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. -diff --git a/daemon/automount.c b/daemon/automount.c -index c1360ed6..4628f20c 100644 ---- a/daemon/automount.c -+++ b/daemon/automount.c -@@ -1210,13 +1210,21 @@ static void become_daemon(unsigned int flags) - } - - /* 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(); -diff --git a/include/automount.h b/include/automount.h -index 848fd0be..45fde53e 100644 ---- a/include/automount.h -+++ b/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 -diff --git a/man/automount.8 b/man/automount.8 -index 68d2aaa3..9f92288e 100644 ---- a/man/automount.8 -+++ b/man/automount.8 -@@ -57,6 +57,10 @@ Define a global macro substitution variable. Global definitions - 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 -diff --git a/samples/autofs.service.in b/samples/autofs.service.in -index 281d31ef..175a806d 100644 ---- a/samples/autofs.service.in -+++ b/samples/autofs.service.in -@@ -6,7 +6,7 @@ Wants=network-online.target rpc-statd.service rpcbind.service - [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 diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-units-After-line-to-include-statd-service.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-units-After-line-to-include-statd-service.patch deleted file mode 100644 index be86b45c..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-units-After-line-to-include-statd-service.patch +++ /dev/null @@ -1,43 +0,0 @@ -autofs-5.1.4 - add units After line to include statd service - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - samples/autofs.service.in | 2 +- - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 1e11c3d5..b9925cf7 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -22,6 +22,7 @@ xx/xx/2018 autofs-5.1.5 - - improve hostname lookup error logging. - - fix rpm spec install premissions on auto.net and auto.smb. - - 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. -diff --git a/samples/autofs.service.in b/samples/autofs.service.in -index 918fc93c..766fc5a5 100644 ---- a/samples/autofs.service.in -+++ b/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] diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-better-handle-hesiod-support-not-built-in.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-better-handle-hesiod-support-not-built-in.patch deleted file mode 100644 index 5702d71f..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-better-handle-hesiod-support-not-built-in.patch +++ /dev/null @@ -1,138 +0,0 @@ -autofs-5.1.4 - better handle hesiod support not built in - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - lib/master_parse.y | 18 ++++++++++++++++-- - modules/amd_parse.y | 7 +++++++ - modules/parse_amd.c | 28 +++++++++++++++++++++++++--- - 4 files changed, 49 insertions(+), 5 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 5a317f12..8e9bd665 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -40,6 +40,7 @@ xx/xx/2018 autofs-5.1.5 - - fix incorrect locking in sss lookup. - - fix amd parser opts option handling. - - fix possible NULL pointer dereference in get_defaults_entry(). -+- better handle hesiod support not built in. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/lib/master_parse.y b/lib/master_parse.y -index 84ca5ca1..9aa57327 100644 ---- a/lib/master_parse.y -+++ b/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")) -diff --git a/modules/amd_parse.y b/modules/amd_parse.y -index be923c2f..17fd9b20 100644 ---- a/modules/amd_parse.y -+++ b/modules/amd_parse.y -@@ -574,6 +574,13 @@ static int match_map_option_map_type(char *map_option, char *type) - !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 */ -diff --git a/modules/parse_amd.c b/modules/parse_amd.c -index 7399d19e..0e48e5ce 100644 ---- a/modules/parse_amd.c -+++ b/modules/parse_amd.c -@@ -1871,15 +1871,25 @@ struct amd_entry *make_default_entry(struct autofs_point *ap, - 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_entry(struct autofs_point *ap, - * 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); - } diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch deleted file mode 100644 index c37517cd..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch +++ /dev/null @@ -1,146 +0,0 @@ -autofs-5.1.4 - change expire type naming to better reflect usage - -From: Ian Kent - -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 ---- - 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(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 14eb1de8..c5ebb7e0 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -27,6 +27,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. -+- change expire type naming to better reflect usage. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/daemon/direct.c b/daemon/direct.c -index 3fdecdb8..b885d12f 100644 ---- a/daemon/direct.c -+++ b/daemon/direct.c -@@ -841,7 +841,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; - -@@ -852,7 +852,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; -@@ -946,7 +946,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); -@@ -972,7 +972,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); -diff --git a/daemon/indirect.c b/daemon/indirect.c -index 03c081ed..438a0a21 100644 ---- a/daemon/indirect.c -+++ b/daemon/indirect.c -@@ -392,7 +392,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; -@@ -405,7 +405,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; -@@ -530,7 +530,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); -@@ -544,7 +544,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++; - } -diff --git a/daemon/state.c b/daemon/state.c -index cf835e05..ab235455 100644 ---- a/daemon/state.c -+++ b/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 autofs_point *ap, int now) - fatal(status); - - ea->ap = ap; -- ea->when = now; -+ ea->how = how; - ea->status = 1; - - if (ap->type == LKP_INDIRECT) -diff --git a/include/state.h b/include/state.h -index b44a353c..e3079c20 100644 ---- a/include/state.h -+++ b/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 */ - }; - diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-covarity-fixes-1.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-covarity-fixes-1.patch deleted file mode 100644 index 68505bde..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-covarity-fixes-1.patch +++ /dev/null @@ -1,434 +0,0 @@ -autofs-5.1.4 - covarity fixes 1 - -From: Ian Kent - -* 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 ---- - 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 +++++++++- - 10 files changed, 70 insertions(+), 13 deletions(-) - -diff --git a/lib/log.c b/lib/log.c -index 1a0bc3fa..f6ab77c1 100644 ---- a/lib/log.c -+++ b/lib/log.c -@@ -336,8 +336,7 @@ void log_to_syslog(void) - exit(1); - } - -- if (nullfd > 2) -- close(nullfd); -+ close(nullfd); - - return; - } -diff --git a/lib/macros.c b/lib/macros.c -index dfdca857..5def26da 100644 ---- a/lib/macros.c -+++ b/lib/macros.c -@@ -137,6 +137,7 @@ void macro_init(void) - - macro_init_done = 1; - macro_unlock(); -+ free(local_domain); - return; - } - -diff --git a/lib/master_parse.y b/lib/master_parse.y -index 761ade9b..5d687a70 100644 ---- a/lib/master_parse.y -+++ b/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"); -diff --git a/lib/mounts.c b/lib/mounts.c -index f46fab2b..a35503bf 100644 ---- a/lib/mounts.c -+++ b/lib/mounts.c -@@ -489,8 +489,10 @@ void add_std_amd_vars(struct substvar *sv) - 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); -+ } - } - } - -diff --git a/lib/parse_subs.c b/lib/parse_subs.c -index 841e81fd..cdda2e1a 100644 ---- a/lib/parse_subs.c -+++ b/lib/parse_subs.c -@@ -189,6 +189,7 @@ void free_selector(struct selector *selector) - free(s->func.arg2); - s = next; - } -+ free(selector); - return; - } - -diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c -index 9451c455..8b23627a 100644 ---- a/lib/rpc_subs.c -+++ b/lib/rpc_subs.c -@@ -389,6 +389,7 @@ static enum clnt_stat rpc_get_netid(const sa_family_t family, - } - - *netid = nc_netid; -+ break; - } - endnetconfig(handle); - free(nc_proto); -diff --git a/modules/amd_parse.y b/modules/amd_parse.y -index 1d72f190..5bd688d9 100644 ---- a/modules/amd_parse.y -+++ b/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; -diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c -index 37810e1c..06c96973 100644 ---- a/modules/lookup_ldap.c -+++ b/modules/lookup_ldap.c -@@ -1137,6 +1137,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt) - 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, struct lookup_context *ctxt) - "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, struct lookup_context *ctxt) - 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, struct lookup_context *ctxt) - 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, struct lookup_context *ctxt) - 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, struct lookup_context *ctxt) - 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 *master, time_t age, void *context) - } - } 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 *master, time_t age, void *context) - } - } 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 *master, time_t age, void *context) - 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 char *name, char **key) - *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_point *ap, struct map_source *source, - attrs[1] = info; - attrs[2] = NULL; - -+ enc_key1 = NULL; -+ enc_key2 = NULL; -+ - if (*qKey == '*' && qKey_len == 1) - *qKey = '/'; - else if (!strcasecmp(class, "nisObject")) { -diff --git a/modules/parse_amd.c b/modules/parse_amd.c -index 9543ced3..ea57270a 100644 ---- a/modules/parse_amd.c -+++ b/modules/parse_amd.c -@@ -1879,7 +1879,7 @@ struct amd_entry *make_default_entry(struct autofs_point *ap, - */ - 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_entry(struct autofs_point *ap, - */ - 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); - } -diff --git a/modules/parse_sun.c b/modules/parse_sun.c -index 536a9bc1..88dde0b2 100644 ---- a/modules/parse_sun.c -+++ b/modules/parse_sun.c -@@ -443,8 +443,10 @@ int parse_reinit(int argc, const char *const *argv, void **context) - - *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_point *ap, struct mapent *me, - 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); diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch deleted file mode 100644 index 456dc807..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch +++ /dev/null @@ -1,48 +0,0 @@ -autofs-5.1.4 - dont allow trailing slash in master map mount points - -From: Ian Kent - -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 ---- - 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 */ diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch deleted file mode 100644 index b95f0eaa..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch +++ /dev/null @@ -1,56 +0,0 @@ -autofs-5.1.4 - dont use array for path when not necessary - -From: Ian Kent - -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 ---- - 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)) diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch deleted file mode 100644 index b807372d..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch +++ /dev/null @@ -1,49 +0,0 @@ -autofs-5.1.4 - enable SIGUSR2 handling in rpm spec file - -From: Ian Kent - -Because the preferred usage is to leave busy mounts in place and -re-connect to them on start up the SIGUSR2 logic hasn't been used -or tested for a long time. - -But it can be useful so enable it so any problems with it can be -identified and resolved. - -It turns out that the SIGUSR2 forced shutdown behaves like a SIGUSR1 -prune expire excpet that autofs will shutdown if all current mounts -are expired. But the kernel currently won't trigger expires for -mounts that are in use so it doesn't function quite as intended. - -Enable the forced shutdown anyway so it will function if the kernel -supports it. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - autofs.spec | 1 + - 2 files changed, 2 insertions(+) - -diff --git a/CHANGELOG b/CHANGELOG -index 0b7983ea..740f804f 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -29,6 +29,7 @@ xx/xx/2018 autofs-5.1.5 - - add-man page note about extra slashes in paths. - - change expire type naming to better reflect usage. - - use defines for expire type. -+- enable SIGUSR2 handling in rpm spec file. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/autofs.spec b/autofs.spec -index f857d9da..6419e3e3 100644 ---- a/autofs.spec -+++ b/autofs.spec -@@ -97,6 +97,7 @@ LDFLAGS="-Wl,-z,now" \ - ./configure --libdir=%{_libdir} \ - --disable-mount-locking \ - --enable-ignore-busy \ -+ --enable-forced-shutdown \ - %{?systemd_configure_arg:} \ - %{?libtirpc_configure_arg:} \ - %{?fedfs_configure_arg:} diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-NFS-version-mask-usage.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-NFS-version-mask-usage.patch deleted file mode 100644 index bd4c7f2f..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-NFS-version-mask-usage.patch +++ /dev/null @@ -1,75 +0,0 @@ -autofs-5.1.4 - fix NFS version mask usage - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - include/replicated.h | 5 ++++- - modules/mount_nfs.c | 6 +++--- - 3 files changed, 8 insertions(+), 4 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index e3ada7e7..dd48bf71 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -24,6 +24,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. -diff --git a/include/replicated.h b/include/replicated.h -index 0f482d21..95ff1f0d 100644 ---- a/include/replicated.h -+++ b/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 -diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c -index 4cf0cd27..426c27bd 100644 ---- a/modules/mount_nfs.c -+++ b/modules/mount_nfs.c -@@ -86,11 +86,11 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int - 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. diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-age-setting-at-startup.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-age-setting-at-startup.patch deleted file mode 100644 index eac9e63e..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-age-setting-at-startup.patch +++ /dev/null @@ -1,46 +0,0 @@ -autofs-5.1.4 - fix age setting at startup - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - daemon/automount.c | 2 +- - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 740f804f..c39aa0e5 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -30,6 +30,7 @@ xx/xx/2018 autofs-5.1.5 - - change expire type naming to better reflect usage. - - use defines for expire type. - - enable SIGUSR2 handling in rpm spec file. -+- fix age setting at startup. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/daemon/automount.c b/daemon/automount.c -index 3fbfb9aa..99534295 100644 ---- a/daemon/automount.c -+++ b/daemon/automount.c -@@ -2606,7 +2606,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); - } - } diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-amd-parser-opts-option-handling.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-amd-parser-opts-option-handling.patch deleted file mode 100644 index 53f1b3bc..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-amd-parser-opts-option-handling.patch +++ /dev/null @@ -1,72 +0,0 @@ -autofs-5.1.4 - fix amd parser opts option handling - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - modules/amd_parse.y | 4 ++-- - modules/parse_amd.c | 4 +++- - 3 files changed, 6 insertions(+), 3 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index aa485e8f..0365a161 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -38,6 +38,7 @@ xx/xx/2018 autofs-5.1.5 - - add master map pseudo options for mount propagation. - - 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. -diff --git a/modules/amd_parse.y b/modules/amd_parse.y -index 5bd688d9..be923c2f 100644 ---- a/modules/amd_parse.y -+++ b/modules/amd_parse.y -@@ -401,7 +401,7 @@ option_assignment: MAP_OPTION OPTION_ASSIGN FS_TYPE - } - | 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_ASSIGN FS_TYPE - } - | 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; - } -diff --git a/modules/parse_amd.c b/modules/parse_amd.c -index ea57270a..627c3c00 100644 ---- a/modules/parse_amd.c -+++ b/modules/parse_amd.c -@@ -2136,6 +2136,7 @@ int parse_mount(struct autofs_point *ap, const char *name, - 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, const char *name, - - 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); diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch deleted file mode 100644 index 12bd077f..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch +++ /dev/null @@ -1,40 +0,0 @@ -autofs-5.1.4 - fix deadlock in dumpmaps - -From: Ian Kent - -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 ---- - 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++) diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-directory-create-permission.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-directory-create-permission.patch deleted file mode 100644 index 97230310..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-directory-create-permission.patch +++ /dev/null @@ -1,207 +0,0 @@ -autofs-5.1.4 - fix directory create permission - -From: Ian Kent - -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 ---- - 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; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch deleted file mode 100644 index 80d0a874..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch +++ /dev/null @@ -1,35 +0,0 @@ -autofs-5.1.4 - fix error return in do_nfs_mount() - -From: Ian Kent - -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); diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch deleted file mode 100644 index b4b9e2e3..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch +++ /dev/null @@ -1,50 +0,0 @@ -autofs-5.1.4 - fix fd leak in rpc_do_create_client() - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - lib/rpc_subs.c | 4 ++-- - 2 files changed, 3 insertions(+), 2 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index dd48bf71..92e60df9 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -25,6 +25,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. -diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c -index cc83e84d..9451c455 100644 ---- a/lib/rpc_subs.c -+++ b/lib/rpc_subs.c -@@ -183,7 +183,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i - 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 sockaddr *addr, struct conn_info *info, i - * 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; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-flag-file-permission.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-flag-file-permission.patch deleted file mode 100644 index c2f8fdb7..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-flag-file-permission.patch +++ /dev/null @@ -1,41 +0,0 @@ -autofs-5.1.4 - fix flag file permission - -From: Ian Kent - -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 ---- - 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; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-incorrect-locking-in-sss-lookup.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-incorrect-locking-in-sss-lookup.patch deleted file mode 100644 index 3f4d0fe5..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-incorrect-locking-in-sss-lookup.patch +++ /dev/null @@ -1,44 +0,0 @@ -autofs-5.1.4 - fix incorrect locking in sss lookup - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - modules/lookup_sss.c | 4 ++-- - 2 files changed, 3 insertions(+), 2 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 3bf86e84..aa485e8f 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -37,6 +37,7 @@ xx/xx/2018 autofs-5.1.5 - - set bind mount as propagation slave. - - add master map pseudo options for mount propagation. - - 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. -diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c -index 88ec1693..78598300 100644 ---- a/modules/lookup_sss.c -+++ b/modules/lookup_sss.c -@@ -786,9 +786,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * - * 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) { diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-indent-in-automount-8-man-page.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-indent-in-automount-8-man-page.patch deleted file mode 100644 index 1640651b..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-indent-in-automount-8-man-page.patch +++ /dev/null @@ -1,39 +0,0 @@ -autofs-5.1.4 - fix indent in automount(8) man page - -From: Ian Kent - -The .P paragraph directive resets paragraph indentation but -the following sentence belongs to the comand line option -above. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - man/automount.8 | 2 +- - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 8e9bd665..1a9296f5 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -41,6 +41,7 @@ xx/xx/2018 autofs-5.1.5 - - fix amd parser opts option handling. - - fix possible NULL pointer dereference in get_defaults_entry(). - - better handle hesiod support not built in. -+- fix indent in automount(8) man page. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/man/automount.8 b/man/automount.8 -index 1e15ecd2..68d2aaa3 100644 ---- a/man/automount.8 -+++ b/man/automount.8 -@@ -106,7 +106,7 @@ will lead to everything (debug logging) being logged witch can then also - be disabled, returning the daemon to verbose logging. This option can be - specified to change the logging priority of an already running automount - process. --.P -+ - The \fIpath\fP argument corresponds to the automounted - path name as specified in the master map. - .TP diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-libresolv-configure-check.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-libresolv-configure-check.patch deleted file mode 100644 index f6a9bb3e..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-libresolv-configure-check.patch +++ /dev/null @@ -1,94 +0,0 @@ -autofs-5.1.4 - fix libresolv configure check - -From: Ian Kent - -The libresolv functions are not found by AC_CHECK_LIB() unless -they are prefixed with "__". - -So change the library check to also look for __ during -the check. - -Signed-off-by: Ian Kent ---- - 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) - - # diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-monotonic_elapsed.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-monotonic_elapsed.patch deleted file mode 100644 index 17c5a6e7..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-monotonic_elapsed.patch +++ /dev/null @@ -1,49 +0,0 @@ -autofs-5.1.4 - fix monotonic_elapsed - -From: NeilBrown - -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 -Signed-off-by: Ian Kent ---- - 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; - } - diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-possible-NULL-pointer-access-in-get_defaults_entry.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-possible-NULL-pointer-access-in-get_defaults_entry.patch deleted file mode 100644 index d34d6fbd..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-possible-NULL-pointer-access-in-get_defaults_entry.patch +++ /dev/null @@ -1,38 +0,0 @@ -autofs-5.1.4 - fix possible NULL pointer dereference in get_defaults_entry() - -From: Ian Kent - -Function select_default_entry() can call make_default_entry() so a NULL -return is possible. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - modules/parse_amd.c | 2 +- - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 0365a161..5a317f12 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -39,6 +39,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. -+- fix possible NULL pointer dereference in get_defaults_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 627c3c00..7399d19e 100644 ---- a/modules/parse_amd.c -+++ b/modules/parse_amd.c -@@ -1998,7 +1998,7 @@ static struct amd_entry *get_defaults_entry(struct autofs_point *ap, - goto out; - } - entry = select_default_entry(ap, &dflts, sv); -- if (!entry->map_type) { -+ if (entry && !entry->map_type) { - /* - * If map type isn't given try to inherit from - * parent. A NULL map type is valid and means diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch deleted file mode 100644 index 4e3996be..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch +++ /dev/null @@ -1,55 +0,0 @@ -autofs-5.1.4 - fix prefix option handling in expand_entry() - -From: Ian Kent - -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 ---- - 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 diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-program-usage-message.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-program-usage-message.patch deleted file mode 100644 index 462a831b..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-program-usage-message.patch +++ /dev/null @@ -1,44 +0,0 @@ -autofs-5.1.4 - fix program usage message - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - daemon/automount.c | 6 +++++- - 2 files changed, 6 insertions(+), 1 deletion(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 70e043ee..f126de66 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -32,6 +32,7 @@ xx/xx/2018 autofs-5.1.5 - - enable SIGUSR2 handling in rpm spec file. - - fix age setting at startup. - - fix update_negative_cache() map source usage. -+- fix program usage message. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/daemon/automount.c b/daemon/automount.c -index 99534295..05ec8a62 100644 ---- a/daemon/automount.c -+++ b/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" diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch deleted file mode 100644 index 6b681e39..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch +++ /dev/null @@ -1,40 +0,0 @@ -autofs-5.1.4 - fix rpm spec install permissions on auto.net and auto.smb - -From: Ian Kent - -Commit 0da3f5695d removes execute permissions from the install of -auto.net and auto.smb. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - autofs.spec | 4 ++-- - 2 files changed, 3 insertions(+), 2 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 596590a8..a5b79dd6 100644 ---- a/CHANGELOG -+++ b/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. -+- fix rpm spec install premissions on auto.net and auto.smb. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/autofs.spec b/autofs.spec -index 2cb09ef0..ac3b0a3f 100644 ---- a/autofs.spec -+++ b/autofs.spec -@@ -131,8 +131,8 @@ 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 755 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net -+install -m 755 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 diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch deleted file mode 100644 index cefb27c2..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch +++ /dev/null @@ -1,48 +0,0 @@ -autofs-5.1.4 - fix sublink option not set from defaults - -From: Ian Kent - -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 ---- - 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; - } - diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-update_negative_cache-map-source-usage.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-update_negative_cache-map-source-usage.patch deleted file mode 100644 index ab8ee82a..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-update_negative_cache-map-source-usage.patch +++ /dev/null @@ -1,102 +0,0 @@ -autofs-5.1.4 - fix update_negative_cache() map source usage - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - daemon/lookup.c | 38 ++++++++++++++++++++++++++++++++++++-- - 2 files changed, 37 insertions(+), 2 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index c39aa0e5..70e043ee 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -31,6 +31,7 @@ xx/xx/2018 autofs-5.1.5 - - use defines for expire type. - - enable SIGUSR2 handling in rpm spec file. - - fix age setting at startup. -+- fix update_negative_cache() map source usage. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/daemon/lookup.c b/daemon/lookup.c -index 6a722b3b..418f01cb 100644 ---- a/daemon/lookup.c -+++ b/daemon/lookup.c -@@ -1100,6 +1100,37 @@ static enum nsswitch_status lookup_map_name(struct nss_source *this, - 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 autofs_point *ap, struct map_source *so - 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; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch deleted file mode 100644 index ff12fd93..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch +++ /dev/null @@ -1,55 +0,0 @@ -autofs-5.1.4 - fix use after free in do_master_list_reset() - -From: Ian Kent - -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 ---- - 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)) diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-parse_ldap_config.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-parse_ldap_config.patch deleted file mode 100644 index fb05d9b6..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-parse_ldap_config.patch +++ /dev/null @@ -1,38 +0,0 @@ -autofs-5.1.4 - fix use after free in parse_ldap_config() - -From: Ian Kent - -Commit a4a2af5f30 (covarity fixes) incorrecly frees local variable -authtype after assigning it to a lookup context structure member. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - modules/lookup_ldap.c | 2 -- - 2 files changed, 1 insertion(+), 2 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 4765a66e..3bf86e84 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -36,6 +36,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 use after free in parse_ldap_config(). - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c -index 06c96973..911a34a5 100644 ---- a/modules/lookup_ldap.c -+++ b/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) diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-improve-hostname-lookup-error-logging.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-improve-hostname-lookup-error-logging.patch deleted file mode 100644 index cfab93ec..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-improve-hostname-lookup-error-logging.patch +++ /dev/null @@ -1,123 +0,0 @@ -autofs-5.1.4 - improve hostname lookup error logging - -From: Ian Kent - -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 ---- - 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; - } diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch deleted file mode 100644 index 103612a4..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch +++ /dev/null @@ -1,43 +0,0 @@ -autofs-5.1.4 - make umount_ent() recognise forced umount - -From: Ian Kent - -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 ---- - lib/mounts.c | 16 +++++++++------- - 1 file changed, 9 insertions(+), 7 deletions(-) - -diff --git a/lib/mounts.c b/lib/mounts.c -index a35503bf..e4092d2f 100644 ---- a/lib/mounts.c -+++ b/lib/mounts.c -@@ -2029,14 +2029,16 @@ int umount_ent(struct autofs_point *ap, const char *path) - { - 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. diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-mark-removed-cache-entry-negative.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-mark-removed-cache-entry-negative.patch deleted file mode 100644 index ada4c0d2..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-mark-removed-cache-entry-negative.patch +++ /dev/null @@ -1,68 +0,0 @@ -autofs-5.1.4 - mark removed cache entry negative - -From: Ian Kent - -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 skipped. 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 stale 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 prevents further lookups from -using the stale entry. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - daemon/lookup.c | 12 +++++++++--- - 2 files changed, 10 insertions(+), 3 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index f126de66..42950d51 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -33,6 +33,7 @@ xx/xx/2018 autofs-5.1.5 - - fix age setting at startup. - - fix update_negative_cache() map source usage. - - fix program usage message. -+- mark removed cache entry negative. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/daemon/lookup.c b/daemon/lookup.c -index 418f01cb..18df9352 100644 ---- a/daemon/lookup.c -+++ b/daemon/lookup.c -@@ -1417,15 +1417,21 @@ void lookup_prune_one_cache(struct autofs_point *ap, struct mapent_cache *mc, ti - 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; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-move-close-stdio-descriptors-to-become_daemon.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-move-close-stdio-descriptors-to-become_daemon.patch deleted file mode 100644 index 6c62904a..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-move-close-stdio-descriptors-to-become_daemon.patch +++ /dev/null @@ -1,125 +0,0 @@ -autofs-5.1.4 - move close stdio descriptors to become_daemon() - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - daemon/automount.c | 27 ++++++++++++++++++++++++++- - include/log.h | 1 - - lib/log.c | 29 ----------------------------- - 4 files changed, 27 insertions(+), 31 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 4c5f276e..4e1d9c98 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -46,6 +46,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. -diff --git a/daemon/automount.c b/daemon/automount.c -index d891562a..c1360ed6 100644 ---- a/daemon/automount.c -+++ b/daemon/automount.c -@@ -1218,6 +1218,8 @@ static void become_daemon(unsigned int flags) - } - 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 flags) - 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 */ -diff --git a/include/log.h b/include/log.h -index 7a394cbe..c9b17b3c 100644 ---- a/include/log.h -+++ b/include/log.h -@@ -36,7 +36,6 @@ extern void set_log_debug_ap(struct autofs_point *ap); - 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, ...); -diff --git a/lib/log.c b/lib/log.c -index 41f95fe8..ca771d72 100644 ---- a/lib/log.c -+++ b/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) { diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-refactor-negative-map-entry-check.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-refactor-negative-map-entry-check.patch deleted file mode 100644 index 70939272..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-refactor-negative-map-entry-check.patch +++ /dev/null @@ -1,359 +0,0 @@ -autofs-5.1.4 - refactor negative map entry check - -From: Ian Kent - -Create a function to check for a negative map entry on lookup and use -it in each of the relevant modules. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - include/automount.h | 1 + - lib/cache.c | 30 ++++++++++++++++++++++++++++++ - modules/lookup_file.c | 22 ++-------------------- - modules/lookup_hesiod.c | 22 ++-------------------- - modules/lookup_hosts.c | 22 ++-------------------- - modules/lookup_ldap.c | 22 ++-------------------- - modules/lookup_nisplus.c | 22 ++-------------------- - modules/lookup_program.c | 22 ++-------------------- - modules/lookup_sss.c | 22 ++-------------------- - modules/lookup_yp.c | 22 ++-------------------- - 11 files changed, 48 insertions(+), 160 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 21fc9ca7..0de3f31b 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -48,6 +48,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. -+- refactor negative map entry check. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/include/automount.h b/include/automount.h -index 45fde53e..947daa10 100644 ---- a/include/automount.h -+++ b/include/automount.h -@@ -223,6 +223,7 @@ struct mapent *cache_partial_match(struct mapent_cache *mc, const char *prefix); - struct mapent *cache_partial_match_wild(struct mapent_cache *mc, const char *prefix); - int cache_add(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age); - int cache_update_offset(struct mapent_cache *mc, const char *mkey, const char *key, const char *mapent, time_t age); -+int cache_lookup_negative(struct mapent *me, const char *key); - void cache_update_negative(struct mapent_cache *mc, struct map_source *ms, const char *key, time_t timeout); - int cache_set_parents(struct mapent *mm); - int cache_update(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age); -diff --git a/lib/cache.c b/lib/cache.c -index 44e323dd..d3b6642b 100644 ---- a/lib/cache.c -+++ b/lib/cache.c -@@ -771,6 +771,36 @@ done: - return ret; - } - -+/* Called with cache_lock held for map entry me and is released -+ * on return. -+ */ -+int cache_lookup_negative(struct mapent *me, const char *key) -+{ -+ if (me->status >= monotonic_time(NULL)) { -+ cache_unlock(me->mc); -+ return CHE_UNAVAIL; -+ } else { -+ struct mapent_cache *smc = me->mc; -+ struct mapent *sme; -+ -+ if (me->mapent) -+ cache_unlock(smc); -+ else { -+ cache_unlock(smc); -+ cache_writelock(smc); -+ sme = cache_lookup_distinct(smc, key); -+ /* Negative timeout expired for non-existent entry. */ -+ if (sme && !sme->mapent) { -+ if (cache_pop_mapent(sme) == CHE_FAIL) -+ cache_delete(smc, key); -+ } -+ cache_unlock(smc); -+ } -+ } -+ -+ return CHE_OK; -+} -+ - void cache_update_negative(struct mapent_cache *mc, - struct map_source *ms, const char *key, - time_t timeout) -diff --git a/modules/lookup_file.c b/modules/lookup_file.c -index ed5caa47..6986830b 100644 ---- a/modules/lookup_file.c -+++ b/modules/lookup_file.c -@@ -1177,27 +1177,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * - /* Check if we recorded a mount fail for this key anywhere */ - me = lookup_source_mapent(ap, key, LKP_DISTINCT); - if (me) { -- if (me->status >= monotonic_time(NULL)) { -- cache_unlock(me->mc); -+ /* negative timeout has not passed, return fail */ -+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL) - return NSS_STATUS_NOTFOUND; -- } else { -- struct mapent_cache *smc = me->mc; -- struct mapent *sme; -- -- if (me->mapent) -- cache_unlock(smc); -- else { -- cache_unlock(smc); -- cache_writelock(smc); -- sme = cache_lookup_distinct(smc, key); -- /* Negative timeout expired for non-existent entry. */ -- if (sme && !sme->mapent) { -- if (cache_pop_mapent(sme) == CHE_FAIL) -- cache_delete(smc, key); -- } -- cache_unlock(smc); -- } -- } - } - - /* -diff --git a/modules/lookup_hesiod.c b/modules/lookup_hesiod.c -index b3278d20..54cf278c 100644 ---- a/modules/lookup_hesiod.c -+++ b/modules/lookup_hesiod.c -@@ -397,27 +397,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * - /* Check if we recorded a mount fail for this key anywhere */ - me = lookup_source_mapent(ap, name, LKP_DISTINCT); - if (me) { -- if (me->status >= monotonic_time(NULL)) { -- cache_unlock(me->mc); -+ /* negative timeout has not passed, return fail */ -+ if (cache_lookup_negative(me, name) == CHE_UNAVAIL) - return NSS_STATUS_NOTFOUND; -- } else { -- struct mapent_cache *smc = me->mc; -- struct mapent *sme; -- -- if (me->mapent) -- cache_unlock(smc); -- else { -- cache_unlock(smc); -- cache_writelock(smc); -- sme = cache_lookup_distinct(smc, name); -- /* Negative timeout expired for non-existent entry. */ -- if (sme && !sme->mapent) { -- if (cache_pop_mapent(sme) == CHE_FAIL) -- cache_delete(smc, name); -- } -- cache_unlock(smc); -- } -- } - } - - /* If this is not here the filesystem stays busy, for some reason... */ -diff --git a/modules/lookup_hosts.c b/modules/lookup_hosts.c -index 163b02d5..744062e2 100644 ---- a/modules/lookup_hosts.c -+++ b/modules/lookup_hosts.c -@@ -314,27 +314,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * - /* Check if we recorded a mount fail for this key anywhere */ - me = lookup_source_mapent(ap, name, LKP_DISTINCT); - if (me) { -- if (me->status >= monotonic_time(NULL)) { -- cache_unlock(me->mc); -+ /* negative timeout has not passed, return fail */ -+ if (cache_lookup_negative(me, name) == CHE_UNAVAIL) - return NSS_STATUS_NOTFOUND; -- } else { -- struct mapent_cache *smc = me->mc; -- struct mapent *sme; -- -- if (me->mapent) -- cache_unlock(smc); -- else { -- cache_unlock(smc); -- cache_writelock(smc); -- sme = cache_lookup_distinct(smc, name); -- /* Negative timeout expired for non-existent entry. */ -- if (sme && !sme->mapent) { -- if (cache_pop_mapent(sme) == CHE_FAIL) -- cache_delete(smc, name); -- } -- cache_unlock(smc); -- } -- } - } - - cache_readlock(mc); -diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c -index 911a34a5..f7432a2a 100644 ---- a/modules/lookup_ldap.c -+++ b/modules/lookup_ldap.c -@@ -3687,27 +3687,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * - /* Check if we recorded a mount fail for this key anywhere */ - me = lookup_source_mapent(ap, key, LKP_DISTINCT); - if (me) { -- if (me->status >= monotonic_time(NULL)) { -- cache_unlock(me->mc); -+ /* negative timeout has not passed, return fail */ -+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL) - return NSS_STATUS_NOTFOUND; -- } else { -- struct mapent_cache *smc = me->mc; -- struct mapent *sme; -- -- if (me->mapent) -- cache_unlock(smc); -- else { -- cache_unlock(smc); -- cache_writelock(smc); -- sme = cache_lookup_distinct(smc, key); -- /* Negative timeout expired for non-existent entry. */ -- if (sme && !sme->mapent) { -- if (cache_pop_mapent(sme) == CHE_FAIL) -- cache_delete(smc, key); -- } -- cache_unlock(smc); -- } -- } - } - - /* -diff --git a/modules/lookup_nisplus.c b/modules/lookup_nisplus.c -index 8dee4630..cbd03cdb 100644 ---- a/modules/lookup_nisplus.c -+++ b/modules/lookup_nisplus.c -@@ -709,27 +709,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * - /* Check if we recorded a mount fail for this key anywhere */ - me = lookup_source_mapent(ap, key, LKP_DISTINCT); - if (me) { -- if (me->status >= monotonic_time(NULL)) { -- cache_unlock(me->mc); -+ /* negative timeout has not passed, return fail */ -+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL) - return NSS_STATUS_NOTFOUND; -- } else { -- struct mapent_cache *smc = me->mc; -- struct mapent *sme; -- -- if (me->mapent) -- cache_unlock(smc); -- else { -- cache_unlock(smc); -- cache_writelock(smc); -- sme = cache_lookup_distinct(smc, key); -- /* Negative timeout expired for non-existent entry. */ -- if (sme && !sme->mapent) { -- if (cache_pop_mapent(sme) == CHE_FAIL) -- cache_delete(smc, key); -- } -- cache_unlock(smc); -- } -- } - } - - /* -diff --git a/modules/lookup_program.c b/modules/lookup_program.c -index 56e19394..fcb1af74 100644 ---- a/modules/lookup_program.c -+++ b/modules/lookup_program.c -@@ -601,27 +601,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * - /* Check if we recorded a mount fail for this key anywhere */ - me = lookup_source_mapent(ap, name, LKP_DISTINCT); - if (me) { -- if (me->status >= monotonic_time(NULL)) { -- cache_unlock(me->mc); -+ /* negative timeout has not passed, return fail */ -+ if (cache_lookup_negative(me, name) == CHE_UNAVAIL) - return NSS_STATUS_NOTFOUND; -- } else { -- struct mapent_cache *smc = me->mc; -- struct mapent *sme; -- -- if (me->mapent) -- cache_unlock(smc); -- else { -- cache_unlock(smc); -- cache_writelock(smc); -- sme = cache_lookup_distinct(smc, name); -- /* Negative timeout expired for non-existent entry. */ -- if (sme && !sme->mapent) { -- if (cache_pop_mapent(sme) == CHE_FAIL) -- cache_delete(smc, name); -- } -- cache_unlock(smc); -- } -- } - } - - /* Catch installed direct offset triggers */ -diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c -index 78598300..ce60acd3 100644 ---- a/modules/lookup_sss.c -+++ b/modules/lookup_sss.c -@@ -726,27 +726,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * - /* Check if we recorded a mount fail for this key anywhere */ - me = lookup_source_mapent(ap, key, LKP_DISTINCT); - if (me) { -- if (me->status >= monotonic_time(NULL)) { -- cache_unlock(me->mc); -+ /* negative timeout has not passed, return fail */ -+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL) - return NSS_STATUS_NOTFOUND; -- } else { -- struct mapent_cache *smc = me->mc; -- struct mapent *sme; -- -- if (me->mapent) -- cache_unlock(smc); -- else { -- cache_unlock(smc); -- cache_writelock(smc); -- sme = cache_lookup_distinct(smc, key); -- /* Negative timeout expired for non-existent entry. */ -- if (sme && !sme->mapent) { -- if (cache_pop_mapent(sme) == CHE_FAIL) -- cache_delete(smc, key); -- } -- cache_unlock(smc); -- } -- } - } - - /* -diff --git a/modules/lookup_yp.c b/modules/lookup_yp.c -index d1ffcae4..38f75497 100644 ---- a/modules/lookup_yp.c -+++ b/modules/lookup_yp.c -@@ -813,27 +813,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void * - /* Check if we recorded a mount fail for this key anywhere */ - me = lookup_source_mapent(ap, key, LKP_DISTINCT); - if (me) { -- if (me->status >= monotonic_time(NULL)) { -- cache_unlock(me->mc); -+ /* negative timeout has not passed, return fail */ -+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL) - return NSS_STATUS_NOTFOUND; -- } else { -- struct mapent_cache *smc = me->mc; -- struct mapent *sme; -- -- if (me->mapent) -- cache_unlock(smc); -- else { -- cache_unlock(smc); -- cache_writelock(smc); -- sme = cache_lookup_distinct(smc, key); -- /* Negative timeout expired for non-existent entry. */ -- if (sme && !sme->mapent) { -- if (cache_pop_mapent(sme) == CHE_FAIL) -- cache_delete(smc, key); -- } -- cache_unlock(smc); -- } -- } - } - - /* diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-autofs4-module-load-code.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-autofs4-module-load-code.patch deleted file mode 100644 index a953dbe2..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-autofs4-module-load-code.patch +++ /dev/null @@ -1,236 +0,0 @@ -autofs-5.1.4 - remove autofs4 module load code - -From: Ian Kent - -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 ---- - 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(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 1a9296f5..0a56df5a 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -42,6 +42,7 @@ xx/xx/2018 autofs-5.1.5 - - fix possible NULL pointer dereference in get_defaults_entry(). - - better handle hesiod support not built in. - - fix indent in automount(8) man page. -+- remove autofs4 module load code. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/configure b/configure -index 827921ba..2116668a 100755 ---- a/configure -+++ b/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 -diff --git a/configure.in b/configure.in -index 4b0a81f2..dbee99f4 100644 ---- a/configure.in -+++ b/configure.in -@@ -161,7 +161,6 @@ AF_PATH_INCLUDE(UMOUNT, umount, /bin/umount, $searchpath) - 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) -diff --git a/daemon/automount.c b/daemon/automount.c -index 05ec8a62..2c0def54 100644 ---- a/daemon/automount.c -+++ b/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, -diff --git a/daemon/module.c b/daemon/module.c -index b1a94f56..be96a82b 100644 ---- a/daemon/module.c -+++ b/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) - { -diff --git a/include/automount.h b/include/automount.h -index 417dacbb..eccd16aa 100644 ---- a/include/automount.h -+++ b/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 -diff --git a/include/config.h.in b/include/config.h.in -index 991a2bda..a4879494 100644 ---- a/include/config.h.in -+++ b/include/config.h.in -@@ -48,9 +48,6 @@ - /* Define to 1 if you have the 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 - diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-couple-of-undeeded-requires.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-couple-of-undeeded-requires.patch deleted file mode 100644 index f1ab5698..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-couple-of-undeeded-requires.patch +++ /dev/null @@ -1,38 +0,0 @@ -autofs-5.1.4 - remove couple of undeeded requires - -From: Ian Kent - -Remove a couple of apparently undeeded Requires entries from the tar -spec file. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - autofs.spec | 2 +- - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 2a551426..5e1bdf42 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -51,6 +51,7 @@ xx/xx/2018 autofs-5.1.5 - - refactor negative map entry check. - - remove unused function dump_master(). - - remove unused function dump_state_queue(). -+- remove couple of undeeded requires. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/autofs.spec b/autofs.spec -index 6419e3e3..53654437 100644 ---- a/autofs.spec -+++ b/autofs.spec -@@ -39,7 +39,7 @@ BuildRequires: libtirpc-devel - %endif - BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, cyrus-sasl-devel - Requires: chkconfig --Requires: /bin/bash mktemp sed textutils sh-utils grep /bin/ps -+Requires: /bin/bash sed grep /bin/ps - %if %{with_systemd} - Requires(post): systemd-sysv - Requires(post): systemd-units diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_master.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_master.patch deleted file mode 100644 index fc26fe7f..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_master.patch +++ /dev/null @@ -1,41 +0,0 @@ -autofs-5.1.4 - remove unused function dump_master() - -From: Ian Kent - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - lib/master.c | 11 ----------- - 2 files changed, 1 insertion(+), 11 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 0de3f31b..32e34e35 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -49,6 +49,7 @@ xx/xx/2018 autofs-5.1.5 - - move close stdio descriptors to become_daemon(). - - add systemd service command line option. - - refactor negative map entry check. -+- remove unused function dump_master(). - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/lib/master.c b/lib/master.c -index ba5272f0..5f3a3d99 100644 ---- a/lib/master.c -+++ b/lib/master.c -@@ -1965,14 +1965,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); -- } --} diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_state_queue.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_state_queue.patch deleted file mode 100644 index 5ff1246c..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_state_queue.patch +++ /dev/null @@ -1,57 +0,0 @@ -autofs-5.1.4 - remove unused function dump_state_queue() - -From: Ian Kent - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - daemon/state.c | 24 ------------------------ - 2 files changed, 1 insertion(+), 24 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 32e34e35..2a551426 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -50,6 +50,7 @@ xx/xx/2018 autofs-5.1.5 - - add systemd service command line option. - - refactor negative map entry check. - - remove unused function dump_master(). -+- remove unused function dump_state_queue(). - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/daemon/state.c b/daemon/state.c -index 3d91f5b1..ca9534c4 100644 ---- a/daemon/state.c -+++ b/daemon/state.c -@@ -52,30 +52,6 @@ void st_mutex_unlock(void) - fatal(status); - } - --void dump_state_queue(void) --{ -- struct list_head *head = &state_queue; -- struct list_head *p, *q; -- -- logmsg("dumping queue"); -- -- list_for_each(p, head) { -- struct state_queue *entry; -- -- entry = list_entry(p, struct state_queue, list); -- logmsg("queue list head path %s state %d busy %d", -- entry->ap->path, entry->state, entry->busy); -- -- list_for_each(q, &entry->pending) { -- struct state_queue *this; -- -- this = list_entry(q, struct state_queue, pending); -- logmsg("queue list entry path %s state %d busy %d", -- this->ap->path, this->state, this->busy); -- } -- } --} -- - void nextstate(int statefd, enum states next) - { - char buf[MAX_ERR_BUF]; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-set-bind-mount-as-propagation-slave.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-set-bind-mount-as-propagation-slave.patch deleted file mode 100644 index 50d238fb..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-set-bind-mount-as-propagation-slave.patch +++ /dev/null @@ -1,73 +0,0 @@ -autofs-5.1.4 - set bind mount as propagation slave - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - modules/mount_bind.c | 16 +++++++++++++++- - 2 files changed, 16 insertions(+), 1 deletion(-) - -diff --git a/CHANGELOG b/CHANGELOG -index 42950d51..88829564 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -34,6 +34,7 @@ xx/xx/2018 autofs-5.1.5 - - fix update_negative_cache() map source usage. - - fix program usage message. - - mark removed cache entry negative. -+- set bind mount as propagation slave. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/modules/mount_bind.c b/modules/mount_bind.c -index 5effa880..fe1ad9b6 100644 ---- a/modules/mount_bind.c -+++ b/modules/mount_bind.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - - #define MODULE_MOUNT - #include "automount.h" -@@ -183,8 +184,21 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int - 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]; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch deleted file mode 100644 index b91191d5..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch +++ /dev/null @@ -1,52 +0,0 @@ -autofs-5.1.4 - tiny patch for autofs typo and possible bug - -From: Todd Eigenschink - -(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 -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - lib/defaults.c | 6 +++--- - 2 files changed, 4 insertions(+), 3 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index a5b79dd6..1e11c3d5 100644 ---- a/CHANGELOG -+++ b/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. - - fix rpm spec install premissions on auto.net and auto.smb. -+- tiny patch for autofs typo and possible bug. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/lib/defaults.c b/lib/defaults.c -index d20c1907..ae4d27c1 100644 ---- a/lib/defaults.c -+++ b/lib/defaults.c -@@ -1207,12 +1207,12 @@ unsigned int defaults_read_config(unsigned int to_syslog) - - 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 */ diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-update-build-info-with-systemd.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-update-build-info-with-systemd.patch deleted file mode 100644 index 76c06971..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-update-build-info-with-systemd.patch +++ /dev/null @@ -1,45 +0,0 @@ -autofs-5.1.4 - update build info with systemd - -From: Ian Kent - -Update the show_build_info() function to include systemd -build info. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 + - daemon/automount.c | 9 +++++++++ - 2 files changed, 10 insertions(+) - -diff --git a/CHANGELOG b/CHANGELOG -index ad9932a2..b30e52c6 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -44,6 +44,7 @@ xx/xx/2018 autofs-5.1.5 - - fix indent in automount(8) man page. - - 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. -diff --git a/daemon/automount.c b/daemon/automount.c -index 2c0def54..a99d6b33 100644 ---- a/daemon/automount.c -+++ b/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 "); diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-use-defines-for-expire-type.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-use-defines-for-expire-type.patch deleted file mode 100644 index 9198be51..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-use-defines-for-expire-type.patch +++ /dev/null @@ -1,108 +0,0 @@ -autofs-5.1.4 - use defines for expire type - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - daemon/state.c | 8 ++++---- - include/linux/auto_fs4.h | 6 ++++-- - include/state.h | 2 +- - 4 files changed, 10 insertions(+), 7 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index c5ebb7e0..0b7983ea 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -28,6 +28,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. - - change expire type naming to better reflect usage. -+- use defines for expire type. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/daemon/state.c b/daemon/state.c -index ab235455..3d91f5b1 100644 ---- a/daemon/state.c -+++ b/daemon/state.c -@@ -645,7 +645,7 @@ static unsigned int st_prepare_shutdown(struct autofs_point *ap) - 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: -@@ -671,7 +671,7 @@ static unsigned int st_force_shutdown(struct autofs_point *ap) - 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: -@@ -706,7 +706,7 @@ static unsigned int st_prune(struct autofs_point *ap) - 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) -@@ -727,7 +727,7 @@ static unsigned int st_expire(struct autofs_point *ap) - 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) -diff --git a/include/linux/auto_fs4.h b/include/linux/auto_fs4.h -index e02982fa..9196e7bb 100644 ---- a/include/linux/auto_fs4.h -+++ b/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 -diff --git a/include/state.h b/include/state.h -index e3079c20..98f27d3f 100644 ---- a/include/state.h -+++ b/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 */ - }; - diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-use-flags-for-startup-boolean-options.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-use-flags-for-startup-boolean-options.patch deleted file mode 100644 index c41f96f1..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-use-flags-for-startup-boolean-options.patch +++ /dev/null @@ -1,225 +0,0 @@ -autofs-5.1.4 - use flags for startup boolean options - -From: Ian Kent - -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 ---- - CHANGELOG | 1 + - daemon/automount.c | 45 ++++++++++++++++++++++----------------------- - include/automount.h | 6 ++++++ - lib/master.c | 4 ++-- - 4 files changed, 31 insertions(+), 25 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index b30e52c6..4c5f276e 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -45,6 +45,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. -diff --git a/daemon/automount.c b/daemon/automount.c -index a99d6b33..d891562a 100644 ---- a/daemon/automount.c -+++ b/daemon/automount.c -@@ -1195,7 +1195,7 @@ static int handle_packet(struct autofs_point *ap) - 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 foreground, unsigned daemon_check) - } - - /* 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 foreground, unsigned daemon_check) - } - 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!", -diff --git a/include/automount.h b/include/automount.h -index eccd16aa..848fd0be 100644 ---- a/include/automount.h -+++ b/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 -diff --git a/lib/master.c b/lib/master.c -index 76717d57..ba5272f0 100644 ---- a/lib/master.c -+++ b/lib/master.c -@@ -922,7 +922,7 @@ void master_free_mapent(struct master_mapent *entry) - 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 *name, unsigned int timeout, unsigned int g - 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; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch deleted file mode 100644 index 8f840f33..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch +++ /dev/null @@ -1,1572 +0,0 @@ -autofs-5.1.4 - use systemd sd_notify() at startup - -From: Ian Kent - -autofs needs to ensure statd is started before any NFS mounts -are attempted. - -When starting the statd service with the autofs service the statd -service will trigger a restart of the autofs service during its -start up. Sometimes this can happen during the automount start up -itself. - -When this happens it causes systemd to become confused and remove -the pid file created by automount leaving systemd thinking the -autofs service had failed start up when it was actually running. - -It was recommened that autofs be changed to a "Type=notify" service -to avoid this. Using this a pid file is no longer needed and is now -not used. - -Signed-off-by: Ian Kent ---- - CHANGELOG | 1 - Makefile.conf.in | 3 - aclocal.m4 | 3 - autofs.spec | 1 - configure | 1136 ++++++++++++++++++++++++++------------------- - configure.in | 8 - daemon/Makefile | 5 - daemon/automount.c | 83 ++- - samples/autofs.service.in | 5 - 9 files changed, 729 insertions(+), 516 deletions(-) - -diff --git a/CHANGELOG b/CHANGELOG -index b9925cf7..e3ada7e7 100644 ---- a/CHANGELOG -+++ b/CHANGELOG -@@ -23,6 +23,7 @@ xx/xx/2018 autofs-5.1.5 - - fix rpm spec install premissions on auto.net and auto.smb. - - tiny patch for autofs typo and possible bug. - - add units After line to include statd service. -+- use systemd sd_notify() at startup. - - 19/12/2017 autofs-5.1.4 - - fix spec file url. -diff --git a/Makefile.conf.in b/Makefile.conf.in -index 3fe1a0a0..ff9b18a1 100644 ---- a/Makefile.conf.in -+++ b/Makefile.conf.in -@@ -18,6 +18,9 @@ NSLLIB = @NSL_LIBS@ - NSLCFLAGS = @NSL_CFLAGS@ - LIBRESOLV = @LIBRESOLV@ - -+SYSTEMD = @WITH_SYSTEMD@ -+LIBSYSTEMD = @systemd_LIBS@ -+ - # Hesiod support: yes (1) no (0) - HESIOD = @HAVE_HESIOD@ - LIBHESIOD = @LIBHESIOD@ -diff --git a/aclocal.m4 b/aclocal.m4 -index f1ed3870..ec362bb4 100644 ---- a/aclocal.m4 -+++ b/aclocal.m4 -@@ -257,14 +257,17 @@ AC_DEFUN([AF_WITH_SYSTEMD], - fi - done - fi -+ WITH_SYSTEMD=0 - if test -n "$systemddir"; then - AC_MSG_RESULT($systemddir) -+ WITH_SYSTEMD=1 - else - AC_MSG_RESULT(not found) - fi - else - if test "$withval" != no; then - systemddir=$withval -+ WITH_SYSTEMD=1 - fi - fi]) - ]) -diff --git a/autofs.spec b/autofs.spec -index ac3b0a3f..f857d9da 100644 ---- a/autofs.spec -+++ b/autofs.spec -@@ -32,6 +32,7 @@ Source: https://www.kernel.org/pub/linux/daemons/autofs/v5/autofs-%{version}.tar - Buildroot: %{_tmppath}/%{name}-tmp - %if %{with_systemd} - BuildRequires: systemd-units -+BuildRequires: systemd-devel - %endif - %if %{with_libtirpc} - BuildRequires: libtirpc-devel -diff --git a/configure b/configure -index 9682b36f..827921ba 100755 ---- a/configure -+++ b/configure -@@ -674,6 +674,12 @@ MOUNT_NFS - HAVE_MOUNT - MOUNT - DMALLOCLIB -+TIRPC_LIBS -+TIRPC_CFLAGS -+flagdir -+fifodir -+mapdir -+confdir - OBJEXT - EXEEXT - ac_ct_CC -@@ -681,16 +687,13 @@ CPPFLAGS - LDFLAGS - CFLAGS - CC --TIRPC_LIBS --TIRPC_CFLAGS -+systemd_LIBS -+systemd_CFLAGS -+WITH_SYSTEMD -+systemddir - PKG_CONFIG_LIBDIR - PKG_CONFIG_PATH - PKG_CONFIG --flagdir --fifodir --mapdir --confdir --systemddir - piddir - initdir - target_alias -@@ -760,13 +763,15 @@ target_alias - PKG_CONFIG - PKG_CONFIG_PATH - PKG_CONFIG_LIBDIR --TIRPC_CFLAGS --TIRPC_LIBS -+systemd_CFLAGS -+systemd_LIBS - CC - CFLAGS - LDFLAGS - LIBS - CPPFLAGS -+TIRPC_CFLAGS -+TIRPC_LIBS - NSL_CFLAGS - NSL_LIBS - CPP' -@@ -1413,9 +1418,10 @@ Some influential environment variables: - directories to add to pkg-config's search path - PKG_CONFIG_LIBDIR - path overriding pkg-config's built-in search path -- TIRPC_CFLAGS -- C compiler flags for TIRPC, overriding pkg-config -- TIRPC_LIBS linker flags for TIRPC, overriding pkg-config -+ systemd_CFLAGS -+ C compiler flags for systemd, overriding pkg-config -+ systemd_LIBS -+ linker flags for systemd, overriding pkg-config - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a -@@ -1423,6 +1429,9 @@ Some influential environment variables: - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory -+ TIRPC_CFLAGS -+ C compiler flags for TIRPC, overriding pkg-config -+ TIRPC_LIBS linker flags for TIRPC, overriding pkg-config - NSL_CFLAGS C compiler flags for NSL, overriding pkg-config - NSL_LIBS linker flags for NSL, overriding pkg-config - CPP C preprocessor -@@ -2291,166 +2300,6 @@ if test -z "$piddir"; then - fi - - --# --# Check for systemd unit files direectory exists if unit file installation --# is requested --# -- --# Check whether --with-systemd was given. --if test "${with_systemd+set}" = set; then : -- withval=$with_systemd; if test "$withval" = yes; then -- if test -z "$systemddir"; then -- { $as_echo "$as_me:${as_lineno-$LINENO}: checking location of the systemd unit files directory" >&5 --$as_echo_n "checking location of the systemd unit files directory... " >&6; } -- for systemd_d in /usr/lib/systemd/system /usr/lib64/systemd/system /lib/systemd/system /lib64/systemd/system; do -- if test -z "$systemddir"; then -- if test -d "$systemd_d"; then -- systemddir="$systemd_d" -- fi -- fi -- done -- fi -- if test -n "$systemddir"; then -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $systemddir" >&5 --$as_echo "$systemddir" >&6; } -- else -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 --$as_echo "not found" >&6; } -- fi --else -- if test "$withval" != no; then -- systemddir=$withval -- fi --fi --fi -- -- -- -- --# --# Location of system config script directory? --# --if test -z "$confdir"; then -- for conf_d in /etc/sysconfig /etc/defaults /etc/conf.d /etc/default; do -- if test -z "$confdir"; then -- if test -d "$conf_d"; then -- confdir="$conf_d" -- fi -- fi -- done --fi -- --# Check whether --with-confdir was given. --if test "${with_confdir+set}" = set; then : -- withval=$with_confdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" -- then -- : -- else -- confdir="${withval}" -- fi -- --fi -- --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs configuration file directory" >&5 --$as_echo_n "checking for autofs configuration file directory... " >&6; } --{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $confdir" >&5 --$as_echo "$confdir" >&6; } -- -- --# --# The user can specify --with-mapsdir=PATH to specify autofs maps go --# --if test -z "$mapdir"; then -- for map_d in /etc/autofs /etc; do -- if test -z "$mapdir"; then -- if test -d "$map_d"; then -- mapdir="$map_d" -- fi -- fi -- done --fi -- --# Check whether --with-mapdir was given. --if test "${with_mapdir+set}" = set; then : -- withval=$with_mapdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" -- then -- : -- else -- mapdir="${withval}" -- fi -- --fi -- --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs maps directory" >&5 --$as_echo_n "checking for autofs maps directory... " >&6; } --{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mapdir" >&5 --$as_echo "$mapdir" >&6; } -- -- --# --# The user can specify --with-fifodir=PATH to specify where autofs fifos go --# --if test -z "$fifodir"; then -- for fifo_d in /run /var/run /tmp; do -- if test -z "$fifodir"; then -- if test -d "$fifo_d"; then -- fifodir="$fifo_d" -- fi -- fi -- done --fi -- --# Check whether --with-fifodir was given. --if test "${with_fifodir+set}" = set; then : -- withval=$with_fifodir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" -- then -- : -- else -- fifodir="${withval}" -- fi -- --fi -- --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs fifos directory" >&5 --$as_echo_n "checking for autofs fifos directory... " >&6; } --{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $fifodir" >&5 --$as_echo "$fifodir" >&6; } -- -- --# --# The user can specify --with-flagdir=PATH to specify where autofs flag file goes --# --if test -z "$flagdir"; then -- for flag_d in /run /var/run /tmp; do -- if test -z "$flagdir"; then -- if test -d "$flag_d"; then -- flagdir="$flag_d" -- fi -- fi -- done --fi -- --# Check whether --with-flagdir was given. --if test "${with_flagdir+set}" = set; then : -- withval=$with_flagdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" -- then -- : -- else -- flagdir="${withval}" -- fi -- --fi -- --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs flag file directory" >&5 --$as_echo_n "checking for autofs flag file directory... " >&6; } --{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $flagdir" >&5 --$as_echo "$flagdir" >&6; } -- -- --# --# Use libtirpc --# -- - - - -@@ -2571,111 +2420,46 @@ $as_echo "no" >&6; } - fi - fi - --# Check whether --with-libtirpc was given. --if test "${with_libtirpc+set}" = set; then : -- withval=$with_libtirpc; --fi -- --if test "x$with_libtirpc" = "xyes"; then -- --pkg_failed=no --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIRPC" >&5 --$as_echo_n "checking for TIRPC... " >&6; } -+# -+# Check for systemd unit files direectory exists if unit file installation -+# is requested -+# - --if test -n "$TIRPC_CFLAGS"; then -- pkg_cv_TIRPC_CFLAGS="$TIRPC_CFLAGS" -- elif test -n "$PKG_CONFIG"; then -- if test -n "$PKG_CONFIG" && \ -- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 -- ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 -- ac_status=$? -- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -- test $ac_status = 0; }; then -- pkg_cv_TIRPC_CFLAGS=`$PKG_CONFIG --cflags "libtirpc" 2>/dev/null` -- test "x$?" != "x0" && pkg_failed=yes --else -- pkg_failed=yes --fi -- else -- pkg_failed=untried --fi --if test -n "$TIRPC_LIBS"; then -- pkg_cv_TIRPC_LIBS="$TIRPC_LIBS" -- elif test -n "$PKG_CONFIG"; then -- if test -n "$PKG_CONFIG" && \ -- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 -- ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 -- ac_status=$? -- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -- test $ac_status = 0; }; then -- pkg_cv_TIRPC_LIBS=`$PKG_CONFIG --libs "libtirpc" 2>/dev/null` -- test "x$?" != "x0" && pkg_failed=yes -+# Check whether --with-systemd was given. -+if test "${with_systemd+set}" = set; then : -+ withval=$with_systemd; if test "$withval" = yes; then -+ if test -z "$systemddir"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking location of the systemd unit files directory" >&5 -+$as_echo_n "checking location of the systemd unit files directory... " >&6; } -+ for systemd_d in /usr/lib/systemd/system /usr/lib64/systemd/system /lib/systemd/system /lib64/systemd/system; do -+ if test -z "$systemddir"; then -+ if test -d "$systemd_d"; then -+ systemddir="$systemd_d" -+ fi -+ fi -+ done -+ fi -+ WITH_SYSTEMD=0 -+ if test -n "$systemddir"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $systemddir" >&5 -+$as_echo "$systemddir" >&6; } -+ WITH_SYSTEMD=1 -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -+$as_echo "not found" >&6; } -+ fi - else -- pkg_failed=yes -+ if test "$withval" != no; then -+ systemddir=$withval -+ WITH_SYSTEMD=1 -+ fi - 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 -- TIRPC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtirpc" 2>&1` -- else -- TIRPC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtirpc" 2>&1` -- fi -- # Put the nasty error message in config.log where it belongs -- echo "$TIRPC_PKG_ERRORS" >&5 -- -- as_fn_error $? "Package requirements (libtirpc) were not met: -- --$TIRPC_PKG_ERRORS -- --Consider adjusting the PKG_CONFIG_PATH environment variable if you --installed software in a non-standard prefix. -- --Alternatively, you may set the environment variables TIRPC_CFLAGS --and TIRPC_LIBS to avoid the need to call pkg-config. --See the pkg-config man page for more details." "$LINENO" 5 --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}: error: in \`$ac_pwd':" >&5 --$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} --as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it --is in your PATH or set the PKG_CONFIG environment variable to the full --path to pkg-config. -- --Alternatively, you may set the environment variables TIRPC_CFLAGS --and TIRPC_LIBS to avoid the need to call pkg-config. --See the pkg-config man page for more details. -- --To get pkg-config, see . --See \`config.log' for more details" "$LINENO" 5; } --else -- TIRPC_CFLAGS=$pkg_cv_TIRPC_CFLAGS -- TIRPC_LIBS=$pkg_cv_TIRPC_LIBS -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 --$as_echo "yes" >&6; } -- -- --$as_echo "#define WITH_LIBTIRPC 1" >>confdefs.h -- -- --$as_echo "#define TIRPC_WORKAROUND 1" >>confdefs.h -- -- --fi -- ac_ext=c -+ac_ext=c - ac_cpp='$CPP $CPPFLAGS' - ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' - ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -@@ -3362,110 +3146,614 @@ elif test $ac_cv_prog_cc_g = yes; then - CFLAGS="-g" - fi - else -- if test "$GCC" = yes; then -- CFLAGS="-O2" -- else -- CFLAGS= -- fi -+ if test "$GCC" = yes; then -+ CFLAGS="-O2" -+ else -+ CFLAGS= -+ fi -+fi -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -+if ${ac_cv_prog_cc_c89+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ ac_cv_prog_cc_c89=no -+ac_save_CC=$CC -+cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+#include -+#include -+struct stat; -+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -+struct buf { int x; }; -+FILE * (*rcsopen) (struct buf *, struct stat *, int); -+static char *e (p, i) -+ char **p; -+ int i; -+{ -+ return p[i]; -+} -+static char *f (char * (*g) (char **, int), char **p, ...) -+{ -+ char *s; -+ va_list v; -+ va_start (v,p); -+ s = g (p, va_arg (v,int)); -+ va_end (v); -+ return s; -+} -+ -+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has -+ function prototypes and stuff, but not '\xHH' hex character constants. -+ These don't provoke an error unfortunately, instead are silently treated -+ as 'x'. The following induces an error, until -std is added to get -+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an -+ array size at least. It's necessary to write '\x00'==0 to get something -+ that's true only with -std. */ -+int osf4_cc_array ['\x00' == 0 ? 1 : -1]; -+ -+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters -+ inside strings and character constants. */ -+#define FOO(x) 'x' -+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; -+ -+int test (int i, double x); -+struct s1 {int (*f) (int a);}; -+struct s2 {int (*f) (double a);}; -+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -+int argc; -+char **argv; -+int -+main () -+{ -+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; -+ ; -+ return 0; -+} -+_ACEOF -+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -+do -+ CC="$ac_save_CC $ac_arg" -+ if ac_fn_c_try_compile "$LINENO"; then : -+ ac_cv_prog_cc_c89=$ac_arg -+fi -+rm -f core conftest.err conftest.$ac_objext -+ test "x$ac_cv_prog_cc_c89" != "xno" && break -+done -+rm -f conftest.$ac_ext -+CC=$ac_save_CC -+ -+fi -+# AC_CACHE_VAL -+case "x$ac_cv_prog_cc_c89" in -+ x) -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -+$as_echo "none needed" >&6; } ;; -+ xno) -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -+$as_echo "unsupported" >&6; } ;; -+ *) -+ CC="$CC $ac_cv_prog_cc_c89" -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -+esac -+if test "x$ac_cv_prog_cc_c89" != xno; then : -+ -+fi -+ -+ac_ext=c -+ac_cpp='$CPP $CPPFLAGS' -+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -+ac_compiler_gnu=$ac_cv_c_compiler_gnu -+ -+ -+ -+pkg_failed=no -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd" >&5 -+$as_echo_n "checking for systemd... " >&6; } -+ -+if test -n "$systemd_CFLAGS"; then -+ pkg_cv_systemd_CFLAGS="$systemd_CFLAGS" -+ elif test -n "$PKG_CONFIG"; then -+ if test -n "$PKG_CONFIG" && \ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd\""; } >&5 -+ ($PKG_CONFIG --exists --print-errors "libsystemd") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; }; then -+ pkg_cv_systemd_CFLAGS=`$PKG_CONFIG --cflags "libsystemd" 2>/dev/null` -+ test "x$?" != "x0" && pkg_failed=yes -+else -+ pkg_failed=yes -+fi -+ else -+ pkg_failed=untried -+fi -+if test -n "$systemd_LIBS"; then -+ pkg_cv_systemd_LIBS="$systemd_LIBS" -+ elif test -n "$PKG_CONFIG"; then -+ if test -n "$PKG_CONFIG" && \ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd\""; } >&5 -+ ($PKG_CONFIG --exists --print-errors "libsystemd") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; }; then -+ pkg_cv_systemd_LIBS=`$PKG_CONFIG --libs "libsystemd" 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 -+ systemd_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd" 2>&1` -+ else -+ systemd_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd" 2>&1` -+ fi -+ # Put the nasty error message in config.log where it belongs -+ echo "$systemd_PKG_ERRORS" >&5 -+ -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sm_notify in -lsystemd" >&5 -+$as_echo_n "checking for sm_notify in -lsystemd... " >&6; } -+if ${ac_cv_lib_systemd_sm_notify+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ ac_check_lib_save_LIBS=$LIBS -+LIBS="-lsystemd $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 sm_notify (); -+int -+main () -+{ -+return sm_notify (); -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ ac_cv_lib_systemd_sm_notify=yes -+else -+ ac_cv_lib_systemd_sm_notify=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_systemd_sm_notify" >&5 -+$as_echo "$ac_cv_lib_systemd_sm_notify" >&6; } -+if test "x$ac_cv_lib_systemd_sm_notify" = xyes; then : -+ systemd_LIBS="-lsystemd" -+fi -+ -+ -+ -+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 sm_notify in -lsystemd" >&5 -+$as_echo_n "checking for sm_notify in -lsystemd... " >&6; } -+if ${ac_cv_lib_systemd_sm_notify+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ ac_check_lib_save_LIBS=$LIBS -+LIBS="-lsystemd $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 sm_notify (); -+int -+main () -+{ -+return sm_notify (); -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ ac_cv_lib_systemd_sm_notify=yes -+else -+ ac_cv_lib_systemd_sm_notify=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_systemd_sm_notify" >&5 -+$as_echo "$ac_cv_lib_systemd_sm_notify" >&6; } -+if test "x$ac_cv_lib_systemd_sm_notify" = xyes; then : -+ systemd_LIBS="-lsystemd" -+fi -+ -+ -+ -+else -+ systemd_CFLAGS=$pkg_cv_systemd_CFLAGS -+ systemd_LIBS=$pkg_cv_systemd_LIBS -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ -+fi -+ -+# -+# Location of system config script directory? -+# -+if test -z "$confdir"; then -+ for conf_d in /etc/sysconfig /etc/defaults /etc/conf.d /etc/default; do -+ if test -z "$confdir"; then -+ if test -d "$conf_d"; then -+ confdir="$conf_d" -+ fi -+ fi -+ done -+fi -+ -+# Check whether --with-confdir was given. -+if test "${with_confdir+set}" = set; then : -+ withval=$with_confdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" -+ then -+ : -+ else -+ confdir="${withval}" -+ fi -+ -+fi -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs configuration file directory" >&5 -+$as_echo_n "checking for autofs configuration file directory... " >&6; } -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $confdir" >&5 -+$as_echo "$confdir" >&6; } -+ -+ -+# -+# The user can specify --with-mapsdir=PATH to specify autofs maps go -+# -+if test -z "$mapdir"; then -+ for map_d in /etc/autofs /etc; do -+ if test -z "$mapdir"; then -+ if test -d "$map_d"; then -+ mapdir="$map_d" -+ fi -+ fi -+ done -+fi -+ -+# Check whether --with-mapdir was given. -+if test "${with_mapdir+set}" = set; then : -+ withval=$with_mapdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" -+ then -+ : -+ else -+ mapdir="${withval}" -+ fi -+ -+fi -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs maps directory" >&5 -+$as_echo_n "checking for autofs maps directory... " >&6; } -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mapdir" >&5 -+$as_echo "$mapdir" >&6; } -+ -+ -+# -+# The user can specify --with-fifodir=PATH to specify where autofs fifos go -+# -+if test -z "$fifodir"; then -+ for fifo_d in /run /var/run /tmp; do -+ if test -z "$fifodir"; then -+ if test -d "$fifo_d"; then -+ fifodir="$fifo_d" -+ fi -+ fi -+ done -+fi -+ -+# Check whether --with-fifodir was given. -+if test "${with_fifodir+set}" = set; then : -+ withval=$with_fifodir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" -+ then -+ : -+ else -+ fifodir="${withval}" -+ fi -+ -+fi -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs fifos directory" >&5 -+$as_echo_n "checking for autofs fifos directory... " >&6; } -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $fifodir" >&5 -+$as_echo "$fifodir" >&6; } -+ -+ -+# -+# The user can specify --with-flagdir=PATH to specify where autofs flag file goes -+# -+if test -z "$flagdir"; then -+ for flag_d in /run /var/run /tmp; do -+ if test -z "$flagdir"; then -+ if test -d "$flag_d"; then -+ flagdir="$flag_d" -+ fi -+ fi -+ done -+fi -+ -+# Check whether --with-flagdir was given. -+if test "${with_flagdir+set}" = set; then : -+ withval=$with_flagdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" -+ then -+ : -+ else -+ flagdir="${withval}" -+ fi -+ -+fi -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs flag file directory" >&5 -+$as_echo_n "checking for autofs flag file directory... " >&6; } -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $flagdir" >&5 -+$as_echo "$flagdir" >&6; } -+ -+ -+# -+# Use libtirpc -+# -+ -+ -+ -+ -+ -+ -+ -+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 -+ -+# Check whether --with-libtirpc was given. -+if test "${with_libtirpc+set}" = set; then : -+ withval=$with_libtirpc; -+fi -+ -+if test "x$with_libtirpc" = "xyes"; then -+ -+pkg_failed=no -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIRPC" >&5 -+$as_echo_n "checking for TIRPC... " >&6; } -+ -+if test -n "$TIRPC_CFLAGS"; then -+ pkg_cv_TIRPC_CFLAGS="$TIRPC_CFLAGS" -+ elif test -n "$PKG_CONFIG"; then -+ if test -n "$PKG_CONFIG" && \ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 -+ ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; }; then -+ pkg_cv_TIRPC_CFLAGS=`$PKG_CONFIG --cflags "libtirpc" 2>/dev/null` -+ test "x$?" != "x0" && pkg_failed=yes -+else -+ pkg_failed=yes -+fi -+ else -+ pkg_failed=untried -+fi -+if test -n "$TIRPC_LIBS"; then -+ pkg_cv_TIRPC_LIBS="$TIRPC_LIBS" -+ elif test -n "$PKG_CONFIG"; then -+ if test -n "$PKG_CONFIG" && \ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 -+ ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; }; then -+ pkg_cv_TIRPC_LIBS=`$PKG_CONFIG --libs "libtirpc" 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 --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 --$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } --if ${ac_cv_prog_cc_c89+:} false; then : -- $as_echo_n "(cached) " >&6 --else -- ac_cv_prog_cc_c89=no --ac_save_CC=$CC --cat confdefs.h - <<_ACEOF >conftest.$ac_ext --/* end confdefs.h. */ --#include --#include --struct stat; --/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ --struct buf { int x; }; --FILE * (*rcsopen) (struct buf *, struct stat *, int); --static char *e (p, i) -- char **p; -- int i; --{ -- return p[i]; --} --static char *f (char * (*g) (char **, int), char **p, ...) --{ -- char *s; -- va_list v; -- va_start (v,p); -- s = g (p, va_arg (v,int)); -- va_end (v); -- return s; --} -+ if test $_pkg_short_errors_supported = yes; then -+ TIRPC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtirpc" 2>&1` -+ else -+ TIRPC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtirpc" 2>&1` -+ fi -+ # Put the nasty error message in config.log where it belongs -+ echo "$TIRPC_PKG_ERRORS" >&5 - --/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has -- function prototypes and stuff, but not '\xHH' hex character constants. -- These don't provoke an error unfortunately, instead are silently treated -- as 'x'. The following induces an error, until -std is added to get -- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an -- array size at least. It's necessary to write '\x00'==0 to get something -- that's true only with -std. */ --int osf4_cc_array ['\x00' == 0 ? 1 : -1]; -+ as_fn_error $? "Package requirements (libtirpc) were not met: - --/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters -- inside strings and character constants. */ --#define FOO(x) 'x' --int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; -+$TIRPC_PKG_ERRORS - --int test (int i, double x); --struct s1 {int (*f) (int a);}; --struct s2 {int (*f) (double a);}; --int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); --int argc; --char **argv; --int --main () --{ --return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; -- ; -- return 0; --} --_ACEOF --for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" --do -- CC="$ac_save_CC $ac_arg" -- if ac_fn_c_try_compile "$LINENO"; then : -- ac_cv_prog_cc_c89=$ac_arg --fi --rm -f core conftest.err conftest.$ac_objext -- test "x$ac_cv_prog_cc_c89" != "xno" && break --done --rm -f conftest.$ac_ext --CC=$ac_save_CC -+Consider adjusting the PKG_CONFIG_PATH environment variable if you -+installed software in a non-standard prefix. - --fi --# AC_CACHE_VAL --case "x$ac_cv_prog_cc_c89" in -- x) -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 --$as_echo "none needed" >&6; } ;; -- xno) -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 --$as_echo "unsupported" >&6; } ;; -- *) -- CC="$CC $ac_cv_prog_cc_c89" -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 --$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; --esac --if test "x$ac_cv_prog_cc_c89" != xno; then : -+Alternatively, you may set the environment variables TIRPC_CFLAGS -+and TIRPC_LIBS to avoid the need to call pkg-config. -+See the pkg-config man page for more details." "$LINENO" 5 -+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}: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it -+is in your PATH or set the PKG_CONFIG environment variable to the full -+path to pkg-config. - --fi -+Alternatively, you may set the environment variables TIRPC_CFLAGS -+and TIRPC_LIBS to avoid the need to call pkg-config. -+See the pkg-config man page for more details. - --ac_ext=c --ac_cpp='$CPP $CPPFLAGS' --ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' --ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' --ac_compiler_gnu=$ac_cv_c_compiler_gnu -+To get pkg-config, see . -+See \`config.log' for more details" "$LINENO" 5; } -+else -+ TIRPC_CFLAGS=$pkg_cv_TIRPC_CFLAGS -+ TIRPC_LIBS=$pkg_cv_TIRPC_LIBS -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ -+ -+$as_echo "#define WITH_LIBTIRPC 1" >>confdefs.h - - --for ac_func in getrpcbyname getservbyname -+$as_echo "#define TIRPC_WORKAROUND 1" >>confdefs.h -+ -+ -+fi -+ for ac_func in getrpcbyname getservbyname - do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` - ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -@@ -4522,126 +4810,6 @@ fi - - - -- -- -- -- -- -- --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; } -diff --git a/configure.in b/configure.in -index de06a96d..4b0a81f2 100644 ---- a/configure.in -+++ b/configure.in -@@ -48,6 +48,7 @@ AF_INIT_D() - AC_SUBST(initdir) - AF_PID_D() - AC_SUBST(piddir) -+PKG_PROG_PKG_CONFIG() - - # - # Check for systemd unit files direectory exists if unit file installation -@@ -55,6 +56,12 @@ AC_SUBST(piddir) - # - AF_WITH_SYSTEMD() - AC_SUBST(systemddir) -+AC_SUBST(WITH_SYSTEMD) -+PKG_CHECK_MODULES([systemd],[libsystemd],, -+[ -+ AC_CHECK_LIB(systemd, sm_notify, systemd_LIBS="-lsystemd") -+ AC_SUBST(systemd_LIBS) -+]) - - # - # Location of system config script directory? -@@ -218,7 +225,6 @@ fi - AC_CHECK_LIB(rt, clock_gettime, LIBCLOCK_GETTIME="-lrt") - AC_SUBST(LIBCLOCK_GETTIME) - --PKG_PROG_PKG_CONFIG() - PKG_CHECK_MODULES([NSL],[libnsl],, - [ - AC_CHECK_LIB(nsl, yp_match, NSL_LIBS="-lnsl") -diff --git a/daemon/Makefile b/daemon/Makefile -index a455c683..a7ce430e 100644 ---- a/daemon/Makefile -+++ b/daemon/Makefile -@@ -22,6 +22,11 @@ CFLAGS += -DVERSION_STRING=\"$(version)\" - LDFLAGS += -rdynamic - LIBS += -ldl -lpthread - -+ifeq ($(SYSTEMD), 1) -+ CFLAGS += -DWITH_SYSTEMD -+ LIBS += $(LIBSYSTEMD) -+endif -+ - ifeq ($(LDAP), 1) - CFLAGS += $(XML_FLAGS) - LIBS += $(XML_LIBS) -diff --git a/daemon/automount.c b/daemon/automount.c -index 28b3f2f5..3fbfb9aa 100644 ---- a/daemon/automount.c -+++ b/daemon/automount.c -@@ -36,6 +36,9 @@ - #include - #include - #include -+#ifdef WITH_SYSTEMD -+#include -+#endif - - #include "automount.h" - #if defined(LIBXML2_WORKAROUND) || defined(TIRPC_WORKAROUND) -@@ -67,7 +70,7 @@ unsigned int global_selection_options; - long global_negative_timeout = -1; - int do_force_unlink = 0; /* Forceably unlink mount tree at startup */ - --static int start_pipefd[2]; -+static int start_pipefd[2] = {-1, -1}; - static int st_stat = 1; - static int *pst_stat = &st_stat; - static pthread_t state_mach_thid; -@@ -1206,12 +1209,6 @@ static void become_daemon(unsigned foreground, unsigned daemon_check) - exit(0); - } - -- if (open_pipe(start_pipefd) < 0) { -- fprintf(stderr, "%s: failed to create start_pipefd.\n", -- program); -- exit(0); -- } -- - /* Detach from foreground process */ - if (foreground) { - if (daemon_check && !aquire_flag_file()) { -@@ -1221,6 +1218,12 @@ static void become_daemon(unsigned foreground, unsigned daemon_check) - } - log_to_stderr(); - } else { -+ if (open_pipe(start_pipefd) < 0) { -+ fprintf(stderr, "%s: failed to create start_pipefd.\n", -+ program); -+ exit(0); -+ } -+ - pid = fork(); - if (pid > 0) { - close(start_pipefd[1]); -@@ -2450,8 +2453,10 @@ int main(int argc, char *argv[]) - if (pthread_attr_init(&th_attr)) { - logerr("%s: failed to init thread attribute struct!", - program); -- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -- close(start_pipefd[1]); -+ if (start_pipefd[1] != -1) { -+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -+ close(start_pipefd[1]); -+ } - release_flag_file(); - macro_free_global_table(); - exit(1); -@@ -2460,8 +2465,10 @@ int main(int argc, char *argv[]) - if (pthread_attr_init(&th_attr_detached)) { - logerr("%s: failed to init thread attribute struct!", - program); -- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -- close(start_pipefd[1]); -+ if (start_pipefd[1] != -1) { -+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -+ close(start_pipefd[1]); -+ } - release_flag_file(); - macro_free_global_table(); - exit(1); -@@ -2471,8 +2478,10 @@ int main(int argc, char *argv[]) - &th_attr_detached, PTHREAD_CREATE_DETACHED)) { - logerr("%s: failed to set detached thread attribute!", - program); -- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -- close(start_pipefd[1]); -+ if (start_pipefd[1] != -1) { -+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -+ close(start_pipefd[1]); -+ } - release_flag_file(); - macro_free_global_table(); - exit(1); -@@ -2483,8 +2492,10 @@ int main(int argc, char *argv[]) - &th_attr_detached, detached_thread_stack_size)) { - logerr("%s: failed to set stack size thread attribute!", - program); -- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -- close(start_pipefd[1]); -+ if (start_pipefd[1] != -1) { -+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -+ close(start_pipefd[1]); -+ } - release_flag_file(); - macro_free_global_table(); - exit(1); -@@ -2495,8 +2506,10 @@ int main(int argc, char *argv[]) - &th_attr_detached, &detached_thread_stack_size)) { - logerr("%s: failed to get detached thread stack size!", - program); -- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -- close(start_pipefd[1]); -+ if (start_pipefd[1] != -1) { -+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -+ close(start_pipefd[1]); -+ } - release_flag_file(); - macro_free_global_table(); - exit(1); -@@ -2513,8 +2526,10 @@ int main(int argc, char *argv[]) - logerr("%s: failed to create thread data key for std env vars!", - program); - master_kill(master_list); -- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -- close(start_pipefd[1]); -+ if (start_pipefd[1] != -1) { -+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -+ close(start_pipefd[1]); -+ } - release_flag_file(); - macro_free_global_table(); - exit(1); -@@ -2525,8 +2540,10 @@ int main(int argc, char *argv[]) - logerr("%s: failed to create thread data key for attempt ID!", - program); - master_kill(master_list); -- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -- close(start_pipefd[1]); -+ if (start_pipefd[1] != -1) { -+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -+ close(start_pipefd[1]); -+ } - release_flag_file(); - macro_free_global_table(); - exit(1); -@@ -2537,8 +2554,10 @@ int main(int argc, char *argv[]) - if (!alarm_start_handler()) { - logerr("%s: failed to create alarm handler thread!", program); - master_kill(master_list); -- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -- close(start_pipefd[1]); -+ if (start_pipefd[1] != -1) { -+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -+ close(start_pipefd[1]); -+ } - release_flag_file(); - macro_free_global_table(); - exit(1); -@@ -2547,8 +2566,10 @@ int main(int argc, char *argv[]) - if (!st_start_handler()) { - logerr("%s: failed to create FSM handler thread!", program); - master_kill(master_list); -- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -- close(start_pipefd[1]); -+ if (start_pipefd[1] != -1) { -+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); -+ close(start_pipefd[1]); -+ } - release_flag_file(); - macro_free_global_table(); - exit(1); -@@ -2596,9 +2617,15 @@ int main(int argc, char *argv[]) - */ - do_force_unlink = 0; - -- 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 -+ sd_notify(1, "READY=1"); -+#endif - - state_mach_thid = pthread_self(); - statemachine(NULL); -diff --git a/samples/autofs.service.in b/samples/autofs.service.in -index 766fc5a5..281d31ef 100644 ---- a/samples/autofs.service.in -+++ b/samples/autofs.service.in -@@ -4,10 +4,9 @@ After=network.target ypbind.service sssd.service network-online.target remote-fs - Wants=network-online.target rpc-statd.service rpcbind.service - - [Service] --Type=forking --PIDFile=@@autofspiddir@@/autofs.pid -+Type=notify - EnvironmentFile=-@@autofsconfdir@@/autofs --ExecStart=@@sbindir@@/automount $OPTIONS --pid-file @@autofspiddir@@/autofs.pid -+ExecStart=@@sbindir@@/automount $OPTIONS --foreground --dont-check-daemon - ExecReload=/usr/bin/kill -HUP $MAINPID - KillMode=process - TimeoutSec=180 diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch deleted file mode 100644 index f398e45c..00000000 --- a/archive-patches/autofs-5.1.4/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch +++ /dev/null @@ -1,226 +0,0 @@ -autofs-5.1.4 - use_hostname_for_mounts shouldn't prevent selection among replicas - -From: NeilBrown - -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 -Signed-off-by: Ian Kent ---- - 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; - } - diff --git a/archive-patches/autofs-5.1.4/patch_order-5.1.4 b/archive-patches/autofs-5.1.4/patch_order-5.1.4 deleted file mode 100644 index 731dd79b..00000000 --- a/archive-patches/autofs-5.1.4/patch_order-5.1.4 +++ /dev/null @@ -1,55 +0,0 @@ -autofs-5.1.4-fix-flag-file-permission.patch -autofs-5.1.4-fix-directory-create-permission.patch -autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch -autofs-5.1.4-fix-deadlock-in-dumpmaps.patch -autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch -autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch -autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch -autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch -autofs-5.1.4-add-error-handling-for-ext_mount_add.patch -autofs-5.1.4-account-for-libnsl-changes.patch -autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch -autofs-5.1.4-fix-monotonic_elapsed.patch -autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch -autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch -autofs-5.1.4-fix-libresolv-configure-check.patch -autofs-5.1.4-add-fedfs-getsrvinfo_c.patch -autofs-5.1.4-add-mount_fedfs_c.patch -autofs-5.1.4-add-fedfs-map-nfs4_c.patch -autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch -autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch -autofs-5.1.4-improve-hostname-lookup-error-logging.patch -autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch -autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch -autofs-5.1.4-add-units-After-line-to-include-statd-service.patch -autofs-5.1.4-use-systemd-sd_notify-at-startup.patch -autofs-5.1.4-fix-NFS-version-mask-usage.patch -autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch -autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch -autofs-5.1.4-covarity-fixes-1.patch -autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch -autofs-5.1.4-use-defines-for-expire-type.patch -autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch -autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch -autofs-5.1.4-fix-age-setting-at-startup.patch -autofs-5.1.4-fix-update_negative_cache-map-source-usage.patch -autofs-5.1.4-fix-program-usage-message.patch -autofs-5.1.4-mark-removed-cache-entry-negative.patch -autofs-5.1.4-set-bind-mount-as-propagation-slave.patch -autofs-5.1.4-add-master-map-pseudo-options-for-mount-propagation.patch -autofs-5.1.4-fix-use-after-free-in-parse_ldap_config.patch -autofs-5.1.4-fix-incorrect-locking-in-sss-lookup.patch -autofs-5.1.4-fix-amd-parser-opts-option-handling.patch -autofs-5.1.4-fix-possible-NULL-pointer-access-in-get_defaults_entry.patch -autofs-5.1.4-better-handle-hesiod-support-not-built-in.patch -autofs-5.1.4-fix-indent-in-automount-8-man-page.patch -autofs-5.1.4-remove-autofs4-module-load-code.patch -autofs-5.1.4-add-NULL-check-in-prepare_attempt_prefix.patch -autofs-5.1.4-update-build-info-with-systemd.patch -autofs-5.1.4-use-flags-for-startup-boolean-options.patch -autofs-5.1.4-move-close-stdio-descriptors-to-become_daemon.patch -autofs-5.1.4-add-systemd-service-command-line-option.patch -autofs-5.1.4-refactor-negative-map-entry-check.patch -autofs-5.1.4-remove-unused-function-dump_master.patch -autofs-5.1.4-remove-unused-function-dump_state_queue.patch -autofs-5.1.4-remove-couple-of-undeeded-requires.patch diff --git a/archive-patches/autofs-5.1.5/autofs-5.1.5-Fix-NFS-mount-from-IPv6-addresses.patch b/archive-patches/autofs-5.1.5/autofs-5.1.5-Fix-NFS-mount-from-IPv6-addresses.patch new file mode 100644 index 00000000..c774b972 --- /dev/null +++ b/archive-patches/autofs-5.1.5/autofs-5.1.5-Fix-NFS-mount-from-IPv6-addresses.patch @@ -0,0 +1,47 @@ +autofs-5.1.5 - Fix NFS mount from IPv6 addresses + +From: Goldwyn Rodrigues + +When an NFS server is specified by an IPv6 address and no mount +options, the mount fails because check_address_proto() +receives vers with TCP_REQUESTED set but the host.addr_len is +INET6_ADDRSTRLEN. Removing the check for INET_ADDRSTRLEN +fixes this issue. + +However, this will allow mount from "proto=tcp" for an IPv6 +addressed server. + +Fixes: 9053214 ("autofs-5.1.3 - fix ipv6 proto option handling") +Signed-off-by: Goldwyn Rodrigues +Acked-by: Ian Kent +--- + CHANGELOG | 1 + + modules/replicated.c | 3 --- + 2 files changed, 1 insertion(+), 3 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 5650e73b..c8a3dec2 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -6,6 +6,7 @@ xx/xx/2019 autofs-5.1.6 + - add mount_verbose configuration option. + - optionally log mount requestor process info. + - log mount call arguments if mount_verbose is set. ++- Fix NFS mount from IPv6 addresses. + + 30/10/2018 autofs-5.1.5 + - fix flag file permission. +diff --git a/modules/replicated.c b/modules/replicated.c +index 740270ec..e99e32a9 100644 +--- a/modules/replicated.c ++++ b/modules/replicated.c +@@ -497,9 +497,6 @@ static int check_address_proto(unsigned logopt, + if (ipv6_requested) { + if (host->addr_len == INET_ADDRSTRLEN) + ret = 0; +- } else { +- if (host->addr_len == INET6_ADDRSTRLEN) +- ret = 0; + } + + if (!ret) diff --git a/archive-patches/autofs-5.1.5/autofs-5.1.5-add-NULL-check-for-get_addr_string-return.patch b/archive-patches/autofs-5.1.5/autofs-5.1.5-add-NULL-check-for-get_addr_string-return.patch new file mode 100644 index 00000000..54200ef8 --- /dev/null +++ b/archive-patches/autofs-5.1.5/autofs-5.1.5-add-NULL-check-for-get_addr_string-return.patch @@ -0,0 +1,43 @@ +autofs-5.1.5 - add NULL check for get_addr_string() return + +From: Ian Kent + +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 +--- + CHANGELOG | 1 + + modules/mount_nfs.c | 6 ++++++ + 2 files changed, 7 insertions(+) + +diff --git a/CHANGELOG b/CHANGELOG +index 76da2ee4..e71e913a 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -1,6 +1,7 @@ + xx/xx/2019 autofs-5.1.6 + - support strictexpire mount option. + - fix hesiod string check in master_parse(). ++- add NULL check for get_addr_string() return. + + 30/10/2018 autofs-5.1.5 + - fix flag file permission. +diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c +index 426c27bd..295c4a5d 100644 +--- a/modules/mount_nfs.c ++++ b/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); diff --git a/archive-patches/autofs-5.1.5/autofs-5.1.5-add-ignore-mount-option.patch b/archive-patches/autofs-5.1.5/autofs-5.1.5-add-ignore-mount-option.patch new file mode 100644 index 00000000..7aa00d12 --- /dev/null +++ b/archive-patches/autofs-5.1.5/autofs-5.1.5-add-ignore-mount-option.patch @@ -0,0 +1,87 @@ +autofs-5.1.5 - add ignore mount option + +From: Ian Kent + +Add mount option "ignore", if the kernel supports it, as an +indicator to applications to ignore the mount entry. + +Signed-off-by: Ian Kent +--- + daemon/direct.c | 10 ++++++++++ + daemon/indirect.c | 10 ++++++++++ + include/automount.h | 3 +++ + lib/master.c | 4 ++-- + 4 files changed, 25 insertions(+), 2 deletions(-) + +diff --git a/daemon/direct.c b/daemon/direct.c +index 4f468563..42992220 100644 +--- a/daemon/direct.c ++++ b/daemon/direct.c +@@ -431,6 +431,16 @@ int do_mount_autofs_direct(struct autofs_point *ap, + 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 */ +diff --git a/daemon/indirect.c b/daemon/indirect.c +index 9ccbc038..8719960e 100644 +--- a/daemon/indirect.c ++++ b/daemon/indirect.c +@@ -142,6 +142,16 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root) + } + } + ++ 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) { +diff --git a/include/automount.h b/include/automount.h +index 1bb32015..d02410f3 100644 +--- a/include/automount.h ++++ b/include/automount.h +@@ -557,6 +557,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 */ +diff --git a/lib/master.c b/lib/master.c +index 5f3a3d99..e0bd34ab 100644 +--- a/lib/master.c ++++ b/lib/master.c +@@ -101,9 +101,9 @@ int master_add_autofs_point(struct master_mapent *entry, unsigned logopt, + 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; diff --git a/archive-patches/autofs-5.1.5/autofs-5.1.5-add-mount_verbose-configuration-option.patch b/archive-patches/autofs-5.1.5/autofs-5.1.5-add-mount_verbose-configuration-option.patch new file mode 100644 index 00000000..e49eddb4 --- /dev/null +++ b/archive-patches/autofs-5.1.5/autofs-5.1.5-add-mount_verbose-configuration-option.patch @@ -0,0 +1,188 @@ +autofs-5.1.5 - add mount_verbose configuration option + +From: Lars R. Damerow + +This option makes automount pass the -v flag to mount(8). + +Signed-off-by: Lars R. Damerow +Signed-off-by: Ian Kent +--- + 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(-) + +diff --git a/CHANGELOG b/CHANGELOG +index b3c3b3b9..c2a0c7f1 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -3,6 +3,7 @@ xx/xx/2019 autofs-5.1.6 + - fix hesiod string check in master_parse(). + - add NULL check for get_addr_string() return. + - use malloc(3) in spawn.c. ++- add mount_verbose configuration option. + + 30/10/2018 autofs-5.1.5 + - fix flag file permission. +diff --git a/daemon/spawn.c b/daemon/spawn.c +index 2ab5c46f..4eb268ab 100644 +--- a/daemon/spawn.c ++++ b/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 *); +diff --git a/include/defaults.h b/include/defaults.h +index b28fde34..baa4b4c9 100644 +--- a/include/defaults.h ++++ b/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(void); + 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); +diff --git a/lib/defaults.c b/lib/defaults.c +index ae4d27c1..4ac5a180 100644 +--- a/lib/defaults.c ++++ b/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(void) + 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) +@@ -1781,6 +1787,17 @@ unsigned int defaults_get_append_options(void) + 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) + { + long wait; +diff --git a/man/autofs.conf.5.in b/man/autofs.conf.5.in +index cd7fc2f2..31136e2e 100644 +--- a/man/autofs.conf.5.in ++++ b/man/autofs.conf.5.in +@@ -41,6 +41,10 @@ Set the default timeout for caching failed key lookups (program default + 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) +diff --git a/redhat/autofs.conf.default.in b/redhat/autofs.conf.default.in +index a72a79f6..7949f51a 100644 +--- a/redhat/autofs.conf.default.in ++++ b/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 +diff --git a/samples/autofs.conf.default.in b/samples/autofs.conf.default.in +index 2693a975..d33625f1 100644 +--- a/samples/autofs.conf.default.in ++++ b/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 diff --git a/archive-patches/autofs-5.1.5/autofs-5.1.5-add-strictexpire-mount-option.patch b/archive-patches/autofs-5.1.5/autofs-5.1.5-add-strictexpire-mount-option.patch new file mode 100644 index 00000000..46451ac3 --- /dev/null +++ b/archive-patches/autofs-5.1.5/autofs-5.1.5-add-strictexpire-mount-option.patch @@ -0,0 +1,215 @@ +autofs-5.1.5 - support strictexpire mount option + +From: Ian Kent + +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 +--- + CHANGELOG | 3 +++ + 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, 47 insertions(+), 1 deletion(-) + +diff --git a/CHANGELOG b/CHANGELOG +index ca036f19..f671dc52 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -1,3 +1,6 @@ ++xx/xx/2019 autofs-5.1.6 ++- support strictexpire mount option. ++ + 30/10/2018 autofs-5.1.5 + - fix flag file permission. + - fix directory create permission. +diff --git a/daemon/direct.c b/daemon/direct.c +index b885d12f..9c61c4b4 100644 +--- a/daemon/direct.c ++++ b/daemon/direct.c +@@ -421,6 +421,16 @@ int do_mount_autofs_direct(struct autofs_point *ap, + 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 */ +diff --git a/daemon/indirect.c b/daemon/indirect.c +index 438a0a21..d0724293 100644 +--- a/daemon/indirect.c ++++ b/daemon/indirect.c +@@ -132,6 +132,16 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root) + 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) { +diff --git a/include/automount.h b/include/automount.h +index 947daa10..1bb32015 100644 +--- a/include/automount.h ++++ b/include/automount.h +@@ -554,6 +554,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 */ +diff --git a/lib/master_parse.y b/lib/master_parse.y +index 9aa57327..8fe8b128 100644 +--- a/lib/master_parse.y ++++ b/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 map + %type 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 *buffer, unsigned int default_timeout, unsigne + 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) +diff --git a/lib/master_tok.l b/lib/master_tok.l +index f4e940ce..7486710b 100644 +--- a/lib/master_tok.l ++++ b/lib/master_tok.l +@@ -391,6 +391,7 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTWS}) + -?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); } +diff --git a/man/auto.master.5.in b/man/auto.master.5.in +index 68242d45..dace4a1c 100644 +--- a/man/auto.master.5.in ++++ b/man/auto.master.5.in +@@ -199,6 +199,14 @@ entries only, either in the master map (so it effects all map entries) + 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 +diff --git a/modules/mount_autofs.c b/modules/mount_autofs.c +index cd0631b8..72e1aba4 100644 +--- a/modules/mount_autofs.c ++++ b/modules/mount_autofs.c +@@ -57,6 +57,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, + 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, const char *root, const char *name, + 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, const char *root, const char *name, + nap->parent = ap; + if (symlnk) + nap->flags |= MOUNT_FLAG_SYMLINK; ++ if (strictexpire) ++ nap->flags |= MOUNT_FLAG_STRICTEXPIRE; + + if (hosts) + argc = 0; diff --git a/archive-patches/autofs-5.1.5/autofs-5.1.5-fix-hesiod-string-check-in-master_parse.patch b/archive-patches/autofs-5.1.5/autofs-5.1.5-fix-hesiod-string-check-in-master_parse.patch new file mode 100644 index 00000000..4c155fa0 --- /dev/null +++ b/archive-patches/autofs-5.1.5/autofs-5.1.5-fix-hesiod-string-check-in-master_parse.patch @@ -0,0 +1,52 @@ +autofs-5.1.5 - fix hesiod string check in master_parse() + +From: Ian Kent + +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 +--- + CHANGELOG | 1 + + lib/master_parse.y | 8 ++++---- + 2 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index f671dc52..76da2ee4 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -1,5 +1,6 @@ + xx/xx/2019 autofs-5.1.6 + - support strictexpire mount option. ++- fix hesiod string check in master_parse(). + + 30/10/2018 autofs-5.1.5 + - fix flag file permission. +diff --git a/lib/master_parse.y b/lib/master_parse.y +index 8fe8b128..f817f739 100644 +--- a/lib/master_parse.y ++++ b/lib/master_parse.y +@@ -173,8 +173,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; +@@ -362,8 +362,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; diff --git a/archive-patches/autofs-5.1.5/autofs-5.1.5-log-mount-call-arguments-if-mount_verbose-is-set.patch b/archive-patches/autofs-5.1.5/autofs-5.1.5-log-mount-call-arguments-if-mount_verbose-is-set.patch new file mode 100644 index 00000000..56f75195 --- /dev/null +++ b/archive-patches/autofs-5.1.5/autofs-5.1.5-log-mount-call-arguments-if-mount_verbose-is-set.patch @@ -0,0 +1,234 @@ +autofs-5.1.5 - log mount call arguments if mount_verbose is set + +From: Lars R. Damerow + +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 +Signed-off-by: Ian Kent +--- + 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(-) + +diff --git a/CHANGELOG b/CHANGELOG +index ee7deda4..5650e73b 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -5,6 +5,7 @@ xx/xx/2019 autofs-5.1.6 + - 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. + + 30/10/2018 autofs-5.1.5 + - fix flag file permission. +diff --git a/modules/mount_afs.c b/modules/mount_afs.c +index 2a776bd2..ef4e04da 100644 +--- a/modules/mount_afs.c ++++ b/modules/mount_afs.c +@@ -37,10 +37,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + 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, const char *root, const char *name, int + 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. */ + } +diff --git a/modules/mount_bind.c b/modules/mount_bind.c +index b64cdccc..9cba0d7a 100644 +--- a/modules/mount_bind.c ++++ b/modules/mount_bind.c +@@ -81,10 +81,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + 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, const char *root, const char *name, int + 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); +diff --git a/modules/mount_ext2.c b/modules/mount_ext2.c +index 3bbea95a..eb28b06c 100644 +--- a/modules/mount_ext2.c ++++ b/modules/mount_ext2.c +@@ -47,10 +47,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + 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, const char *root, const char *name, int + } + + 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); + } + +diff --git a/modules/mount_generic.c b/modules/mount_generic.c +index b1a3adbf..cf531145 100644 +--- a/modules/mount_generic.c ++++ b/modules/mount_generic.c +@@ -46,10 +46,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + 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, const char *root, const char *name, int + 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); + } + +diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c +index 295c4a5d..4e3e703f 100644 +--- a/modules/mount_nfs.c ++++ b/modules/mount_nfs.c +@@ -77,13 +77,17 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + 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, const char *root, const char *name, int + 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); + } diff --git a/archive-patches/autofs-5.1.5/autofs-5.1.5-optionally-log-mount-requestor-process-info.patch b/archive-patches/autofs-5.1.5/autofs-5.1.5-optionally-log-mount-requestor-process-info.patch new file mode 100644 index 00000000..51d6f389 --- /dev/null +++ b/archive-patches/autofs-5.1.5/autofs-5.1.5-optionally-log-mount-requestor-process-info.patch @@ -0,0 +1,171 @@ +autofs-5.1.5 - optionally log mount requestor process info + +From: Lars R. Damerow + +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 +Signed-off-by: Ian Kent +--- + 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(-) + +diff --git a/CHANGELOG b/CHANGELOG +index c2a0c7f1..ee7deda4 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -4,6 +4,7 @@ xx/xx/2019 autofs-5.1.6 + - 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. + + 30/10/2018 autofs-5.1.5 + - fix flag file permission. +diff --git a/daemon/direct.c b/daemon/direct.c +index 9c61c4b4..4f468563 100644 +--- a/daemon/direct.c ++++ b/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, +diff --git a/daemon/indirect.c b/daemon/indirect.c +index d0724293..9ccbc038 100644 +--- a/daemon/indirect.c ++++ b/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"); +diff --git a/include/log.h b/include/log.h +index c9b17b3c..69eed96b 100644 +--- a/include/log.h ++++ b/include/log.h +@@ -46,6 +46,8 @@ extern void log_crit(unsigned, const char* msg, ...); + 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) + +diff --git a/lib/log.c b/lib/log.c +index ca771d72..0cb47d7e 100644 +--- a/lib/log.c ++++ b/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; ++} +diff --git a/man/autofs.conf.5.in b/man/autofs.conf.5.in +index 31136e2e..95ff7dd0 100644 +--- a/man/autofs.conf.5.in ++++ b/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 +diff --git a/redhat/autofs.conf.default.in b/redhat/autofs.conf.default.in +index 7949f51a..4b89a5f7 100644 +--- a/redhat/autofs.conf.default.in ++++ b/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 + # +diff --git a/samples/autofs.conf.default.in b/samples/autofs.conf.default.in +index d33625f1..2f155111 100644 +--- a/samples/autofs.conf.default.in ++++ b/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 + # diff --git a/archive-patches/autofs-5.1.5/autofs-5.1.5-use-malloc-in-spawn_c.patch b/archive-patches/autofs-5.1.5/autofs-5.1.5-use-malloc-in-spawn_c.patch new file mode 100644 index 00000000..653d87dd --- /dev/null +++ b/archive-patches/autofs-5.1.5/autofs-5.1.5-use-malloc-in-spawn_c.patch @@ -0,0 +1,165 @@ +autofs-5.1.5 - use malloc(3) in spawn.c + +From: Ian Kent + +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 +--- + CHANGELOG | 1 + + daemon/spawn.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------ + 2 files changed, 45 insertions(+), 6 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index e71e913a..b3c3b3b9 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -2,6 +2,7 @@ xx/xx/2019 autofs-5.1.6 + - support strictexpire mount option. + - fix hesiod string check in master_parse(). + - add NULL check for get_addr_string() return. ++- use malloc(3) in spawn.c. + + 30/10/2018 autofs-5.1.5 + - fix flag file permission. +diff --git a/daemon/spawn.c b/daemon/spawn.c +index dbbca7fa..2ab5c46f 100644 +--- a/daemon/spawn.c ++++ b/daemon/spawn.c +@@ -521,22 +521,33 @@ int spawnv(unsigned logopt, const char *prog, const char *const *argv) + 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; + } diff --git a/archive-patches/autofs-5.1.5/patch_order_5.1.5 b/archive-patches/autofs-5.1.5/patch_order_5.1.5 new file mode 100644 index 00000000..17679442 --- /dev/null +++ b/archive-patches/autofs-5.1.5/patch_order_5.1.5 @@ -0,0 +1,9 @@ +autofs-5.1.5-add-strictexpire-mount-option.patch +autofs-5.1.5-fix-hesiod-string-check-in-master_parse.patch +autofs-5.1.5-add-NULL-check-for-get_addr_string-return.patch +autofs-5.1.5-use-malloc-in-spawn_c.patch +autofs-5.1.5-add-mount_verbose-configuration-option.patch +autofs-5.1.5-optionally-log-mount-requestor-process-info.patch +autofs-5.1.5-log-mount-call-arguments-if-mount_verbose-is-set.patch +autofs-5.1.5-add-ignore-mount-option.patch +autofs-5.1.5-Fix-NFS-mount-from-IPv6-addresses.patch diff --git a/make/system-tools.mk b/make/system-tools.mk index 1f56d519..47257914 100644 --- a/make/system-tools.mk +++ b/make/system-tools.mk @@ -709,17 +709,17 @@ $(D)/ntfs-3g: $(ARCHIVE)/ntfs-3g_ntfsprogs-$(NTFS-3G_VER).tgz | $(TARGET_DIR) AUTOFS5_MAJOR = 5 AUTOFS5_MINOR = 1 -AUTOFS5_MICRO = 4 +AUTOFS5_MICRO = 5 AUTOFS5_VER = $(AUTOFS5_MAJOR).$(AUTOFS5_MINOR).$(AUTOFS5_MICRO) $(ARCHIVE)/autofs-$(AUTOFS5_VER).tar.gz: $(WGET) https://www.kernel.org/pub/linux/daemons/autofs/v$(AUTOFS5_MAJOR)/autofs-$(AUTOFS5_VER).tar.gz -# cd $(PATCHES)\autofs-5.1.4 -# wget -N https://mirrors.edge.kernel.org/pub/linux/daemons/autofs/v5/patches-5.1.5/patch_order-5.1.4 -# for p in $(cat patch_order-5.1.4); do test -f $p || wget https://mirrors.edge.kernel.org/pub/linux/daemons/autofs/v5/patches-5.1.5/$p; done +# cd $(PATCHES)\autofs-5.1.5 +# wget -N https://mirrors.edge.kernel.org/pub/linux/daemons/autofs/v5/patches-5.1.6/patch_order_5.1.5 +# for p in $(cat patch_order_5.1.5); do test -f $p || wget https://mirrors.edge.kernel.org/pub/linux/daemons/autofs/v5/patches-5.1.6/$p; done -AUTOFS_PATCH = $(addprefix autofs-$(AUTOFS5_VER)/, $(shell cat $(PATCHES)/autofs-$(AUTOFS5_VER)/patch_order-$(AUTOFS5_VER))) +AUTOFS_PATCH = $(addprefix autofs-$(AUTOFS5_VER)/, $(shell cat $(PATCHES)/autofs-$(AUTOFS5_VER)/patch_order_$(AUTOFS5_VER))) $(D)/autofs5: $(D)/libtirpc $(ARCHIVE)/autofs-$(AUTOFS5_VER).tar.gz | $(TARGET_DIR) $(REMOVE)/autofs-$(AUTOFS5_VER)