Browse Source

- autofs5: bump version to 5.1.5; add latest paches

master
vanhofen 6 years ago
parent
commit
453ff0b0d2
  1. 66
      archive-patches/autofs-5.1.4/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch
  2. 557
      archive-patches/autofs-5.1.4/autofs-5.1.4-account-for-libnsl-changes.patch
  3. 38
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-NULL-check-in-prepare_attempt_prefix.patch
  4. 42
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch
  5. 184
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch
  6. 121
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch
  7. 402
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch
  8. 342
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-map-nfs4_c.patch
  9. 44
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch
  10. 191
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-master-map-pseudo-options-for-mount-propagation.patch
  11. 696
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-mount_fedfs_c.patch
  12. 147
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-systemd-service-command-line-option.patch
  13. 43
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-units-After-line-to-include-statd-service.patch
  14. 138
      archive-patches/autofs-5.1.4/autofs-5.1.4-better-handle-hesiod-support-not-built-in.patch
  15. 146
      archive-patches/autofs-5.1.4/autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch
  16. 434
      archive-patches/autofs-5.1.4/autofs-5.1.4-covarity-fixes-1.patch
  17. 48
      archive-patches/autofs-5.1.4/autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch
  18. 56
      archive-patches/autofs-5.1.4/autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch
  19. 49
      archive-patches/autofs-5.1.4/autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch
  20. 75
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-NFS-version-mask-usage.patch
  21. 46
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-age-setting-at-startup.patch
  22. 72
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-amd-parser-opts-option-handling.patch
  23. 40
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch
  24. 207
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-directory-create-permission.patch
  25. 35
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch
  26. 50
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch
  27. 41
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-flag-file-permission.patch
  28. 44
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-incorrect-locking-in-sss-lookup.patch
  29. 39
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-indent-in-automount-8-man-page.patch
  30. 94
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-libresolv-configure-check.patch
  31. 49
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-monotonic_elapsed.patch
  32. 38
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-possible-NULL-pointer-access-in-get_defaults_entry.patch
  33. 55
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch
  34. 44
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-program-usage-message.patch
  35. 40
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch
  36. 48
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch
  37. 102
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-update_negative_cache-map-source-usage.patch
  38. 55
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch
  39. 38
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-parse_ldap_config.patch
  40. 123
      archive-patches/autofs-5.1.4/autofs-5.1.4-improve-hostname-lookup-error-logging.patch
  41. 43
      archive-patches/autofs-5.1.4/autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch
  42. 68
      archive-patches/autofs-5.1.4/autofs-5.1.4-mark-removed-cache-entry-negative.patch
  43. 125
      archive-patches/autofs-5.1.4/autofs-5.1.4-move-close-stdio-descriptors-to-become_daemon.patch
  44. 359
      archive-patches/autofs-5.1.4/autofs-5.1.4-refactor-negative-map-entry-check.patch
  45. 236
      archive-patches/autofs-5.1.4/autofs-5.1.4-remove-autofs4-module-load-code.patch
  46. 38
      archive-patches/autofs-5.1.4/autofs-5.1.4-remove-couple-of-undeeded-requires.patch
  47. 41
      archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_master.patch
  48. 57
      archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_state_queue.patch
  49. 73
      archive-patches/autofs-5.1.4/autofs-5.1.4-set-bind-mount-as-propagation-slave.patch
  50. 52
      archive-patches/autofs-5.1.4/autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch
  51. 45
      archive-patches/autofs-5.1.4/autofs-5.1.4-update-build-info-with-systemd.patch
  52. 108
      archive-patches/autofs-5.1.4/autofs-5.1.4-use-defines-for-expire-type.patch
  53. 225
      archive-patches/autofs-5.1.4/autofs-5.1.4-use-flags-for-startup-boolean-options.patch
  54. 1572
      archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch
  55. 226
      archive-patches/autofs-5.1.4/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch
  56. 55
      archive-patches/autofs-5.1.4/patch_order-5.1.4
  57. 47
      archive-patches/autofs-5.1.5/autofs-5.1.5-Fix-NFS-mount-from-IPv6-addresses.patch
  58. 43
      archive-patches/autofs-5.1.5/autofs-5.1.5-add-NULL-check-for-get_addr_string-return.patch
  59. 87
      archive-patches/autofs-5.1.5/autofs-5.1.5-add-ignore-mount-option.patch
  60. 188
      archive-patches/autofs-5.1.5/autofs-5.1.5-add-mount_verbose-configuration-option.patch
  61. 215
      archive-patches/autofs-5.1.5/autofs-5.1.5-add-strictexpire-mount-option.patch
  62. 52
      archive-patches/autofs-5.1.5/autofs-5.1.5-fix-hesiod-string-check-in-master_parse.patch
  63. 234
      archive-patches/autofs-5.1.5/autofs-5.1.5-log-mount-call-arguments-if-mount_verbose-is-set.patch
  64. 171
      archive-patches/autofs-5.1.5/autofs-5.1.5-optionally-log-mount-requestor-process-info.patch
  65. 165
      archive-patches/autofs-5.1.5/autofs-5.1.5-use-malloc-in-spawn_c.patch
  66. 9
      archive-patches/autofs-5.1.5/patch_order_5.1.5
  67. 10
      make/system-tools.mk

66
archive-patches/autofs-5.1.4/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch

@ -1,66 +0,0 @@
autofs-5.1.4 - Makefiles.rules: remove 'samples' from SUBDIRS
From: NeilBrown <neilb@suse.com>
The rules in Makefile make it quite clear that
'samples' is not expected to be part of SUBDIRS.
e.g.
- The rule for "clean" handles both $(SUBDIRS) *and* samples.
- There are separate "install" and "install_samples" targets.
However SUBDIRS does contain 'samples'. This means that
a simple "make; make install" will over-write your configuration files.
So remove 'samples' from SUBDIRS. Note that it has been removed in
the past, but then got added back again.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
Makefile.rules | 2 +-
autofs.spec | 6 ++++++
3 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index 313730b1..1e5ec15b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -11,6 +11,7 @@ xx/xx/2018 autofs-5.1.5
- account for recent libnsl changes.
- use_hostname_for_mounts shouldn't prevent selection among replicas.
- fix monotonic_elapsed.
+- Makefiles.rules: remove 'samples' from SUBDIRS.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/Makefile.rules b/Makefile.rules
index 2bfa043c..4deab3b9 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -3,7 +3,7 @@
#
# Root directory contents
-SUBDIRS = lib daemon modules man samples
+SUBDIRS = lib daemon modules man
INCDIRS = include
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
diff --git a/autofs.spec b/autofs.spec
index 6da0655d..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

557
archive-patches/autofs-5.1.4/autofs-5.1.4-account-for-libnsl-changes.patch

@ -1,557 +0,0 @@
autofs-5.1.4 - account for recent libnsl changes
From: Ian Kent <raven@themaw.net>
The glibc RPC code has been dropped.
The NIS functionality comes in the libnsl library but it installs
its files into sub directories of the system include and library
directories.
So configure needs to check for this and allow for it in the
compile and linking of the NIS and NIS+ lookup modules.
---
CHANGELOG | 1
Makefile.conf.in | 4 -
Makefile.rules | 2
aclocal.m4 | 45 ++++++++
configure | 288 ++++++++++++++++++++++++++++++++++++++++++++++++---
configure.in | 27 ++---
include/config.h.in | 3 +
modules/Makefile | 10 ++
8 files changed, 343 insertions(+), 37 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 9d19c0a7..2d5d5b1f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -8,6 +8,7 @@ xx/xx/2018 autofs-5.1.5
- fix sublink option not set from defaults.
- fix error return in do_nfs_mount().
- add error handling for ext_mount_add().
+- account for recent libnsl changes.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/Makefile.conf.in b/Makefile.conf.in
index f879e262..85662654 100644
--- a/Makefile.conf.in
+++ b/Makefile.conf.in
@@ -14,8 +14,8 @@ DAEMON_LDFLAGS = @DAEMON_LDFLAGS@
# Glibc < 2.17 requires librt for clock_gettime()
LIBCLOCK_GETTIME = @LIBCLOCK_GETTIME@
-# Special parameters for glibc (libc 6)
-LIBNSL = @LIBNSL@
+NSLLIB = @NSL_LIBS@
+NSLCFLAGS = @NSL_CFLAGS@
LIBRESOLV = @LIBRESOLV@
# Hesiod support: yes (1) no (0)
diff --git a/Makefile.rules b/Makefile.rules
index 0edf9bfe..2bfa043c 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -54,8 +54,6 @@ ifdef DMALLOCLIB
LIBS += $(DMALLOCLIB)
endif
-LIBS += $(LIBNSL)
-
LIBS += $(LIBCLOCK_GETTIME)
# Standard rules
diff --git a/aclocal.m4 b/aclocal.m4
index 51772043..f1ed3870 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -417,3 +417,48 @@ fi
LIBS="$af_check_ldap_parse_page_control_save_libs"
])
+dnl --------------------------------------------------------------------------
+dnl AF_CHECK_YPCLNT_HEADER
+dnl
+dnl Check for include file rpcsvc/ypclnt.h for YellowPages support.
+dnl --------------------------------------------------------------------------
+AC_DEFUN([AF_CHECK_YPCLNT_HEADER],
+[
+# save current CFLAGS
+af_check_ypclnt_header_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
+
+HAVE_YPCLNT=0
+AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1)
+AC_SUBST(HAVE_YPCLNT)
+if test "$HAVE_YPCLNT" = "1"; then
+ AC_DEFINE(HAVE_YPCLNT, 1,
+ [Define if using YellowPages])
+fi
+
+# restore libs
+CFLAGS="$af_check_ypclnt_header_save_cflags"
+])
+
+dnl --------------------------------------------------------------------------
+dnl AF_CHECK_NIS_HEADER
+dnl
+dnl Check for include file rpcsvc/nis.h for NIS+ support.
+dnl --------------------------------------------------------------------------
+AC_DEFUN([AF_CHECK_NIS_HEADER],
+[
+# save current CFLAGS
+af_check_nis_header_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
+
+HAVE_NISPLUS=0
+AC_CHECK_HEADER([rpcsvc/nis.h], HAVE_NISPLUS=1)
+AC_SUBST(HAVE_NISPLUS)
+if test "$HAVE_NISPLUS" = "1"; then
+ AC_DEFINE(HAVE_NISPLUS, 1,
+ [Define if using NIS+])
+fi
+
+# restore libs
+CFLAGS="$af_check_nis_header_save_cflags"
+])
diff --git a/configure b/configure
index 476cea4b..2d517aac 100755
--- a/configure
+++ b/configure
@@ -634,8 +634,8 @@ XML_FLAGS
LIBLDAP
HAVE_LDAP
LDAP_FLAGS
-HAVE_YPCLNT
HAVE_NISPLUS
+HAVE_YPCLNT
EGREP
GREP
CPP
@@ -643,7 +643,8 @@ HESIOD_FLAGS
LIBHESIOD
HAVE_HESIOD
LIBRESOLV
-LIBNSL
+NSL_LIBS
+NSL_CFLAGS
LIBCLOCK_GETTIME
KRB5_CONFIG
XML_CONFIG
@@ -764,6 +765,8 @@ CFLAGS
LDFLAGS
LIBS
CPPFLAGS
+NSL_CFLAGS
+NSL_LIBS
CPP'
@@ -1417,6 +1420,8 @@ Some influential environment variables:
LIBS libraries to pass to the linker, e.g. -l<library>
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
+ NSL_CFLAGS C compiler flags for NSL, overriding pkg-config
+ NSL_LIBS linker flags for NSL, overriding pkg-config
CPP C preprocessor
Use these variables to override the choices made by `configure' or to help
@@ -4500,9 +4505,186 @@ fi
-#
-# glibc/libc 6 new libraries
-#
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.9.0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ PKG_CONFIG=""
+ fi
+fi
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NSL" >&5
+$as_echo_n "checking for NSL... " >&6; }
+
+if test -n "$NSL_CFLAGS"; then
+ pkg_cv_NSL_CFLAGS="$NSL_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_NSL_CFLAGS=`$PKG_CONFIG --cflags "libnsl" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$NSL_LIBS"; then
+ pkg_cv_NSL_LIBS="$NSL_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_NSL_LIBS=`$PKG_CONFIG --libs "libnsl" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ NSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libnsl" 2>&1`
+ else
+ NSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libnsl" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$NSL_PKG_ERRORS" >&5
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5
$as_echo_n "checking for yp_match in -lnsl... " >&6; }
if ${ac_cv_lib_nsl_yp_match+:} false; then :
@@ -4540,10 +4722,66 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5
$as_echo "$ac_cv_lib_nsl_yp_match" >&6; }
if test "x$ac_cv_lib_nsl_yp_match" = xyes; then :
- LIBNSL="-lnsl"
+ NSL_LIBS="-lnsl"
fi
+NSL_CFLAGS=""
+
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5
+$as_echo_n "checking for yp_match in -lnsl... " >&6; }
+if ${ac_cv_lib_nsl_yp_match+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char yp_match ();
+int
+main ()
+{
+return yp_match ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nsl_yp_match=yes
+else
+ ac_cv_lib_nsl_yp_match=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5
+$as_echo "$ac_cv_lib_nsl_yp_match" >&6; }
+if test "x$ac_cv_lib_nsl_yp_match" = xyes; then :
+ NSL_LIBS="-lnsl"
+fi
+
+
+NSL_CFLAGS=""
+
+else
+ NSL_CFLAGS=$pkg_cv_NSL_CFLAGS
+ NSL_LIBS=$pkg_cv_NSL_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query in -lresolv" >&5
$as_echo_n "checking for res_query in -lresolv... " >&6; }
@@ -4659,8 +4897,6 @@ fi
LDFLAGS="${AF_tmp_ldflags}"
-# NIS+ support?
-HAVE_NISPLUS=0
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -5058,15 +5294,11 @@ fi
done
-ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default"
-if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then :
- HAVE_NISPLUS=1
-fi
-
+# save current CFLAGS
+af_check_ypclnt_header_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
-
-# YellowPages support?
HAVE_YPCLNT=0
ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/ypclnt.h" "ac_cv_header_rpcsvc_ypclnt_h" "$ac_includes_default"
if test "x$ac_cv_header_rpcsvc_ypclnt_h" = xyes; then :
@@ -5081,6 +5313,32 @@ $as_echo "#define HAVE_YPCLNT 1" >>confdefs.h
fi
+# restore libs
+CFLAGS="$af_check_ypclnt_header_save_cflags"
+
+
+# save current CFLAGS
+af_check_nis_header_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
+
+HAVE_NISPLUS=0
+ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default"
+if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then :
+ HAVE_NISPLUS=1
+fi
+
+
+
+if test "$HAVE_NISPLUS" = "1"; then
+
+$as_echo "#define HAVE_NISPLUS 1" >>confdefs.h
+
+fi
+
+# restore libs
+CFLAGS="$af_check_nis_header_save_cflags"
+
+
#
# OpenLDAP support? Expect that this may have a special directory...
#
diff --git a/configure.in b/configure.in
index d3660923..d74775cc 100644
--- a/configure.in
+++ b/configure.in
@@ -209,11 +209,13 @@ fi
AC_CHECK_LIB(rt, clock_gettime, LIBCLOCK_GETTIME="-lrt")
AC_SUBST(LIBCLOCK_GETTIME)
-#
-# glibc/libc 6 new libraries
-#
-AC_CHECK_LIB(nsl, yp_match, LIBNSL="-lnsl")
-AC_SUBST(LIBNSL)
+PKG_PROG_PKG_CONFIG()
+PKG_CHECK_MODULES([NSL],[libnsl],,
+[
+AC_CHECK_LIB(nsl, yp_match, NSL_LIBS="-lnsl")
+AC_SUBST(NSL_LIBS)
+NSL_CFLAGS=""
+])
AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv")
AC_SUBST(LIBRESOLV)
@@ -254,19 +256,8 @@ AC_SUBST(LIBHESIOD)
AC_SUBST(HESIOD_FLAGS)
LDFLAGS="${AF_tmp_ldflags}"
-# NIS+ support?
-HAVE_NISPLUS=0
-AC_CHECK_HEADER(rpcsvc/nis.h, HAVE_NISPLUS=1)
-AC_SUBST(HAVE_NISPLUS)
-
-# YellowPages support?
-HAVE_YPCLNT=0
-AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1)
-AC_SUBST(HAVE_YPCLNT)
-if test "$HAVE_YPCLNT" = "1"; then
- AC_DEFINE(HAVE_YPCLNT, 1,
- [Define if using YellowPages])
-fi
+AF_CHECK_YPCLNT_HEADER()
+AF_CHECK_NIS_HEADER()
#
# OpenLDAP support? Expect that this may have a special directory...
diff --git a/include/config.h.in b/include/config.h.in
index 04873e8f..991a2bda 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -57,6 +57,9 @@
/* define if you have MOUNT_NFS */
#undef HAVE_MOUNT_NFS
+/* Define if using NIS+ */
+#undef HAVE_NISPLUS
+
/* define if the umount command supports the -c option */
#undef HAVE_NO_CANON_UMOUNT
diff --git a/modules/Makefile b/modules/Makefile
index d9ab06c5..0447559a 100644
--- a/modules/Makefile
+++ b/modules/Makefile
@@ -116,6 +116,16 @@ parse_amd.so: parse_amd.c amd_parse.tab.o amd_tok.o
#
# Ad hoc compilation rules for modules which need auxilliary libraries
#
+lookup_yp.so: lookup_yp.c
+ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_yp.so \
+ lookup_yp.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB)
+ $(STRIP) lookup_yp.so
+
+lookup_nisplus.so: lookup_nisplus.c
+ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_nisplus.so \
+ lookup_nisplus.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB)
+ $(STRIP) lookup_nisplus.so
+
lookup_hesiod.so: lookup_hesiod.c
$(CC) $(SOLDFLAGS) $(CFLAGS) $(HESIOD_FLAGS) -o lookup_hesiod.so \
lookup_hesiod.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBHESIOD) $(LIBRESOLV) $(LIBS)

38
archive-patches/autofs-5.1.4/autofs-5.1.4-add-NULL-check-in-prepare_attempt_prefix.patch

@ -1,38 +0,0 @@
autofs-5.1.4 - add NULL check in prepare_attempt_prefix()
From: Ian Kent <raven@themaw.net>
prepare_attempt_prefix() calls calloc(3) and continues without
checking if the allocation succeeded.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/log.c | 2 ++
2 files changed, 3 insertions(+)
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);

42
archive-patches/autofs-5.1.4/autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch

@ -1,42 +0,0 @@
autofs-5.1.4 - add an example fedfs master map entry to the installed master map
From: Ian Kent <raven@themaw.net>
Add an example of using the fedfs program map (to facilitate access
to fedfs domain mounts) to the installed master map.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
samples/auto.master | 6 ++++++
2 files changed, 7 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index bbe8019e..f771a433 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -18,6 +18,7 @@ xx/xx/2018 autofs-5.1.5
- add mount.fedfs.c.
- add fedfs-map-nfs4.c.
- add conditional inclusion of fedfs binaries.
+- add an example fedfs master map entry to the installed master map.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/samples/auto.master b/samples/auto.master
index 0f2c8ab0..9a9968a3 100644
--- a/samples/auto.master
+++ b/samples/auto.master
@@ -17,6 +17,12 @@
#
+dir:/etc/auto.master.d
#
+# If you have fedfs set up and the related binaries, either
+# built as part of autofs or installed from another package,
+# uncomment this line to use the fedfs program map to access
+# your fedfs mounts.
+#/nfs4 /usr/sbin/fedfs-map-nfs4 nobind
+#
# Include central master map if it can be found using
# nsswitch sources.
#

184
archive-patches/autofs-5.1.4/autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch

@ -1,184 +0,0 @@
autofs-5.1.4 - add conditional inclusion of fedfs binaries
From: Ian Kent <raven@themaw.net>
Add conditional inclusion of the fedfs binaries.
Using configure a --with-fedfs is needed to build and install
the fedfs binaries.
Using rpmbuild -tb <autofs tar> it's necessary to add the option
--without fedfs to exclude the fedfs binaries from the resulting
rpm package.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
Makefile.conf.in | 2 ++
Makefile.rules | 6 +++++-
autofs.spec | 12 +++++++++++-
configure | 16 ++++++++++++++++
configure.in | 9 +++++++++
6 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 412e3382..bbe8019e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -17,6 +17,7 @@ xx/xx/2018 autofs-5.1.5
- add fedfs-getsrvinfo.c.
- add mount.fedfs.c.
- add fedfs-map-nfs4.c.
+- add conditional inclusion of fedfs binaries.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/Makefile.conf.in b/Makefile.conf.in
index 85662654..3fe1a0a0 100644
--- a/Makefile.conf.in
+++ b/Makefile.conf.in
@@ -58,6 +58,8 @@ EXT3FS = @HAVE_E3FSCK@
# Support for calling e4fsck when mounting ext4 filesystems
EXT4FS = @HAVE_E4FSCK@
+FEDFS = @ENABLE_FEDFS@
+
LEX = @PATH_LEX@
YACC = @PATH_YACC@
RPCGEN = @PATH_RPCGEN@
diff --git a/Makefile.rules b/Makefile.rules
index fc9f6019..2ccb1f6e 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -3,12 +3,16 @@
#
# Root directory contents
-SUBDIRS = lib daemon fedfs modules man
+SUBDIRS = lib daemon modules man
INCDIRS = include
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
configure *.patch autofs.spec
+ifeq ($(FEDFS), 1)
+ SUBDIRS += fedfs
+endif
+
# Attempt to be friends with autotools
INSTALLROOT = $(DESTDIR)
diff --git a/autofs.spec b/autofs.spec
index 157c09b4..2cb09ef0 100644
--- a/autofs.spec
+++ b/autofs.spec
@@ -16,6 +16,10 @@
# disable them.
%define with_libtirpc %{?_without_libtirpc: 0} %{?!_without_libtirpc: 1}
+# Use --without fedfs in your rpmbuild command or force values to 0 to
+# disable them.
+%define with_fedfs %{?_without_fedfs: 0} %{?!_without_fedfs: 1}
+
Summary: A tool from automatically mounting and umounting filesystems.
Name: autofs
%define version 5.1.4
@@ -82,6 +86,9 @@ echo %{version}-%{release} > .version
%if %{with_libtirpc}
%define libtirpc_configure_arg --with-libtirpc
%endif
+%if %{with_fedfs}
+ %define fedfs_configure_arg --enable-fedfs
+%endif
%build
CFLAGS="$RPM_OPT_FLAGS -Wall" \
@@ -90,7 +97,8 @@ LDFLAGS="-Wl,-z,now" \
--disable-mount-locking \
--enable-ignore-busy \
%{?systemd_configure_arg:} \
- %{?libtirpc_configure_arg:}
+ %{?libtirpc_configure_arg:} \
+ %{?fedfs_configure_arg:}
CFLAGS="$RPM_OPT_FLAGS -Wall" LDFLAGS="-Wl,-z,now" make initdir=/etc/rc.d/init.d DONTSTRIP=1
%install
@@ -191,8 +199,10 @@ fi
%config(noreplace) /etc/sysconfig/autofs
%config(noreplace) /etc/autofs_ldap_auth.conf
%{_sbindir}/automount
+%if %{with_fedfs}
%{_sbindir}/mount.fedfs
%{_sbindir}/fedfs-map-nfs4
+%endif
%dir %{_libdir}/autofs
%{_libdir}/autofs/*
%{_mandir}/*/*
diff --git a/configure b/configure
index 5c8aae30..9682b36f 100755
--- a/configure
+++ b/configure
@@ -648,6 +648,7 @@ NSL_CFLAGS
LIBCLOCK_GETTIME
KRB5_CONFIG
XML_CONFIG
+ENABLE_FEDFS
sssldir
HAVE_SSS_AUTOFS
PATH_RPCGEN
@@ -743,6 +744,7 @@ with_libtirpc
with_dmalloc
enable_sloppy_mount
enable_no_canon_umount
+enable_fedfs
with_hesiod
with_openldap
with_sasl
@@ -1377,6 +1379,7 @@ Optional Features:
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-sloppy-mount enable the use of the -s option to mount
--enable-no-canon-umount enable the use of the -c option to umount
+ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4
--disable-ext-env disable search in environment for substitution variable
--disable-mount-locking disable use of locking when spawning mount command
--enable-force-shutdown enable USR1 signal to force unlink umount of any
@@ -4246,6 +4249,19 @@ $as_echo "#define HAVE_NO_CANON_UMOUNT 1" >>confdefs.h
fi
+ENABLE_FEDFS=""
+# Check whether --enable-fedfs was given.
+if test "${enable_fedfs+set}" = set; then :
+ enableval=$enable_fedfs;
+else
+ enable_fedfs=no
+fi
+
+if test x$enable_fedfs = xyes; then
+ ENABLE_FEDFS="1"
+fi
+
+
# LDAP SASL auth needs libxml and Kerberos
for ac_prog in xml2-config
do
diff --git a/configure.in b/configure.in
index 4d1208f5..de06a96d 100644
--- a/configure.in
+++ b/configure.in
@@ -195,6 +195,15 @@ if test x$enable_no_canon_umount = xyes; then
AC_DEFINE(HAVE_NO_CANON_UMOUNT, 1, [define if the umount command supports the -c option])
fi
+ENABLE_FEDFS=""
+AC_ARG_ENABLE(fedfs,
+[ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4],,
+ enable_fedfs=no)
+if test x$enable_fedfs = xyes; then
+ ENABLE_FEDFS="1"
+fi
+AC_SUBST(ENABLE_FEDFS)
+
# LDAP SASL auth needs libxml and Kerberos
AF_CHECK_LIBXML()
AF_CHECK_KRB5()

121
archive-patches/autofs-5.1.4/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch

@ -1,121 +0,0 @@
autofs-5.1.4 - add error handling for ext_mount_add()
From: Ian Kent <raven@themaw.net>
Add error handling (memory allocation failures) for ext_mount_add().
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/mounts.c | 5 +----
modules/parse_amd.c | 42 ++++++++++++++++++++++++++++++------------
3 files changed, 32 insertions(+), 16 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index d0cfa19b..9d19c0a7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -7,6 +7,7 @@ xx/xx/2018 autofs-5.1.5
- fix prefix option handling in expand_entry().
- fix sublink option not set from defaults.
- fix error return in do_nfs_mount().
+- add error handling for ext_mount_add().
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/lib/mounts.c b/lib/mounts.c
index 6fa304aa..f46fab2b 100644
--- a/lib/mounts.c
+++ b/lib/mounts.c
@@ -715,15 +715,12 @@ int ext_mount_add(struct list_head *entry, const char *path, unsigned int umount
}
em = malloc(sizeof(struct ext_mount));
- if (!em) {
- ret = -1;
+ if (!em)
goto done;
- }
em->mountpoint = strdup(path);
if (!em->mountpoint) {
free(em);
- ret = -1;
goto done;
}
em->umount = umount;
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index 2a5d9a30..e7debc56 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -1080,7 +1080,14 @@ static int do_generic_mount(struct autofs_point *ap, const char *name,
umount = 1;
}
/* We have an external mount */
- ext_mount_add(&entry->ext_mount, entry->fs, umount);
+ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
+ umount_ent(ap, entry->fs);
+ error(ap->logopt, MODPREFIX
+ "error: could not add external mount %s",
+ entry->fs);
+ ret = 1;
+ goto out;
+ }
ret = do_link_mount(ap, name, entry, flags);
}
out:
@@ -1124,7 +1131,13 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name,
umount = 1;
}
/* We might be using an external mount */
- ext_mount_add(&entry->ext_mount, entry->fs, umount);
+ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
+ umount_ent(ap, entry->fs);
+ error(ap->logopt, MODPREFIX
+ "error: could not add external mount %s", entry->fs);
+ ret = 1;
+ goto out;
+ }
ret = do_link_mount(ap, name, entry, flags);
}
out:
@@ -1309,6 +1322,9 @@ static int do_program_mount(struct autofs_point *ap,
*/
if (ext_mount_inuse(entry->fs)) {
rv = 0;
+ /* An external mount with path entry->fs exists
+ * so ext_mount_add() won't fail.
+ */
ext_mount_add(&entry->ext_mount, entry->fs, 1);
} else {
rv = mkdir_path(entry->fs, mp_mode);
@@ -1325,17 +1341,19 @@ static int do_program_mount(struct autofs_point *ap,
rv = spawnv(ap->logopt, prog, (const char * const *) argv);
if (WIFEXITED(rv) && !WEXITSTATUS(rv)) {
- rv = 0;
- ext_mount_add(&entry->ext_mount, entry->fs, 1);
- debug(ap->logopt, MODPREFIX
- "%s: mounted %s", entry->type, entry->fs);
- } else {
- if (!ext_mount_inuse(entry->fs))
- rmdir_path(ap, entry->fs, ap->dev);
- error(ap->logopt, MODPREFIX
- "%s: failed to mount using: %s",
- entry->type, entry->mount);
+ if (ext_mount_add(&entry->ext_mount, entry->fs, 1)) {
+ rv = 0;
+ debug(ap->logopt, MODPREFIX
+ "%s: mounted %s", entry->type, entry->fs);
+ goto do_free;
+ }
+ umount_ent(ap, entry->fs);
}
+
+ if (!ext_mount_inuse(entry->fs))
+ rmdir_path(ap, entry->fs, ap->dev);
+ error(ap->logopt, MODPREFIX
+ "%s: failed to mount using %s", entry->type, entry->mount);
}
do_free:
free_argv(argc, (const char **) argv);

402
archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch

@ -1,402 +0,0 @@
autofs-5.1.4 - add fedfs-getsrvinfo.c
From: Ian Kent <raven@themaw.net>
Add the fedfs domain information discovery library functions.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
fedfs/fedfs-getsrvinfo.c | 311 ++++++++++++++++++++++++++++++++++++++++++++++
fedfs/fedfs-getsrvinfo.h | 52 ++++++++
3 files changed, 364 insertions(+)
create mode 100644 fedfs/fedfs-getsrvinfo.c
create mode 100644 fedfs/fedfs-getsrvinfo.h
diff --git a/CHANGELOG b/CHANGELOG
index dbfb8389..8d6c737c 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -14,6 +14,7 @@ xx/xx/2018 autofs-5.1.5
- Makefiles.rules: remove 'samples' from SUBDIRS.
- dont allow trailing slash in master map mount points.
- fix libresolv configure check.
+- add fedfs-getsrvinfo.c.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/fedfs/fedfs-getsrvinfo.c b/fedfs/fedfs-getsrvinfo.c
new file mode 100644
index 00000000..02ad16b5
--- /dev/null
+++ b/fedfs/fedfs-getsrvinfo.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <stdbool.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include <stdio.h>
+#include <errno.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <arpa/nameser.h>
+#include <arpa/nameser_compat.h>
+#include <resolv.h>
+
+#include "fedfs-getsrvinfo.h"
+
+/**
+ * Parsing overlay for DNS query result record header. Fields are
+ * in network byte order.
+ */
+struct rechdr {
+ uint16_t type;
+ uint16_t class;
+ uint32_t ttl;
+ uint16_t length;
+} __attribute__((__packed__));
+
+/**
+ * Parsing overlay for DNS query result SRV record data. Fields
+ * are in network byte order.
+ */
+struct srv {
+ uint16_t priority;
+ uint16_t weight;
+ uint16_t port;
+ unsigned char *target;
+} __attribute__((__packed__));
+
+/**
+ * Return C string matching error value of "status"
+ *
+ * @param status error status returned by getsrvinfo
+ * @return pointer to static NUL-terminated C string containing error message
+ */
+const char *
+gsi_strerror(int status)
+{
+ static char buf[256];
+
+ switch (status) {
+ case ESI_SUCCESS:
+ return "Success";
+ case ESI_NONAME:
+ return "Name not found";
+ case ESI_AGAIN:
+ return "Temporary failure in name resolution";
+ case ESI_FAIL:
+ return "Non-recoverable failure in name resolution";
+ case ESI_NODATA:
+ return "No SRV record returned";
+ case ESI_SERVICE:
+ return "Service is not available";
+ case ESI_MEMORY:
+ return "Memory allocation failure";
+ case ESI_SYSTEM:
+ snprintf(buf, sizeof(buf), "System error (%d): %s",
+ status, strerror(errno));
+ return buf;
+ case ESI_PARSE:
+ return "Failed to parse server response";
+ }
+
+ snprintf(buf, sizeof(buf), "Unknown error (%d)", status);
+ return buf;
+}
+
+/**
+ * Release a list of SRV records allocated by getsrvinfo()
+ *
+ * @param si pointer to first element of a list of struct srvinfo
+ *
+ */
+void freesrvinfo(struct srvinfo *si)
+{
+ struct srvinfo *tmp;
+
+ while (si != NULL) {
+ tmp = si;
+ si = si->si_next;
+ free(tmp->si_target);
+ free(tmp);
+ }
+}
+
+/**
+ * Ordering predicate for srvinfo lists
+ *
+ * @param a a srvinfo list element to compare
+ * @param b another srvinfo list element to compare
+ * @return true if "b" should fall later in the list than "a"
+ *
+ * See RFC 2782. The list is ordered as follows:
+ *
+ * o Lowest priority first.
+ * o In each priority class, highest weight first.
+ */
+static _Bool
+srvinfo_is_after(const struct srvinfo *a, const struct srvinfo *b)
+{
+ if (a->si_priority > b->si_priority)
+ return true;
+ if (a->si_priority < b->si_priority)
+ return false;
+
+ if (a->si_weight < b->si_weight)
+ return true;
+ return false;
+}
+
+/**
+ * Insert a srvinfo element into a list
+ *
+ * @param head pointer to head of list of elements
+ * @param entry new list element to insert
+ *
+ */
+static void
+insert_srvinfo(struct srvinfo **head, struct srvinfo *entry)
+{
+ entry->si_next = *head;
+ *head = entry;
+}
+
+/**
+ * Insert a srvinfo element into a list, in order
+ *
+ * @param head pointer to head of list of elements
+ * @param entry new list element to insert
+ *
+ */
+static void
+insert_srvinfo_sorted(struct srvinfo **head, struct srvinfo *entry)
+{
+ struct srvinfo *spot, *back;
+
+ spot = *head;
+ back = NULL;
+ while (spot && srvinfo_is_after(spot, entry)) {
+ back = spot;
+ spot = spot->si_next;
+ }
+
+ if (spot == (*head))
+ insert_srvinfo(head, entry);
+ else {
+ insert_srvinfo(&spot, entry);
+ /* off the end of the list? */
+ if (spot == entry)
+ back->si_next = entry;
+ }
+}
+
+/**
+ * Retrieve list of SRV records from DNS service
+ *
+ * @param srvname NUL-terminated C string containing record type to look up
+ * @param domainname NUL-terminated C string containing domain name to look up
+ * @param si OUT: list of SRV record information retrieved
+ * @return zero on success, or an ESI_ status code describing the error
+ *
+ * Caller must free list of records using freesrvinfo().
+ */
+int
+getsrvinfo(const char *srvname, const char *domainname, struct srvinfo **si)
+{
+ unsigned char *msg, *eom, *comp_dn;
+ struct srvinfo *results;
+ unsigned short count, i;
+ int status, len;
+ char *exp_dn;
+ HEADER *hdr;
+
+ msg = calloc(1, NS_MAXMSG);
+ exp_dn = calloc(1, NS_MAXDNAME);
+ if (msg == NULL || exp_dn == NULL) {
+ status = ESI_MEMORY;
+ goto out;
+ }
+
+ _res.options |= RES_AAONLY;
+ len = res_querydomain(srvname, domainname, C_IN, T_SRV, msg, NS_MAXMSG);
+ if (len == -1) {
+ switch (h_errno) {
+ case HOST_NOT_FOUND:
+ status = ESI_NONAME;
+ break;
+ case TRY_AGAIN:
+ status = ESI_AGAIN;
+ break;
+ case NO_RECOVERY:
+ status = ESI_FAIL;
+ break;
+ case NO_DATA:
+ status = ESI_NODATA;
+ break;
+ default:
+ fprintf(stderr, "SRV query failed for %s.%s: %s\n",
+ srvname, domainname, hstrerror(h_errno));
+ status = ESI_FAIL;
+ }
+ goto out;
+ }
+
+ hdr = (HEADER *)msg;
+ count = ntohs(hdr->ancount);
+ if (count == 0) {
+ status = ESI_NODATA;
+ goto out;
+ }
+ eom = msg + len;
+
+ comp_dn = &msg[HFIXEDSZ];
+ comp_dn += dn_skipname(comp_dn, eom) + QFIXEDSZ;
+
+ results = NULL;
+ for (i = 0; i < count; i++) {
+ struct srvinfo *new;
+ struct srv *record;
+ int l;
+
+ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME);
+ if (l == -1) {
+ status = ESI_PARSE;
+ goto out_free;
+ }
+ comp_dn += l;
+
+ record = (struct srv *)&comp_dn[10];
+ comp_dn += 16;
+
+ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME);
+ if (l == -1) {
+ status = ESI_PARSE;
+ goto out_free;
+ }
+ comp_dn += l;
+
+ if (count == 1 && strcmp(exp_dn, ".") == 0) {
+ status = ESI_SERVICE;
+ goto out_free;
+ }
+
+ new = calloc(1, sizeof(*new));
+ if (new == NULL) {
+ status = ESI_MEMORY;
+ goto out;
+ }
+
+ new->si_target = strdup(exp_dn);
+ if (new->si_target == NULL) {
+ free(new);
+ status = ESI_MEMORY;
+ goto out;
+ }
+ new->si_priority = ntohs(record->priority);
+ new->si_weight = ntohs(record->weight);
+ new->si_port = ntohs(record->port);
+
+ insert_srvinfo_sorted(&results, new);
+ }
+
+ status = ESI_SUCCESS;
+ *si = results;
+
+out:
+ free(exp_dn);
+ free(msg);
+ return status;
+
+out_free:
+ freesrvinfo(results);
+ goto out;
+}
diff --git a/fedfs/fedfs-getsrvinfo.h b/fedfs/fedfs-getsrvinfo.h
new file mode 100644
index 00000000..13170359
--- /dev/null
+++ b/fedfs/fedfs-getsrvinfo.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifndef _FEDFS_GETSRVINFO_H_
+#define _FEDFS_GETSRVINFO_H_
+
+/**
+ * Single list element containing SRV record data
+ */
+struct srvinfo {
+ struct srvinfo *si_next;
+ char *si_target;
+ unsigned short si_priority;
+ unsigned short si_weight;
+ unsigned short si_port;
+};
+
+enum {
+ ESI_SUCCESS = 0,
+ ESI_NONAME = -2,
+ ESI_AGAIN = -3,
+ ESI_FAIL = -4,
+ ESI_NODATA = -5,
+ ESI_SERVICE = -8,
+ ESI_MEMORY = -10,
+ ESI_SYSTEM = -11,
+ ESI_PARSE = -1000,
+};
+
+int getsrvinfo(const char *srvname, const char *domainname,
+ struct srvinfo **si);
+void freesrvinfo(struct srvinfo *si);
+const char *gsi_strerror(int status);
+
+#endif /* !_FEDFS_GETSRVINFO_H_ */

342
archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-map-nfs4_c.patch

@ -1,342 +0,0 @@
autofs-5.1.4 - add fedfs-map-nfs4.c
From: Ian Kent <raven@themaw.net>
Add build (and install) of the fedfs program map, fedfs-map-nfs4.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
autofs.spec | 1
fedfs/Makefile | 12 ++-
fedfs/fedfs-map-nfs4.c | 204 ++++++++++++++++++++++++++++++++++++++++++++++++
fedfs/fedfs-token.h | 40 +++++++++
5 files changed, 256 insertions(+), 2 deletions(-)
create mode 100644 fedfs/fedfs-map-nfs4.c
create mode 100644 fedfs/fedfs-token.h
diff --git a/CHANGELOG b/CHANGELOG
index 88992147..412e3382 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -16,6 +16,7 @@ xx/xx/2018 autofs-5.1.5
- fix libresolv configure check.
- add fedfs-getsrvinfo.c.
- add mount.fedfs.c.
+- add fedfs-map-nfs4.c.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/autofs.spec b/autofs.spec
index 2cc0e38f..157c09b4 100644
--- a/autofs.spec
+++ b/autofs.spec
@@ -192,6 +192,7 @@ fi
%config(noreplace) /etc/autofs_ldap_auth.conf
%{_sbindir}/automount
%{_sbindir}/mount.fedfs
+%{_sbindir}/fedfs-map-nfs4
%dir %{_libdir}/autofs
%{_libdir}/autofs/*
%{_mandir}/*/*
diff --git a/fedfs/Makefile b/fedfs/Makefile
index cb325bed..dff749e4 100644
--- a/fedfs/Makefile
+++ b/fedfs/Makefile
@@ -6,11 +6,13 @@
include ../Makefile.rules
SRCS = mount.fedfs.c
-HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h
+HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h \
+ fedfs-token.h
fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o
mount_fedfs_OBJ = mount.fedfs.o
+fedfs-map-nfs4_OBJ = fedfs-map-nfs4.o
version := $(shell cat ../.version)
@@ -18,18 +20,24 @@ CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include
CFLAGS += -DVERSION_STRING=\"$(version)\"
LDFLAGS += -rdynamic
-all: mount.fedfs
+all: mount.fedfs fedfs-map-nfs4
mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
$(CC) -o mount.fedfs \
$(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \
$(LDFLAGS) $(LIBRESOLV) $(LIBS)
+fedfs-map-nfs4: $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
+ $(CC) -o fedfs-map-nfs4 \
+ $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) \
+ $(LDFLAGS) $(LIBRESOLV) $(LIBS)
+
clean:
rm -f *.o *.s *~ mount.fedfs
install: all
install -d -m 755 $(INSTALLROOT)$(sbindir)
+ install -c fedfs-map-nfs4 -m 755 $(INSTALLROOT)$(sbindir); \
if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \
then \
install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \
diff --git a/fedfs/fedfs-map-nfs4.c b/fedfs/fedfs-map-nfs4.c
new file mode 100644
index 00000000..9f831cd7
--- /dev/null
+++ b/fedfs/fedfs-map-nfs4.c
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+
+#include <stdbool.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <libgen.h>
+#include <errno.h>
+#include <getopt.h>
+#include <locale.h>
+#include <netdb.h>
+#include <langinfo.h>
+
+#include "fedfs-nls.h"
+#include "fedfs-token.h"
+#include "fedfs-getsrvinfo.h"
+#include "fedfs-gpl-boiler.h"
+
+/**
+ * Name of SRV record containing NFSv4 FedFS root
+ */
+#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp"
+
+/**
+ * Export pathname of NFSv4 FedFS root
+ */
+#define FEDFS_NFS_EXPORTPATH "/.domainroot"
+
+static char *progname;
+
+/**
+ * Display usage message
+ */
+static void
+fedfs_map_usage(void)
+{
+ printf(_("\nUsage: %s [domain]\n\n"), progname);
+
+ printf("%s", fedfs_gpl_boilerplate);
+}
+
+/**
+ * Construct an NFSv4 map entry for "domainname" with one server
+ *
+ * @param si single-entry list of SRV records
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
+ * @return command exit status
+ */
+static int fedfs_map_nfs4_oneserver(struct srvinfo *si, const char *domainname)
+{
+ printf("-fstype=nfs,vers=4,fg");
+ if (si->si_port != 2049)
+ printf(",port=%u", si->si_port);
+ printf(" %s:%s/%s\n", si->si_target, FEDFS_NFS_EXPORTPATH, domainname);
+ return 0;
+}
+
+/**
+ * Construct an NFSv4 map entry for "domainname" with multiple servers
+ *
+ * @param si list of SRV records for requested FedFS domain
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
+ * @return command exit status
+ */
+static int fedfs_map_nfs4_replicas(struct srvinfo *si, const char *domainname)
+{
+ struct srvinfo *cur;
+ unsigned short port;
+ _Bool comma;
+
+ /*
+ * Unfortunately our automounter can't handle a list of
+ * replicas where the various servers live on different
+ * ports from one another.
+ */
+ port = si->si_port;
+ for (cur = si; cur != NULL; cur = cur->si_next)
+ if (cur->si_port != port) {
+ fprintf(stderr, _("%s: Replicas on different ports not supported\n"),
+ progname);
+ return 1;
+ }
+
+ if (port != 2049)
+ printf("-fstype=nfs,vers=4,fg,port=%u ", port);
+ else
+ printf("-fstype=nfs,vers=4,fg ");
+
+ /*
+ * Note that the export path is required to be indentical
+ * for all domain root servers for this domain.
+ */
+ for (comma = false, cur = si; cur != NULL; cur = cur->si_next) {
+ if (comma)
+ printf(",");
+ printf("%s(%u)", cur->si_target, cur->si_weight);
+ comma = true;
+ }
+ printf(":%s/%s\n", FEDFS_NFS_EXPORTPATH, domainname);
+
+ return 0;
+}
+
+/**
+ * Construct an NFSv4 map entry for "domainname"
+ *
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
+ * @return command exit status
+ */
+static int fedfs_map_nfs4(const char *domainname)
+{
+ struct srvinfo *cur, *si = NULL;
+ unsigned int count;
+ int error, result;
+
+ result = 1;
+ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si);
+ switch (error) {
+ case ESI_SUCCESS:
+ break;
+ case ESI_NONAME:
+ fprintf(stderr, _("%s: Domain name %s not found\n"),
+ progname, domainname);
+ goto out;
+ case ESI_SERVICE:
+ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"),
+ progname, domainname);
+ goto out;
+ default:
+ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"),
+ progname, domainname, gsi_strerror(error));
+ goto out;
+ }
+
+ for (count = 0, cur = si; cur != NULL; cur = cur->si_next)
+ count++;
+ if (count == 1)
+ result = fedfs_map_nfs4_oneserver(si, domainname);
+ else
+ result = fedfs_map_nfs4_replicas(si, domainname);
+
+out:
+ freesrvinfo(si);
+ return result;
+}
+
+/**
+ * Program entry point
+ *
+ * @param argc count of command line arguments
+ * @param argv array of NUL-terminated C strings containing command line arguments
+ * @return program exit status
+ */
+int main(int argc, char *argv[])
+{
+ (void)setlocale(LC_ALL, "");
+
+ progname = basename(argv[0]);
+
+ if (argc != 2) {
+ fedfs_map_usage();
+ return 1;
+ }
+
+ if (strcmp(progname, "fedfs-map-nfs4") == 0)
+ return fedfs_map_nfs4(argv[1]);
+#ifdef EXAMPLE
+ /* CIFS support might plug in here */
+ else if (strcmp(progname, "fedfs-map-cifs") == 0)
+ return fedfs_map_cifs(argv[1]);
+#endif
+
+ fprintf(stderr, _("%s: Unsupported file system type\n"), progname);
+ return 1;
+}
diff --git a/fedfs/fedfs-token.h b/fedfs/fedfs-token.h
new file mode 100644
index 00000000..5651409d
--- /dev/null
+++ b/fedfs/fedfs-token.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2007 Oracle. All rights reserved.
+ * Copyright (C) 2007 Chuck Lever <chuck.lever@oracle.com>
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifndef _FEDFS_UTILS_TOKEN_H
+#define _FEDFS_UTILS_TOKEN_H
+
+#include <sys/cdefs.h>
+
+/**
+ * Private tokenizer state object
+ */
+struct tokenizer;
+
+__attribute_malloc__
+struct tokenizer *tk_new_tokenizer(const char *string,
+ const char delimiter);
+__attribute_malloc__
+char *tk_next_token(struct tokenizer *state);
+void tk_free_tokenizer(struct tokenizer *state);
+int tk_tokenizer_error(const struct tokenizer *state);
+
+#endif /* !_FEDFS_UTILS_TOKEN_H */

44
archive-patches/autofs-5.1.4/autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch

@ -1,44 +0,0 @@
autofs-5.1.4 - add-man page note about extra slashes in paths
From: Ian Kent <raven@themaw.net>
Make note of the effect unnecessary multiple slashes can have in map
paths in auto.master(5).
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
man/auto.master.5.in | 8 ++++++++
2 files changed, 9 insertions(+)
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

191
archive-patches/autofs-5.1.4/autofs-5.1.4-add-master-map-pseudo-options-for-mount-propagation.patch

@ -1,191 +0,0 @@
autofs-5.1.4 - add master map pseudo options for mount propagation
From: Ian Kent <raven@themaw.net>
Add master map entry pseudo mount option of "slave" or "private" to
allow mount propagation of bind mounts to be set to either "slave" or
"private".
This option may be needed when using multi-mounts that have bind mounts
that bind to a file system that is propagation shared. This is becuase
the bind mount will have the same properties as its target which causes
problems for offset mounts. When this happens an unwanted offset mount
is propagated back to the target file system resulting in a deadlock
when attempting to access the offset.
By default bind mounts will inherit the mount propagation of the target
file system.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/automount.h | 4 ++++
lib/master_parse.y | 13 +++++++++++++
lib/master_tok.l | 2 ++
man/auto.master.5.in | 12 ++++++++++++
modules/mount_bind.c | 30 +++++++++++++++++++-----------
6 files changed, 51 insertions(+), 11 deletions(-)
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 <strtype> map
%type <strtype> options
@@ -196,6 +199,8 @@ line:
| PATH OPT_DEBUG { master_notify($1); YYABORT; }
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; }
| PATH OPT_SYMLINK { master_notify($1); YYABORT; }
+ | PATH OPT_SLAVE { master_notify($1); YYABORT; }
+ | PATH OPT_PRIVATE { master_notify($1); YYABORT; }
| PATH OPT_NOBIND { master_notify($1); YYABORT; }
| PATH OPT_GHOST { master_notify($1); YYABORT; }
| PATH OPT_NOGHOST { master_notify($1); YYABORT; }
@@ -600,6 +605,8 @@ option: daemon_option
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; }
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; }
| OPT_SYMLINK { symlnk = 1; }
+ | OPT_SLAVE { slave = 1; }
+ | OPT_PRIVATE { private = 1; }
| OPT_NOBIND { nobind = 1; }
| OPT_NOGHOST { ghost = 0; }
| OPT_GHOST { ghost = 1; }
@@ -672,6 +679,8 @@ static void local_init_vars(void)
timeout = -1;
negative_timeout = 0;
symlnk = 0;
+ slave = 0;
+ private = 0;
nobind = 0;
ghost = defaults_get_browse_mode();
random_selection = global_selection_options & MOUNT_FLAG_RANDOM_SELECT;
@@ -878,6 +887,10 @@ int master_parse_entry(const char *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 {

696
archive-patches/autofs-5.1.4/autofs-5.1.4-add-mount_fedfs_c.patch

@ -1,696 +0,0 @@
autofs-5.1.4 - add mount.fedfs.c
From: Ian Kent <raven@themaw.net>
Add build and install of the mount.fedfs binary.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1
Makefile | 3
Makefile.rules | 2
autofs.spec | 1
fedfs/Makefile | 36 +++
fedfs/fedfs-gpl-boiler.h | 40 ++++
fedfs/fedfs-nls.h | 38 ++++
fedfs/mount.fedfs.c | 485 ++++++++++++++++++++++++++++++++++++++++++++++
8 files changed, 605 insertions(+), 1 deletion(-)
create mode 100644 fedfs/Makefile
create mode 100644 fedfs/fedfs-gpl-boiler.h
create mode 100644 fedfs/fedfs-nls.h
create mode 100644 fedfs/mount.fedfs.c
diff --git a/CHANGELOG b/CHANGELOG
index 8d6c737c..88992147 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -15,6 +15,7 @@ xx/xx/2018 autofs-5.1.5
- dont allow trailing slash in master map mount points.
- fix libresolv configure check.
- add fedfs-getsrvinfo.c.
+- add mount.fedfs.c.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/Makefile b/Makefile
index e560a7cb..99db2c75 100644
--- a/Makefile
+++ b/Makefile
@@ -19,6 +19,9 @@ kernel:
samples:
set -e; if [ -d samples ]; then $(MAKE) -C samples all; fi
+fedfs:
+ set -e; if [ -d fedfs ]; then $(MAKE) -C fedfs all; fi
+
clean:
for i in $(SUBDIRS) samples; do \
if [ -d $$i ]; then $(MAKE) -C $$i clean; fi; done
diff --git a/Makefile.rules b/Makefile.rules
index 4deab3b9..fc9f6019 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -3,7 +3,7 @@
#
# Root directory contents
-SUBDIRS = lib daemon modules man
+SUBDIRS = lib daemon fedfs modules man
INCDIRS = include
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \
diff --git a/autofs.spec b/autofs.spec
index 2464e741..2cc0e38f 100644
--- a/autofs.spec
+++ b/autofs.spec
@@ -191,6 +191,7 @@ fi
%config(noreplace) /etc/sysconfig/autofs
%config(noreplace) /etc/autofs_ldap_auth.conf
%{_sbindir}/automount
+%{_sbindir}/mount.fedfs
%dir %{_libdir}/autofs
%{_libdir}/autofs/*
%{_mandir}/*/*
diff --git a/fedfs/Makefile b/fedfs/Makefile
new file mode 100644
index 00000000..cb325bed
--- /dev/null
+++ b/fedfs/Makefile
@@ -0,0 +1,36 @@
+#
+# Makefile for mount.fedfs
+#
+
+-include ../Makefile.conf
+include ../Makefile.rules
+
+SRCS = mount.fedfs.c
+HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h
+
+fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o
+
+mount_fedfs_OBJ = mount.fedfs.o
+
+version := $(shell cat ../.version)
+
+CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include
+CFLAGS += -DVERSION_STRING=\"$(version)\"
+LDFLAGS += -rdynamic
+
+all: mount.fedfs
+
+mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
+ $(CC) -o mount.fedfs \
+ $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \
+ $(LDFLAGS) $(LIBRESOLV) $(LIBS)
+
+clean:
+ rm -f *.o *.s *~ mount.fedfs
+
+install: all
+ install -d -m 755 $(INSTALLROOT)$(sbindir)
+ if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \
+ then \
+ install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \
+ fi
diff --git a/fedfs/fedfs-gpl-boiler.h b/fedfs/fedfs-gpl-boiler.h
new file mode 100644
index 00000000..1353e736
--- /dev/null
+++ b/fedfs/fedfs-gpl-boiler.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#ifndef _GPL_BOILER_H_
+#define _GPL_BOILER_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/**
+ * GPLv2 boilerplate for usage messages
+ */
+static const char *fedfs_gpl_boilerplate =
+ "\nCopyright 2010, 2011, 2012, 2013 Oracle. "
+ "All rights reserved.\n\n"
+ "License GPLv2: "
+ "<http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>\n"
+ "This is free software. "
+ "You are free to change and redistribute it.\n"
+ "There is NO WARRANTY, to the extent permitted by law.\n";
+
+#endif /* !_GPL_BOILER_H_ */
diff --git a/fedfs/fedfs-nls.h b/fedfs/fedfs-nls.h
new file mode 100644
index 00000000..92f968d3
--- /dev/null
+++ b/fedfs/fedfs-nls.h
@@ -0,0 +1,38 @@
+/*
+ * From util-linux/include/nls.h (GPLv2)
+ */
+
+#ifndef UTIL_LINUX_NLS_H
+#define UTIL_LINUX_NLS_H
+
+int main(int argc, char *argv[]);
+
+#ifndef LOCALEDIR
+#define LOCALEDIR "/usr/share/locale"
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#else
+# undef setlocale
+# define setlocale(Category, Locale) ({}) /* empty */
+#endif
+
+#ifdef ENABLE_NLS
+# include <libintl.h>
+# define _(Text) gettext (Text)
+# ifdef gettext_noop
+# define N_(String) gettext_noop (String)
+# else
+# define N_(String) (String)
+# endif
+#else
+# undef bindtextdomain
+# define bindtextdomain(Domain, Directory) /* empty */
+# undef textdomain
+# define textdomain(Domain) /* empty */
+# define _(Text) (Text)
+# define N_(Text) (Text)
+#endif
+
+#endif /* UTIL_LINUX_NLS_H */
diff --git a/fedfs/mount.fedfs.c b/fedfs/mount.fedfs.c
new file mode 100644
index 00000000..bd434395
--- /dev/null
+++ b/fedfs/mount.fedfs.c
@@ -0,0 +1,485 @@
+/*
+ * Copyright 2011 Oracle. All rights reserved.
+ *
+ * This file is part of fedfs-utils.
+ *
+ * fedfs-utils is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2.0 as
+ * published by the Free Software Foundation.
+ *
+ * fedfs-utils is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2.0 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2.0 along with fedfs-utils. If not, see:
+ *
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/mount.h>
+#include <sys/wait.h>
+
+#include <stdbool.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <libgen.h>
+#include <errno.h>
+#include <getopt.h>
+#include <locale.h>
+#include <netdb.h>
+#include <langinfo.h>
+
+#include "fedfs-nls.h"
+#include "fedfs-getsrvinfo.h"
+#include "fedfs-gpl-boiler.h"
+
+/**
+ * Top-level directory on client under which we mount NFSv4 domain roots
+ */
+#define FEDFS_NFS4_TLDIR "nfs4"
+
+/**
+ * Name of SRV record containing NFSv4 FedFS root
+ */
+#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp"
+
+/**
+ * Export path of NFSv4 FedFS root
+ */
+#define FEDFS_NFS_EXPORTPATH "/.domainroot"
+
+/**
+ * Pathname to mount.nfs
+ */
+#define MOUNT_NFS_EXECUTABLE "/sbin/mount.nfs"
+
+/**
+ * Mount status values, lifted from util-linux
+ */
+enum {
+ EX_SUCCESS = 0,
+ EX_USAGE = 1,
+ EX_FAIL = 32,
+};
+
+static char *progname;
+static int nomtab;
+static int verbose;
+static _Bool readonly;
+static _Bool sloppy;
+static _Bool fake;
+
+/**
+ * Short form command line options
+ */
+static const char fedfs_opts[] = "fhno:rsvVw";
+
+/**
+ * Long form command line options
+ */
+static const struct option fedfs_longopts[] =
+{
+ { "fake", 0, NULL, 'f' },
+ { "help", 0, NULL, 'h' },
+ { "no-mtab", 0, NULL, 'n' },
+ { "options", 1, NULL, 'o' },
+ { "read-only", 0, NULL, 'r' },
+ { "read-write", 0, NULL, 'w' },
+ { "ro", 0, NULL, 'r' },
+ { "rw", 0, NULL, 'w' },
+ { "sloppy", 0, NULL, 's' },
+ { "verbose", 0, NULL, 'v' },
+ { "version", 0, NULL, 'V' },
+ { NULL, 0, NULL, 0 }
+};
+
+/**
+ * Display mount.fedfs usage message
+ */
+static void
+mount_usage(void)
+{
+ printf(_("\nUsage: %s remotedir localdir [-fhnrsvVw]\n\n"), progname);
+ printf(_("options:\n"));
+ printf(_("\t-f\t\tFake mount, do not actually mount\n"));
+ printf(_("\t-h\t\tPrint this help\n"));
+ printf(_("\t-n\t\tDo not update /etc/mtab\n"));
+ printf(_("\t-r\t\tMount file system readonly\n"));
+ printf(_("\t-s\t\tTolerate sloppy mount options\n"));
+ printf(_("\t-v\t\tVerbose\n"));
+ printf(_("\t-V\t\tPrint version\n"));
+ printf(_("\t-w\t\tMount file system read-write\n"));
+
+ printf("%s", fedfs_gpl_boilerplate);
+}
+
+/**
+ * Concatenate three strings
+ *
+ * @param s NUL-terminated C string
+ * @param t NUL-terminated C string
+ * @param u NUL-terminated C string
+ * @return pointer to NUL-terminated C string or NULL
+ *
+ * Caller must free the returned string with free(3). Always frees
+ * its first arg - typical use: s = xstrconcat3(s,t,u);
+ *
+ * Lifted from util-linux.
+ */
+static char *
+xstrconcat3(char *s, const char *t, const char *u)
+{
+ _Bool free_s = true;
+ char *result;
+
+ if (s == NULL) {
+ s = "";
+ free_s = false;
+ }
+ if (t == NULL)
+ t = "";
+ if (u == NULL)
+ u = "";
+ result = malloc(strlen(s) + strlen(t) + strlen(u) + 1);
+ if (result == NULL)
+ goto out;
+
+ strcpy(result, s);
+ strcat(result, t);
+ strcat(result, u);
+
+out:
+ if (free_s)
+ free(s);
+ return result;
+}
+
+/**
+ * Exec mount.nfs
+ *
+ * @param server NUL-terminated C string containing name of NFS server
+ * @param port server port to use when mounting
+ * @param domainname NUL-terminated C string containing FedFS domain name
+ * @param export_path NUL-terminated C string containing server export path
+ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory
+ * @param text_options NUL-terminated C string containing user's mount options
+ *
+ */
+static void
+exec_mount_nfs4(const char *server, unsigned short port,
+ const char *domainname, const char *export_path,
+ const char *mounted_on_dir, const char *text_options)
+{
+ static char special[2048];
+ static char options[2048];
+ char *args[16];
+ int count = 0;
+
+ snprintf(special, sizeof(special), "%s:%s/%s%s", server,
+ FEDFS_NFS_EXPORTPATH, domainname, export_path);
+
+ if (text_options != NULL && strcmp(text_options, "") != 0)
+ snprintf(options, sizeof(options), "%s,vers=4,fg,port=%u",
+ text_options, port);
+ else
+ snprintf(options, sizeof(options), "vers=4,fg,port=%u", port);
+
+ if (verbose) {
+ printf(_("%s: Special device: %s\n"),
+ progname, special);
+ printf(_("%s: Mounted-on directory: %s\n"),
+ progname, mounted_on_dir);
+ printf(_("%s: Mount options: %s\n"),
+ progname, options);
+ }
+
+ args[count++] = MOUNT_NFS_EXECUTABLE;
+ args[count++] = special;
+ args[count++] = (char *)mounted_on_dir;
+ if (verbose)
+ args[count++] = "-v";
+ if (fake)
+ args[count++] = "-f";
+ if (nomtab)
+ args[count++] = "-n";
+ if (readonly)
+ args[count++] = "-r";
+ if (sloppy)
+ args[count++] = "-s";
+ args[count++] = "-o";
+ args[count++] = options;
+
+ args[count] = NULL;
+ execv(args[0], args);
+}
+
+/**
+ * Mount a FedFS domain root via NFSv4
+ *
+ * @param domainname NUL-terminated C string containing FedFS domain name
+ * @param export_path NUL-terminated C string containing server export path
+ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory
+ * @param text_options NUL-terminated C string containing user's mount options
+ * @return exit status code from the mount.nfs command
+ *
+ * Construct the server:/export string and the mounted-on directory string
+ * based on the DNS SRV query results, then fork and exec mount.nfs to do
+ * the actual mount request.
+ */
+static int
+nfs4_mount(const char *domainname, const char *export_path,
+ const char *mounted_on_dir, const char *text_options)
+{
+ struct srvinfo *tmp, *si = NULL;
+ int error, status;
+
+ status = EX_FAIL;
+
+ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si);
+ switch (error) {
+ case ESI_SUCCESS:
+ break;
+ case ESI_NONAME:
+ fprintf(stderr, _("%s: Domain name %s not found\n"),
+ progname, domainname);
+ goto out;
+ case ESI_SERVICE:
+ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"),
+ progname, domainname);
+ goto out;
+ default:
+ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"),
+ progname, domainname, gsi_strerror(error));
+ goto out;
+ }
+
+ /*
+ * The srvinfo list is already in RFC 2782 sorted order. Try each
+ * SRV record once, in the foreground. Go with the first one that
+ * works.
+ */
+ for (tmp = si; tmp != NULL; tmp = tmp->si_next) {
+ pid_t pid;
+
+ pid = fork();
+ switch (pid) {
+ case 0:
+ exec_mount_nfs4(tmp->si_target, tmp->si_port,
+ domainname, export_path, mounted_on_dir,
+ text_options);
+ /*NOTREACHED*/
+ fprintf(stderr, _("%s: Failed to exec: %s\n"),
+ progname, strerror(errno));
+ exit(EX_FAIL);
+ case -1:
+ fprintf(stderr, _("%s: Failed to fork: %s\n"),
+ progname, strerror(errno));
+ goto out;
+ default:
+ waitpid(pid, &status, 0);
+ if (status == EX_SUCCESS)
+ goto out;
+ }
+ }
+
+out:
+ freesrvinfo(si);
+ return status;
+}
+
+/**
+ * Try one mount request
+ *
+ * @param source NUL-terminated C string containing name of "special device"
+ * @param target NUL-terminated C string containing local mounted-on directory
+ * @param text_options NUL-terminated C string containing user's mount options
+ * @return an exit status code
+ *
+ * Parse the pathname in "source." It contains the file system protocol
+ * and FedFS domain name. Then pass these arguments to the appropriate
+ * mount helper subcommand.
+ */
+static int
+try_mount(const char *source, const char *target, const char *text_options)
+{
+ char *global_name, *topdir, *domainname, *remaining;
+ int result;
+
+ remaining = NULL;
+ result = EX_FAIL;
+
+ global_name = strdup(source);
+ if (global_name == NULL) {
+ fprintf(stderr, _("%s: Unable to parse globally useful name\n"),
+ progname);
+ goto out;
+ }
+
+ topdir = strtok(global_name, "/");
+ if (topdir == NULL) {
+ fprintf(stderr, _("%s: Invalid globally useful name: %s\n"),
+ progname, source);
+ goto out;
+ }
+ if (verbose)
+ printf(_("%s: Top-level directory: %s\n"),
+ progname, topdir);
+
+ domainname = strtok(NULL, "/");
+ if (domainname == NULL) {
+ fprintf(stderr, _("%s: Missing domain name in globally "
+ "useful name: %s\n"), progname, source);
+ goto out;
+ }
+ if (verbose)
+ printf(_("%s: Domain name: %s\n"),
+ progname, domainname);
+
+ remaining = strtok(NULL, "/");
+ if (remaining == NULL) {
+ remaining = strdup("/");
+ if (remaining == NULL) {
+ fprintf(stderr, _("%s: No memory\n"), progname);
+ goto out;
+ }
+ } else {
+ char *tmp;
+
+ tmp = malloc(strlen(remaining) + 1);
+ if (tmp == NULL) {
+ fprintf(stderr, _("%s: No memory\n"), progname);
+ remaining = NULL;
+ goto out;
+ }
+ strcpy(tmp, "/");
+ strcat(tmp, remaining);
+ remaining = tmp;
+ }
+ if (verbose)
+ printf(_("%s: Export path: %s\n"),
+ progname, remaining);
+
+ if (strcmp(topdir, FEDFS_NFS4_TLDIR) == 0)
+ result = nfs4_mount(domainname, remaining, target, text_options);
+#if 0
+ /* example: SMB support plugs in here */
+ else if (strcmp(topdir, FEDFS_SMB_TLDIR) == 0)
+ result = smb_mount(domainname, remaining, target, text_options);
+#endif
+ else
+ fprintf(stderr, _("%s: Unrecognized file system protocol\n"), progname);
+
+out:
+ free(global_name);
+ free(remaining);
+
+ return result;
+}
+
+/**
+ * Program entry point
+ *
+ * @param argc count of command line arguments
+ * @param argv array of NUL-terminated C strings containing command line arguments
+ * @return program exit status
+ */
+int main(int argc, char *argv[])
+{
+ char *source, *target, *text_options;
+ int c, mnt_err;
+
+ (void)setlocale(LC_ALL, "");
+
+ progname = basename(argv[0]);
+
+ if (argv[1] && argv[1][0] == '-') {
+ if(argv[1][1] == 'V')
+ printf("%s (VERSION_STRING)\n", progname);
+ else
+ mount_usage();
+ exit(EX_SUCCESS);
+ }
+
+ if (argc < 3) {
+ mount_usage();
+ exit(EX_USAGE);
+ }
+
+ source = argv[1];
+ target = argv[2];
+
+ mnt_err = EX_USAGE;
+ text_options = NULL;
+ readonly = false;
+ sloppy = false;
+ fake = false;
+ argv[2] = argv[0]; /* so that getopt error messages are correct */
+ while ((c = getopt_long(argc - 2, argv + 2, fedfs_opts,
+ fedfs_longopts, NULL)) != -1) {
+ switch (c) {
+ case 'f':
+ fake = true;
+ break;
+ case 'n':
+ ++nomtab;
+ break;
+ case 'o':
+ /* Ugh. */
+ if (text_options != NULL)
+ text_options = xstrconcat3(text_options, ",", optarg);
+ else
+ text_options = strdup(optarg);
+ if (text_options == NULL) {
+ fprintf(stderr, _("%s: No memory\n"), progname);
+ goto out;
+ }
+ break;
+ case 'r':
+ readonly = true;
+ break;
+ case 's':
+ sloppy = true;
+ break;
+ case 'v':
+ ++verbose;
+ break;
+ case 'V':
+ printf("%s: (VERSION_STRING)\n", progname);
+ mnt_err = EX_SUCCESS;
+ goto out;
+ case 'w':
+ readonly = false;
+ break;
+ case 'h':
+ default:
+ mount_usage();
+ goto out;
+ }
+ }
+
+ /* Extra non-option words at the end are bogus... */
+ if (optind != argc - 2) {
+ mount_usage();
+ goto out;
+ }
+
+ if (getuid() != 0 && geteuid() != 0) {
+ fprintf(stderr, _("%s: Not installed setuid - "
+ "\"user\" FedFS mounts are not supported\n"), progname);
+ mnt_err = EX_FAIL;
+ goto out;
+ }
+
+ mnt_err = try_mount(source, target, text_options);
+
+out:
+ free(text_options);
+ exit(mnt_err);
+}

147
archive-patches/autofs-5.1.4/autofs-5.1.4-add-systemd-service-command-line-option.patch

@ -1,147 +0,0 @@
autofs-5.1.4 - add systemd service command line option
From: Ian Kent <raven@themaw.net>
When run as a systemd service using the systemd notification method to
synchronise startup, logging should be done to syslog so the log entry
format is consistent between daemon and systemd usage.
So, rather than run use the forground option, add an option to tell
the automounter it's being run as a systemd service and use syslog
for logging when its present on the command line.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 22 +++++++++++++++++++---
include/automount.h | 1 +
man/automount.8 | 4 ++++
samples/autofs.service.in | 2 +-
5 files changed, 26 insertions(+), 4 deletions(-)
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

43
archive-patches/autofs-5.1.4/autofs-5.1.4-add-units-After-line-to-include-statd-service.patch

@ -1,43 +0,0 @@
autofs-5.1.4 - add units After line to include statd service
From: Ian Kent <raven@themaw.net>
autofs needs to ensure statd is started before any NFS mounts
are attempted. This is because if the first NFS mount starts
the service and the mount is an automounted directory that is
included in the PATH used by systemctl (eg. /usr/local/bin)
the mount cannot complete.
Add rpc-statd.service to the unit "After=" line to try and
ensure it is started before automount.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
samples/autofs.service.in | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
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]

138
archive-patches/autofs-5.1.4/autofs-5.1.4-better-handle-hesiod-support-not-built-in.patch

@ -1,138 +0,0 @@
autofs-5.1.4 - better handle hesiod support not built in
From: Ian Kent <raven@themaw.net>
The configure option --without-hesiod is not handled well.
If this option is given and hesiod is seen in the master
map parser or the amd map parser issue a message telling
the user hesiod support isn't built in.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master_parse.y | 18 ++++++++++++++++--
modules/amd_parse.y | 7 +++++++
modules/parse_amd.c | 28 +++++++++++++++++++++++++---
4 files changed, 49 insertions(+), 5 deletions(-)
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);
}

146
archive-patches/autofs-5.1.4/autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch

@ -1,146 +0,0 @@
autofs-5.1.4 - change expire type naming to better reflect usage
From: Ian Kent <raven@themaw.net>
Expires can request different types of expire, currently normal or
immediate (and later force).
Change the naming used in the expire functions to better indicate
usage.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 8 ++++----
daemon/indirect.c | 8 ++++----
daemon/state.c | 4 ++--
include/state.h | 2 +-
5 files changed, 12 insertions(+), 11 deletions(-)
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 */
};

434
archive-patches/autofs-5.1.4/autofs-5.1.4-covarity-fixes-1.patch

@ -1,434 +0,0 @@
autofs-5.1.4 - covarity fixes 1
From: Ian Kent <raven@themaw.net>
* remove conditional close of nullfd.
* fix memory leak of local_domain in lib/macros.c:macro_init().
* check for NULL prior to several assignments in lib/master_parse.y.
* fix memory leak in lib/mounts.c:add_std_amd_vars().
* add missing break in lib/rpc_subs.c:rpc_get_netid().
* fix variable scope problem in modules/amd_parse.c:make_selector().
* fix selector itself not freed in lib/parse_subs.c:free_selector().
* fix possible memory leak in modules/lookup_ldap.c:parse_ldap_config().
* fix possible memory leak in modules/lookup_ldap.c:decode_percent_hack().
* fix usage of decode_percent_hack() in modules/lookup_ldap.c.
* initialize enc_key1 and enc_key2 in modules/lookup_ldap.c:lookup_one().
* fix double alloc of map_type in modules/parse_amd.c:make_default_entry().
* fix double alloc of map_type in modules/parse_amd.c:get_defaults_entry().
* fix possible memory leak in modules/parse_sun.c:parse_reinit().
* initialize myoptions and ro_loc in modules/parse_sun.c:mount_subtree().
* initialize myoptions and loc in modules/parse_sun.c:parse_mount().
Signed-off-by: Ian Kent <raven@themaw.net>
---
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);

48
archive-patches/autofs-5.1.4/autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch

@ -1,48 +0,0 @@
autofs-5.1.4 - dont allow trailing slash in master map mount points
From: Ian Kent <raven@themaw.net>
If a master map mount point path has a trailing '/' this can cause
problems so remove them at parse time.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master_parse.y | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 1e5ec15b..a7bb89dc 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -12,6 +12,7 @@ xx/xx/2018 autofs-5.1.5
- use_hostname_for_mounts shouldn't prevent selection among replicas.
- fix monotonic_elapsed.
- Makefiles.rules: remove 'samples' from SUBDIRS.
+- dont allow trailing slash in master map mount points.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/lib/master_parse.y b/lib/master_parse.y
index 42e03c2d..761ade9b 100644
--- a/lib/master_parse.y
+++ b/lib/master_parse.y
@@ -749,6 +749,7 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
struct map_source *source;
unsigned int logopt = logging;
unsigned int m_logopt = master->logopt;
+ size_t mp_len;
int ret;
local_init_vars();
@@ -763,6 +764,10 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
return 0;
}
+ mp_len = strlen(path);
+ while (mp_len && path[--mp_len] == '/')
+ path[mp_len] = 0;
+
nc = master->nc;
/* Add null map entries to the null map cache */

56
archive-patches/autofs-5.1.4/autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch

@ -1,56 +0,0 @@
autofs-5.1.4 - dont use array for path when not necessary
From: Ian Kent <raven@themaw.net>
In parse_amd.c:do_link_mount() a character array is used to construct
a path when a pointer to the relevant amd entry field is sufficient.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/parse_amd.c | 6 +++---
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 0f30596f..13f01397 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,7 @@ xx/xx/2018 autofs-5.1.5
- fix directory create permission.
- fix use after free in do_master_list_reset().
- fix deadlock in dumpmaps.
+- dont use array for path when not necessary.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index c4b3ef0b..2cce5417 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -967,8 +967,8 @@ static int do_auto_mount(struct autofs_point *ap, const char *name,
static int do_link_mount(struct autofs_point *ap, const char *name,
struct amd_entry *entry, unsigned int flags)
{
- char target[PATH_MAX + 1];
const char *opts = (entry->opts && *entry->opts) ? entry->opts : NULL;
+ char *target;
int ret;
if (entry->sublink) {
@@ -977,14 +977,14 @@ static int do_link_mount(struct autofs_point *ap, const char *name,
"error: sublink option length is too long");
return 0;
}
- strcpy(target, entry->sublink);
+ target = entry->sublink;
} else {
if (strlen(entry->fs) > PATH_MAX) {
error(ap->logopt, MODPREFIX
"error: fs option length is too long");
return 0;
}
- strcpy(target, entry->fs);
+ target = entry->fs;
}
if (!(flags & CONF_AUTOFS_USE_LOFS))

49
archive-patches/autofs-5.1.4/autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch

@ -1,49 +0,0 @@
autofs-5.1.4 - enable SIGUSR2 handling in rpm spec file
From: Ian Kent <raven@themaw.net>
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 <raven@themaw.net>
---
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:}

75
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-NFS-version-mask-usage.patch

@ -1,75 +0,0 @@
autofs-5.1.4 - fix NFS version mask usage
From: Ian Kent <raven@themaw.net>
Upstream commit a8af65195 changed NFS_VERS_MASK to exclude NFSv2
so NFSv2 would be excluded in the default availability probe.
But NFS_VERS_MASK is used like a mask elsewhere and causes NFSv2
to be cleared for the availability probe even when it is requested.
So add a macro to NFS_VERS_DEFAULT (and accompanying macros) to be
used to set initial defaults and restore NFS_VERS_MASK to what it
should be when used as a mask.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/replicated.h | 5 ++++-
modules/mount_nfs.c | 6 +++---
3 files changed, 8 insertions(+), 4 deletions(-)
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.

46
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-age-setting-at-startup.patch

@ -1,46 +0,0 @@
autofs-5.1.4 - fix age setting at startup
From: Ian Kent <raven@themaw.net>
Commit 2b567ace7d, which resets the master map list on startup
before retrying a read, incorrectly sets age using time() when
it should use monotonic_time().
This causes lookup failures for submounts in cases where a master
map read retry was needed.
The failure happens because the mount entry age is greater than
the map entry age which is meant to indicate the map is no longer
valid which is not the case.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
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);
}
}

72
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-amd-parser-opts-option-handling.patch

@ -1,72 +0,0 @@
autofs-5.1.4 - fix amd parser opts option handling
From: Ian Kent <raven@themaw.net>
The recent implementation of the amd map program mount feature
introduced a regression in the amd parser where only the first
option of a comma separated list of is applied to a mount entry.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/amd_parse.y | 4 ++--
modules/parse_amd.c | 4 +++-
3 files changed, 6 insertions(+), 3 deletions(-)
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);

40
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch

@ -1,40 +0,0 @@
autofs-5.1.4 - fix deadlock in dumpmaps
From: Ian Kent <raven@themaw.net>
Commit a223d11fa8e (autofs-5.1.3 - serialize calls to open_xxxx()
functions) introduces a deadlock when using the dumpmaps function.
In this case the open fd mutex needs to be unlocked in the forked
child process of the do_spawn() function.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/spawn.c | 1 +
2 files changed, 2 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 2747327b..0f30596f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,7 @@ xx/xx/2018 autofs-5.1.5
- fix flag file permission.
- fix directory create permission.
- fix use after free in do_master_list_reset().
+- fix deadlock in dumpmaps.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/daemon/spawn.c b/daemon/spawn.c
index fabe577e..dbbca7fa 100644
--- a/daemon/spawn.c
+++ b/daemon/spawn.c
@@ -338,6 +338,7 @@ static int do_spawn(unsigned logopt, unsigned int wait,
dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);
close(pipefd[1]);
+ open_mutex_unlock();
/* what to mount must always be second last */
while (*pargv++)

207
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-directory-create-permission.patch

@ -1,207 +0,0 @@
autofs-5.1.4 - fix directory create permission
From: Ian Kent <raven@themaw.net>
autofs mount point directory creation is done using a permission of
0555.
But it is necessary to create directories within autofs mount points
for some map entry types so write access should be set for the owner
on mount point directories.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 2 ++
daemon/direct.c | 4 ++--
daemon/indirect.c | 2 +-
daemon/lookup.c | 2 +-
include/automount.h | 1 +
modules/mount_bind.c | 6 +++---
modules/mount_changer.c | 2 +-
modules/mount_ext2.c | 2 +-
modules/mount_generic.c | 2 +-
modules/mount_nfs.c | 2 +-
modules/parse_amd.c | 2 +-
12 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index d07d88ce..4faab510 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
xx/xx/2018 autofs-5.1.5
- fix flag file permission.
+- fix directory create permission.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/daemon/automount.c b/daemon/automount.c
index 5c739617..dcdc19fb 100644
--- a/daemon/automount.c
+++ b/daemon/automount.c
@@ -51,6 +51,8 @@ const char *libdir = AUTOFS_LIB_DIR; /* Location of library modules */
const char *mapdir = AUTOFS_MAP_DIR; /* Location of mount maps */
const char *confdir = AUTOFS_CONF_DIR; /* Location of autofs config file */
+unsigned int mp_mode = 0755;
+
unsigned int nfs_mount_uses_string_options = 0;
static struct nfs_mount_vers vers, check = {1, 1, 1};
diff --git a/daemon/direct.c b/daemon/direct.c
index 9a134351..3fdecdb8 100644
--- a/daemon/direct.c
+++ b/daemon/direct.c
@@ -424,7 +424,7 @@ int do_mount_autofs_direct(struct autofs_point *ap,
}
/* In case the directory doesn't exist, try to mkdir it */
- if (mkdir_path(me->key, 0555) < 0) {
+ if (mkdir_path(me->key, mp_mode) < 0) {
if (errno != EEXIST && errno != EROFS) {
crit(ap->logopt,
"failed to create mount directory %s", me->key);
@@ -739,7 +739,7 @@ int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, const char *
strcat(mountpoint, offset);
/* In case the directory doesn't exist, try to mkdir it */
- if (mkdir_path(mountpoint, 0555) < 0) {
+ if (mkdir_path(mountpoint, mp_mode) < 0) {
if (errno == EEXIST) {
/*
* If the mount point directory is a real mount
diff --git a/daemon/indirect.c b/daemon/indirect.c
index ffb11b8c..03c081ed 100644
--- a/daemon/indirect.c
+++ b/daemon/indirect.c
@@ -133,7 +133,7 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
}
/* In case the directory doesn't exist, try to mkdir it */
- if (mkdir_path(root, 0555) < 0) {
+ if (mkdir_path(root, mp_mode) < 0) {
if (errno != EEXIST && errno != EROFS) {
crit(ap->logopt,
"failed to create autofs directory %s",
diff --git a/daemon/lookup.c b/daemon/lookup.c
index cb67e7d9..6a722b3b 100644
--- a/daemon/lookup.c
+++ b/daemon/lookup.c
@@ -802,7 +802,7 @@ int lookup_ghost(struct autofs_point *ap, const char *root)
goto next;
}
- ret = mkdir_path(fullpath, 0555);
+ ret = mkdir_path(fullpath, mp_mode);
if (ret < 0 && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
warn(ap->logopt,
diff --git a/include/automount.h b/include/automount.h
index 2e2c2b02..e5c19d23 100644
--- a/include/automount.h
+++ b/include/automount.h
@@ -269,6 +269,7 @@ void reset_signals(void);
int do_mount(struct autofs_point *ap, const char *root, const char *name,
int name_len, const char *what, const char *fstype,
const char *options);
+extern unsigned int mp_mode;
int mkdir_path(const char *path, mode_t mode);
int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev);
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
index 4864ea51..5effa880 100644
--- a/modules/mount_bind.c
+++ b/modules/mount_bind.c
@@ -151,7 +151,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
@@ -203,7 +203,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
} else {
debug(ap->logopt,
MODPREFIX "calling mkdir_path %s", basepath);
- if (mkdir_path(basepath, 0555) && errno != EEXIST) {
+ if (mkdir_path(basepath, mp_mode) && errno != EEXIST) {
char *estr;
estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
@@ -219,7 +219,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
"failed to create symlink %s -> %s",
fullpath, what);
if ((ap->flags & MOUNT_FLAG_GHOST) && !status) {
- if (mkdir_path(fullpath, 0555) && errno != EEXIST) {
+ if (mkdir_path(fullpath, mp_mode) && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
MODPREFIX "mkdir_path %s failed: %s",
diff --git a/modules/mount_changer.c b/modules/mount_changer.c
index 798f23b2..7d44a720 100644
--- a/modules/mount_changer.c
+++ b/modules/mount_changer.c
@@ -87,7 +87,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
diff --git a/modules/mount_ext2.c b/modules/mount_ext2.c
index 90fc0876..3bbea95a 100644
--- a/modules/mount_ext2.c
+++ b/modules/mount_ext2.c
@@ -69,7 +69,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
diff --git a/modules/mount_generic.c b/modules/mount_generic.c
index ae637875..b1a3adbf 100644
--- a/modules/mount_generic.c
+++ b/modules/mount_generic.c
@@ -68,7 +68,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
index bf712a93..77166544 100644
--- a/modules/mount_nfs.c
+++ b/modules/mount_nfs.c
@@ -277,7 +277,7 @@ dont_probe:
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath);
- status = mkdir_path(fullpath, 0555);
+ status = mkdir_path(fullpath, mp_mode);
if (status && errno != EEXIST) {
char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
error(ap->logopt,
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index b40c1ad1..c4b3ef0b 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -1288,7 +1288,7 @@ static int do_program_mount(struct autofs_point *ap,
rv = 0;
ext_mount_add(&entry->ext_mount, entry->fs, 1);
} else {
- rv = mkdir_path(entry->fs, 0555);
+ rv = mkdir_path(entry->fs, mp_mode);
if (rv && errno != EEXIST) {
char buf[MAX_ERR_BUF];
char *estr;

35
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch

@ -1,35 +0,0 @@
autofs-5.1.4 - fix error return in do_nfs_mount()
From: Ian Kent <raven@themaw.net>
Fix incorrect error return in modules/parse_amd.c:do_nfs_mount().
---
CHANGELOG | 1 +
modules/parse_amd.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index 756ef927..d0cfa19b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -6,6 +6,7 @@ xx/xx/2018 autofs-5.1.5
- dont use array for path when not necessary.
- fix prefix option handling in expand_entry().
- fix sublink option not set from defaults.
+- fix error return in do_nfs_mount().
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index 1c962fff..2a5d9a30 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -1099,7 +1099,7 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name,
if (strlen(entry->rhost) + strlen(entry->rfs) + 1 > PATH_MAX) {
error(ap->logopt, MODPREFIX
"error: rhost + rfs options length is too long");
- return 0;
+ return 1;
}
strcpy(target, entry->rhost);

50
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch

@ -1,50 +0,0 @@
autofs-5.1.4 - fix fd leak in rpc_do_create_client()
From: Ian Kent <raven@themaw.net>
Commit 94f87e203a (fix create_client() RPC client handling) fixed
possible use of an invalid RPC client handle but the change neglected
to account for a check in rpc_do_create_client() that would open a new
file descriptor without checking if the passed in descriptor was
already opened.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/rpc_subs.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
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;

41
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-flag-file-permission.patch

@ -1,41 +0,0 @@
autofs-5.1.4 - fix flag file permission
From: Ian Kent <raven@themaw.net>
The flag file used to check if automount(8) is running was being
created with mode 0 which caused unnecessary dac_override AVC
failures.
There's no reason to protect this file so just use 0644 as the
file permission.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 3 +++
daemon/flag.c | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index 246279ae..d07d88ce 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+xx/xx/2018 autofs-5.1.5
+- fix flag file permission.
+
19/12/2017 autofs-5.1.4
- fix spec file url.
- fix unset tsd group name handling.
diff --git a/daemon/flag.c b/daemon/flag.c
index 99f26847..ff9858c8 100644
--- a/daemon/flag.c
+++ b/daemon/flag.c
@@ -164,7 +164,7 @@ int aquire_flag_file(void)
while (!we_created_flagfile) {
int errsv, i, j;
- i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0);
+ i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0644);
if (i < 0) {
release_flag_file();
return 0;

44
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-incorrect-locking-in-sss-lookup.patch

@ -1,44 +0,0 @@
autofs-5.1.4 - fix incorrect locking in sss lookup
From: Ian Kent <raven@themaw.net>
Commit 766e0f6c4, autofs-5.0.7 - fix fix wildcard multi map regression,
introduced a deadlock during restart when the sss modules is used.
Looking at the comment above the code which takes the lock it clearly
does this incorrectly.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/lookup_sss.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
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) {

39
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-indent-in-automount-8-man-page.patch

@ -1,39 +0,0 @@
autofs-5.1.4 - fix indent in automount(8) man page
From: Ian Kent <raven@themaw.net>
The .P paragraph directive resets paragraph indentation but
the following sentence belongs to the comand line option
above.
Signed-off-by: Ian Kent <raven@themaw.net>
---
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

94
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-libresolv-configure-check.patch

@ -1,94 +0,0 @@
autofs-5.1.4 - fix libresolv configure check
From: Ian Kent <raven@themaw.net>
The libresolv functions are not found by AC_CHECK_LIB() unless
they are prefixed with "__".
So change the library check to also look for __<function> during
the check.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
configure | 41 +++++++++++++++++++++++++++++++++++++++++
configure.in | 2 +-
3 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG b/CHANGELOG
index a7bb89dc..dbfb8389 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -13,6 +13,7 @@ xx/xx/2018 autofs-5.1.5
- fix monotonic_elapsed.
- Makefiles.rules: remove 'samples' from SUBDIRS.
- dont allow trailing slash in master map mount points.
+- fix libresolv configure check.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/configure b/configure
index 2d517aac..5c8aae30 100755
--- a/configure
+++ b/configure
@@ -4821,6 +4821,47 @@ fi
$as_echo "$ac_cv_lib_resolv_res_query" >&6; }
if test "x$ac_cv_lib_resolv_res_query" = xyes; then :
LIBRESOLV="-lresolv"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __res_query in -lresolv" >&5
+$as_echo_n "checking for __res_query in -lresolv... " >&6; }
+if ${ac_cv_lib_resolv___res_query+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lresolv $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char __res_query ();
+int
+main ()
+{
+return __res_query ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_resolv___res_query=yes
+else
+ ac_cv_lib_resolv___res_query=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv___res_query" >&5
+$as_echo "$ac_cv_lib_resolv___res_query" >&6; }
+if test "x$ac_cv_lib_resolv___res_query" = xyes; then :
+ LIBRESOLV="-lresolv"
+fi
+
fi
diff --git a/configure.in b/configure.in
index d74775cc..4d1208f5 100644
--- a/configure.in
+++ b/configure.in
@@ -217,7 +217,7 @@ AC_SUBST(NSL_LIBS)
NSL_CFLAGS=""
])
-AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv")
+AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv", AC_CHECK_LIB(resolv, __res_query, LIBRESOLV="-lresolv"))
AC_SUBST(LIBRESOLV)
#

49
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-monotonic_elapsed.patch

@ -1,49 +0,0 @@
autofs-5.1.4 - fix monotonic_elapsed
From: NeilBrown <neilb@suse.com>
When automount probes multiple hosts to find the one which
responds most quickly, it currently ignores the nanoseconds.
This often makes the cost "0", which makes weights ineffective.
The cause is that monotonic_elapsed() casts tv_nsec to a
double *after* dividing by 1 billion, rather than before.
With this change, weights become effective for choosing
between hosts which respond in under one second.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/rpc_subs.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 104fca90..313730b1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,6 +10,7 @@ xx/xx/2018 autofs-5.1.5
- add error handling for ext_mount_add().
- account for recent libnsl changes.
- use_hostname_for_mounts shouldn't prevent selection among replicas.
+- fix monotonic_elapsed.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
index 73097c9d..60ede9f8 100644
--- a/lib/rpc_subs.c
+++ b/lib/rpc_subs.c
@@ -1093,9 +1093,9 @@ double monotonic_elapsed(struct timespec start, struct timespec end)
double t1, t2;
t1 = (double) start.tv_sec +
- (double) (start.tv_nsec/(1000*1000*1000));
+ ((double) start.tv_nsec/(1000*1000*1000));
t2 = (double) end.tv_sec +
- (double) (end.tv_nsec/(1000*1000*1000));
+ ((double) end.tv_nsec/(1000*1000*1000));
return t2 - t1;
}

38
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-possible-NULL-pointer-access-in-get_defaults_entry.patch

@ -1,38 +0,0 @@
autofs-5.1.4 - fix possible NULL pointer dereference in get_defaults_entry()
From: Ian Kent <raven@themaw.net>
Function select_default_entry() can call make_default_entry() so a NULL
return is possible.
Signed-off-by: Ian Kent <raven@themaw.net>
---
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

55
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch

@ -1,55 +0,0 @@
autofs-5.1.4 - fix prefix option handling in expand_entry()
From: Ian Kent <raven@themaw.net>
The changes to fix the defaults handling in the amd map parser caused
the prefix option to not be expanded and also to not be propagated to
submounts in some cases.
But the prefix should be expanded in modules/parse_amd.c:expand_entry()
along with the reset of the amd map entry fields.
Just adding this to modules/parse_amd.c:expand_entry() (where it should
be) fixes the amd map entry expansion and also fixes the propagation
of the prefix to submounts.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/parse_amd.c | 11 +++++++++++
2 files changed, 12 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 13f01397..19aec2ae 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,7 @@ xx/xx/2018 autofs-5.1.5
- fix use after free in do_master_list_reset().
- fix deadlock in dumpmaps.
- dont use array for path when not necessary.
+- fix prefix option handling in expand_entry().
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index 2cce5417..1a5a2960 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -725,6 +725,17 @@ static struct substvar *expand_entry(struct autofs_point *ap,
entry->rhost = host;
}
next:
+ if (entry->pref) {
+ if (expand_selectors(ap, entry->pref, &expand, sv)) {
+ debug(logopt, MODPREFIX
+ "pref expand(\"%s\") -> %s",
+ entry->pref, expand);
+ free(entry->pref);
+ entry->pref = expand;
+ }
+ sv = macro_addvar(sv, "pref", 4, entry->pref);
+ }
+
if (entry->sublink) {
if (expand_selectors(ap, entry->sublink, &expand, sv)) {
debug(logopt, MODPREFIX

44
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-program-usage-message.patch

@ -1,44 +0,0 @@
autofs-5.1.4 - fix program usage message
From: Ian Kent <raven@themaw.net>
There is a discrepancy between the list of options in the usage
message of automount(8) and the options listed in the man page.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 6 +++++-
2 files changed, 6 insertions(+), 1 deletion(-)
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"

40
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch

@ -1,40 +0,0 @@
autofs-5.1.4 - fix rpm spec install permissions on auto.net and auto.smb
From: Ian Kent <raven@themaw.net>
Commit 0da3f5695d removes execute permissions from the install of
auto.net and auto.smb.
Signed-off-by: Ian Kent <raven@themaw.net>
---
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

48
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch

@ -1,48 +0,0 @@
autofs-5.1.4 - fix sublink option not set from defaults
From: Ian Kent <raven@themaw.net>
If the amd entry sublink option is given in a defaults entry
it isn't merged into the current entry during parsing.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/parse_amd.c | 12 ++++++++++++
2 files changed, 13 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 19aec2ae..756ef927 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ xx/xx/2018 autofs-5.1.5
- fix deadlock in dumpmaps.
- dont use array for path when not necessary.
- fix prefix option handling in expand_entry().
+- fix sublink option not set from defaults.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index 1a5a2960..1c962fff 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -645,6 +645,18 @@ static void update_with_defaults(struct amd_entry *defaults,
}
}
+ if (!entry->sublink) {
+ if (defaults->sublink) {
+ tmp = strdup(defaults->sublink);
+ if (tmp)
+ entry->sublink = tmp;
+ } else {
+ v = macro_findvar(sv, "sublink", 2);
+ if (v)
+ entry->sublink = strdup(v->val);
+ }
+ }
+
return;
}

102
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-update_negative_cache-map-source-usage.patch

@ -1,102 +0,0 @@
autofs-5.1.4 - fix update_negative_cache() map source usage
From: Ian Kent <raven@themaw.net>
File map sources can be either plain text or executable.
When the map path is specified without a type (eg. when a
full path is used) an instance map source is used and the
original map is left unchanged.
But update_negative_cache() fails to take this into account
causing it to update the wrong map cache.
When a map reload is done the map entry appears to not exist
so the new map entry is added.
This could go unnoticed except that, after a map read, the
map entry cache cleans stale map entries and the existence
of this negative entry causes the new map entry to be deleted
and map lookups continue to fail.
In hindsite the use of an instance map source for this is
probably uneccessary but changing it will be risky so, for
now, just make update_negative_cache() use the correct map.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/lookup.c | 38 ++++++++++++++++++++++++++++++++++++--
2 files changed, 37 insertions(+), 2 deletions(-)
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;

55
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch

@ -1,55 +0,0 @@
autofs-5.1.4 - fix use after free in do_master_list_reset()
From: Ian Kent <raven@themaw.net>
Umm ... list_for_each() can't be used in do_master_list_reset() because
the subject entry of the loop is removed for the list within the loop
body. Therefore it can't be used to calculate the next pointer within a
for (...) loop.
There is no list_for_each_safe() macro in the list.h of autofs so it
needs to be done manually.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 8 ++++++--
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 4faab510..2747327b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
xx/xx/2018 autofs-5.1.5
- fix flag file permission.
- fix directory create permission.
+- fix use after free in do_master_list_reset().
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/daemon/automount.c b/daemon/automount.c
index dcdc19fb..28b3f2f5 100644
--- a/daemon/automount.c
+++ b/daemon/automount.c
@@ -2070,14 +2070,18 @@ static void remove_empty_args(char **argv, int *argc)
static void do_master_list_reset(struct master *master)
{
- struct list_head *head, *p;
+ struct list_head *head, *p, *n;
master_mutex_lock();
head = &master->mounts;
- list_for_each(p, head) {
+ n = head->next;
+ while (n != head) {
struct master_mapent *entry;
+ p = n;
+ n = p->next;
+
entry = list_entry(p, struct master_mapent, list);
if (!list_empty(&entry->list))

38
archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-parse_ldap_config.patch

@ -1,38 +0,0 @@
autofs-5.1.4 - fix use after free in parse_ldap_config()
From: Ian Kent <raven@themaw.net>
Commit a4a2af5f30 (covarity fixes) incorrecly frees local variable
authtype after assigning it to a lookup context structure member.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/lookup_ldap.c | 2 --
2 files changed, 1 insertion(+), 2 deletions(-)
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)

123
archive-patches/autofs-5.1.4/autofs-5.1.4-improve-hostname-lookup-error-logging.patch

@ -1,123 +0,0 @@
autofs-5.1.4 - improve hostname lookup error logging
From: Ian Kent <raven@themaw.net>
There's not enough information in name lookup log messages
to determine if the failed lookup is in fact a problem or
is expected.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/parse_subs.c | 3 ++-
lib/rpc_subs.c | 3 ++-
modules/dclist.c | 4 +++-
modules/parse_amd.c | 9 ++++++---
modules/replicated.c | 5 +++--
6 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index f771a433..596590a8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -19,6 +19,7 @@ xx/xx/2018 autofs-5.1.5
- add fedfs-map-nfs4.c.
- add conditional inclusion of fedfs binaries.
- add an example fedfs master map entry to the installed master map.
+- improve hostname lookup error logging.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/lib/parse_subs.c b/lib/parse_subs.c
index db784a58..841e81fd 100644
--- a/lib/parse_subs.c
+++ b/lib/parse_subs.c
@@ -476,7 +476,8 @@ unsigned int get_network_proximity(const char *name)
ret = getaddrinfo(name_or_num, NULL, &hints, &ni);
if (ret) {
- logerr("getaddrinfo: %s", gai_strerror(ret));
+ logerr("hostname lookup for %s failed: %s",
+ name_or_num, gai_strerror(ret));
return PROXIMITY_ERROR;
}
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
index 60ede9f8..cc83e84d 100644
--- a/lib/rpc_subs.c
+++ b/lib/rpc_subs.c
@@ -693,7 +693,8 @@ static int create_client(struct conn_info *info, CLIENT **client)
ret = getaddrinfo(info->host, NULL, &hints, &ai);
if (ret) {
error(LOGOPT_ANY,
- "hostname lookup failed: %s", gai_strerror(ret));
+ "hostname lookup for %s failed: %s",
+ info->host, gai_strerror(ret));
goto out_close;
}
diff --git a/modules/dclist.c b/modules/dclist.c
index 4daa199b..ba32134d 100644
--- a/modules/dclist.c
+++ b/modules/dclist.c
@@ -357,7 +357,9 @@ static char *getdnsdomainname(unsigned int logopt)
ret = getaddrinfo(name, NULL, &hints, &ni);
if (ret) {
- error(logopt, "hostname lookup failed: %s", gai_strerror(ret));
+ error(logopt,
+ "hostname lookup for %s failed: %s",
+ name, gai_strerror(ret));
return NULL;
}
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
index e7debc56..9543ced3 100644
--- a/modules/parse_amd.c
+++ b/modules/parse_amd.c
@@ -260,7 +260,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar
ret = getaddrinfo(v->val, NULL, &hints, &cni);
if (ret) {
error(logopt, MODPREFIX
- "hostname lookup failed: %s\n", gai_strerror(ret));
+ "hostname lookup for %s failed: %s\n",
+ v->val, gai_strerror(ret));
goto out;
}
@@ -270,7 +271,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar
ret = getaddrinfo(name, NULL, &hints, &ni);
if (ret) {
error(logopt, MODPREFIX
- "hostname lookup failed: %s\n", gai_strerror(ret));
+ "hostname lookup for %s failed: %s\n",
+ name, gai_strerror(ret));
freeaddrinfo(cni);
goto out;
}
@@ -678,7 +680,8 @@ static char *normalize_hostname(unsigned int logopt, const char *host,
ret = getaddrinfo(host, NULL, &hints, &ni);
if (ret) {
error(logopt, MODPREFIX
- "hostname lookup failed: %s", gai_strerror(ret));
+ "hostname lookup for %s failed: %s",
+ host, gai_strerror(ret));
return NULL;
}
name = strdup(ni->ai_canonname);
diff --git a/modules/replicated.c b/modules/replicated.c
index f7b83236..740270ec 100644
--- a/modules/replicated.c
+++ b/modules/replicated.c
@@ -1007,8 +1007,9 @@ try_name:
ret = getaddrinfo(name, NULL, &hints, &ni);
if (ret) {
- error(LOGOPT_ANY, "hostname lookup failed: %s",
- gai_strerror(ret));
+ error(LOGOPT_ANY,
+ "hostname lookup for %s failed: %s",
+ name, gai_strerror(ret));
free(name);
return 0;
}

43
archive-patches/autofs-5.1.4/autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch

@ -1,43 +0,0 @@
autofs-5.1.4 - make umount_ent() recognise forced umount
From: Ian Kent <raven@themaw.net>
When doing a forced shutdown umount_ent() tries a normal expire
first resulting in a fair amount of unnecessary log noise.
Change umount_ent() to do a forced expire when a forced shutdown
has been requested to avoid the log noise.
Signed-off-by: Ian Kent <raven@themaw.net>
---
lib/mounts.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
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.

68
archive-patches/autofs-5.1.4/autofs-5.1.4-mark-removed-cache-entry-negative.patch

@ -1,68 +0,0 @@
autofs-5.1.4 - mark removed cache entry negative
From: Ian Kent <raven@themaw.net>
When re-reading a map, entries that have been removed are detected
and deleted from the map entry cache by lookup_prune_cache().
If a removed map entry is mounted at the time lookup_prune_cache()
is called the map entry is 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 <raven@themaw.net>
---
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;

125
archive-patches/autofs-5.1.4/autofs-5.1.4-move-close-stdio-descriptors-to-become_daemon.patch

@ -1,125 +0,0 @@
autofs-5.1.4 - move close stdio descriptors to become_daemon()
From: Ian Kent <raven@themaw.net>
Move the stdio file descriptor close to the become_daemon() function
as closing these file descriptors, ie. detaching from ttys, is part
of the preperation for becoming a system daemon.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 27 ++++++++++++++++++++++++++-
include/log.h | 1 -
lib/log.c | 29 -----------------------------
4 files changed, 27 insertions(+), 31 deletions(-)
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) {

359
archive-patches/autofs-5.1.4/autofs-5.1.4-refactor-negative-map-entry-check.patch

@ -1,359 +0,0 @@
autofs-5.1.4 - refactor negative map entry check
From: Ian Kent <raven@themaw.net>
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 <raven@themaw.net>
---
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);
- }
- }
}
/*

236
archive-patches/autofs-5.1.4/autofs-5.1.4-remove-autofs4-module-load-code.patch

@ -1,236 +0,0 @@
autofs-5.1.4 - remove autofs4 module load code
From: Ian Kent <raven@themaw.net>
The autofs kernel module has finally been renamed from autofs4 to
autofs so autoloading works so there is no need for manual loading.
The module load function has been commented out in the source for
a long time so there should not be any adverse affects from removing
it.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
configure | 61 ---------------------------------------------------
configure.in | 1 -
daemon/automount.c | 8 -------
daemon/module.c | 35 -----------------------------
include/automount.h | 7 ------
include/config.h.in | 6 -----
7 files changed, 1 insertion(+), 118 deletions(-)
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 <memory.h> header file. */
#undef HAVE_MEMORY_H
-/* define if you have MODPROBE */
-#undef HAVE_MODPROBE
-
/* define if you have MOUNT */
#undef HAVE_MOUNT
@@ -129,9 +126,6 @@
/* define if you have LEX */
#undef PATH_LEX
-/* define if you have MODPROBE */
-#undef PATH_MODPROBE
-
/* define if you have MOUNT */
#undef PATH_MOUNT

38
archive-patches/autofs-5.1.4/autofs-5.1.4-remove-couple-of-undeeded-requires.patch

@ -1,38 +0,0 @@
autofs-5.1.4 - remove couple of undeeded requires
From: Ian Kent <raven@themaw.net>
Remove a couple of apparently undeeded Requires entries from the tar
spec file.
Signed-off-by: Ian Kent <raven@themaw.net>
---
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

41
archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_master.patch

@ -1,41 +0,0 @@
autofs-5.1.4 - remove unused function dump_master()
From: Ian Kent <raven@themaw.net>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master.c | 11 -----------
2 files changed, 1 insertion(+), 11 deletions(-)
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);
- }
-}

57
archive-patches/autofs-5.1.4/autofs-5.1.4-remove-unused-function-dump_state_queue.patch

@ -1,57 +0,0 @@
autofs-5.1.4 - remove unused function dump_state_queue()
From: Ian Kent <raven@themaw.net>
Signed-off-by: Ian Kent <raven@themaw.net>
---
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];

73
archive-patches/autofs-5.1.4/autofs-5.1.4-set-bind-mount-as-propagation-slave.patch

@ -1,73 +0,0 @@
autofs-5.1.4 - set bind mount as propagation slave
From: Ian Kent <raven@themaw.net>
When using a multi-mount with mount targets that are on the
local machine and resulting bind mounts are made to a file
system that is mount propagation shared (such as the root
file system on systemd managed systems) the autofs offset
mount triggers made within the bind mount will be propagated
back to the target file system.
When this happens the target of the offset (the unwanted
propagated mount) is itself an autofs trigger mount and
accessing the path results in a deadlock.
In order for these multi-mounts to function properly in this
case bind mounts that contain mount triggers must be set to
propagation slave or private so the backward propagation
doesn't occur.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/mount_bind.c | 16 +++++++++++++++-
2 files changed, 16 insertions(+), 1 deletion(-)
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 <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/mount.h>
#define MODULE_MOUNT
#include "automount.h"
@@ -183,8 +184,21 @@ int mount_mount(struct autofs_point *ap, 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];

52
archive-patches/autofs-5.1.4/autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch

@ -1,52 +0,0 @@
autofs-5.1.4 - tiny patch for autofs typo and possible bug
From: Todd Eigenschink <todd@fai2.com>
(1) The word "to" is doubled in two warnings.
(2) It prints a warning when it can't open the "old" config file, even
if it was able to open the default one. That's a reasonable warning if
it *couldn't* open the new one, but seems unnecessary if it could.
The patch removes the unneeded "to"s and only prints warning about the
old config file if it couldn't open the default one.
Signed-off-by: Todd Eigenschink <todd@fai2.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/defaults.c | 6 +++---
2 files changed, 4 insertions(+), 3 deletions(-)
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 */

45
archive-patches/autofs-5.1.4/autofs-5.1.4-update-build-info-with-systemd.patch

@ -1,45 +0,0 @@
autofs-5.1.4 - update build info with systemd
From: Ian Kent <raven@themaw.net>
Update the show_build_info() function to include systemd
build info.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 9 +++++++++
2 files changed, 10 insertions(+)
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 ");

108
archive-patches/autofs-5.1.4/autofs-5.1.4-use-defines-for-expire-type.patch

@ -1,108 +0,0 @@
autofs-5.1.4 - use defines for expire type
From: Ian Kent <raven@themaw.net>
The kernel defines for expire type such as an immediate expire
shoule be used to clearify what is being requested.
AUTOFS_EXP_IMMEDIATE corresponds to a SIGUSR1 prune operation.
AUTOFS_EXP_FORCE corresponds to an expire type not yet implemented in
the kernel, a SIGUSR2 forced expire. Define it in our internal autofs
kernel include file, the kernel will ignore it if it doesn't support it.
AUTOFS_EXP_LEAVES is no longer used in autofs version 5.
Finally add a define AUTOFS_EXP_NORMAL to indicate we're perfoming a
normal expire.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/state.c | 8 ++++----
include/linux/auto_fs4.h | 6 ++++--
include/state.h | 2 +-
4 files changed, 10 insertions(+), 7 deletions(-)
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 */
};

225
archive-patches/autofs-5.1.4/autofs-5.1.4-use-flags-for-startup-boolean-options.patch

@ -1,225 +0,0 @@
autofs-5.1.4 - use flags for startup boolean options
From: Ian Kent <raven@themaw.net>
The daemon uses a number of boolean flags each stored in unsigned int
variables. But a single bit flag is sufficient storage for most of
these flags.
So use bit flags for these where possible.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/automount.c | 45 ++++++++++++++++++++++-----------------------
include/automount.h | 6 ++++++
lib/master.c | 4 ++--
4 files changed, 31 insertions(+), 25 deletions(-)
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;

1572
archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch

File diff suppressed because it is too large

226
archive-patches/autofs-5.1.4/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch

@ -1,226 +0,0 @@
autofs-5.1.4 - use_hostname_for_mounts shouldn't prevent selection among replicas
From: NeilBrown <neilb@suse.com>
If several replicas have been specified for a mount point,
and use_hostname_for_mount is set to "yes", the selection
between these replicas is currently disabled and the last in
the list is always chosen.
There is little point selecting between different addresses
for the one host in this case, but it is still worth
selecting between different hosts, particularly if different
weights have been specified.
This patch restores the "prune_host_list()" functionality
when use_hostname_for_mount is set, and modifies it slightly
so that only on IP address for any host:/path entry in the
config file is willl be successfully probed. After a
success, further addresses from the same entry are skipped.
This is achieved by tracking an entry number ("ent_num") for
each 'struct host'.
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
include/replicated.h | 3 ++-
modules/mount_nfs.c | 2 +-
modules/replicated.c | 35 ++++++++++++++++++++---------------
4 files changed, 24 insertions(+), 17 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 2d5d5b1f..104fca90 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,6 +9,7 @@ xx/xx/2018 autofs-5.1.5
- fix error return in do_nfs_mount().
- add error handling for ext_mount_add().
- account for recent libnsl changes.
+- use_hostname_for_mounts shouldn't prevent selection among replicas.
19/12/2017 autofs-5.1.4
- fix spec file url.
diff --git a/include/replicated.h b/include/replicated.h
index 69ab7800..0f482d21 100644
--- a/include/replicated.h
+++ b/include/replicated.h
@@ -57,6 +57,7 @@
struct host {
char *name;
+ int ent_num;
struct sockaddr *addr;
size_t addr_len;
unsigned int rr;
@@ -70,7 +71,7 @@ struct host {
};
void seed_random(void);
-struct host *new_host(const char *, struct sockaddr *, size_t,
+struct host *new_host(const char *, int, struct sockaddr *, size_t,
unsigned int, unsigned int, unsigned int);
void free_host_list(struct host **);
int parse_location(unsigned, struct host **, const char *, unsigned int);
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
index 77166544..4cf0cd27 100644
--- a/modules/mount_nfs.c
+++ b/modules/mount_nfs.c
@@ -236,7 +236,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
(vers & NFS4_VERS_MASK) != 0 &&
!(vers & UDP6_REQUESTED)) {
unsigned int v4_probe_ok = 0;
- struct host *tmp = new_host(hosts->name,
+ struct host *tmp = new_host(hosts->name, 0,
hosts->addr, hosts->addr_len,
hosts->proximity,
hosts->weight, hosts->options);
diff --git a/modules/replicated.c b/modules/replicated.c
index 3ac4c70f..f7b83236 100644
--- a/modules/replicated.c
+++ b/modules/replicated.c
@@ -83,7 +83,7 @@ void seed_random(void)
return;
}
-struct host *new_host(const char *name,
+struct host *new_host(const char *name, int ent_num,
struct sockaddr *addr, size_t addr_len,
unsigned int proximity, unsigned int weight,
unsigned int options)
@@ -116,6 +116,7 @@ struct host *new_host(const char *name,
memset(new, 0, sizeof(struct host));
new->name = tmp1;
+ new->ent_num = ent_num;
new->addr_len = addr_len;
new->addr = tmp2;
new->proximity = proximity;
@@ -714,7 +715,7 @@ done:
int prune_host_list(unsigned logopt, struct host **list,
unsigned int vers, int port)
{
- struct host *this, *last, *first;
+ struct host *this, *last, *first, *prev;
struct host *new = NULL;
unsigned int proximity, selected_version = 0;
unsigned int v2_tcp_count, v3_tcp_count, v4_tcp_count;
@@ -726,12 +727,6 @@ int prune_host_list(unsigned logopt, struct host **list,
if (!*list)
return 0;
- /* If we're using the host name then there's no point probing
- * avialability and respose time.
- */
- if (defaults_use_hostname_for_mounts())
- return 1;
-
/* Use closest hosts to choose NFS version */
first = *list;
@@ -877,11 +872,18 @@ int prune_host_list(unsigned logopt, struct host **list,
first = last;
this = first;
+ prev = NULL;
while (this) {
struct host *next = this->next;
if (!this->name) {
remove_host(list, this);
add_host(&new, this);
+ } else if (defaults_use_hostname_for_mounts() && prev &&
+ prev->ent_num == this->ent_num) {
+ /* When we use the hostname to mount, there is no
+ * point in probing every address it has, just one is
+ * enough. Skip the rest.
+ */
} else {
status = get_supported_ver_and_cost(logopt, this,
selected_version, port);
@@ -889,6 +891,7 @@ int prune_host_list(unsigned logopt, struct host **list,
this->version = selected_version;
remove_host(list, this);
add_host(&new, this);
+ prev = this;
}
}
this = next;
@@ -901,7 +904,7 @@ int prune_host_list(unsigned logopt, struct host **list,
}
static int add_new_host(struct host **list,
- const char *host, unsigned int weight,
+ const char *host, int ent_num, unsigned int weight,
struct addrinfo *host_addr,
unsigned int rr, unsigned int options)
{
@@ -940,7 +943,7 @@ static int add_new_host(struct host **list,
else
return 0;
- new = new_host(host, host_addr->ai_addr, addr_len, prx, weight, options);
+ new = new_host(host, ent_num, host_addr->ai_addr, addr_len, prx, weight, options);
if (!new)
return 0;
@@ -953,7 +956,7 @@ static int add_new_host(struct host **list,
return 1;
}
-static int add_host_addrs(struct host **list, const char *host,
+static int add_host_addrs(struct host **list, const char *host, int ent_num,
unsigned int weight, unsigned int options)
{
struct addrinfo hints, *ni, *this;
@@ -988,7 +991,7 @@ static int add_host_addrs(struct host **list, const char *host,
this = ni;
while (this) {
- ret = add_new_host(list, host, weight, this, 0, options);
+ ret = add_new_host(list, host, ent_num, weight, this, 0, options);
if (!ret)
break;
this = this->ai_next;
@@ -1027,7 +1030,7 @@ try_name:
rr++;
this = ni;
while (this) {
- ret = add_new_host(list, host, weight, this, rr, options);
+ ret = add_new_host(list, host, ent_num, weight, this, rr, options);
if (!ret)
break;
this = this->ai_next;
@@ -1120,6 +1123,7 @@ int parse_location(unsigned logopt, struct host **hosts,
{
char *str, *p, *delim;
unsigned int empty = 1;
+ int ent_num = 1;
if (!list)
return 0;
@@ -1177,7 +1181,7 @@ int parse_location(unsigned logopt, struct host **hosts,
}
if (p != delim) {
- if (!add_host_addrs(hosts, p, weight, options)) {
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
if (empty) {
p = next;
continue;
@@ -1199,7 +1203,7 @@ int parse_location(unsigned logopt, struct host **hosts,
*delim = '\0';
next = delim + 1;
- if (!add_host_addrs(hosts, p, weight, options)) {
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
p = next;
continue;
}
@@ -1213,6 +1217,7 @@ int parse_location(unsigned logopt, struct host **hosts,
return 0;
}
+ ent_num++;
p = next;
}

55
archive-patches/autofs-5.1.4/patch_order-5.1.4

@ -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

47
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 <rgoldwyn@suse.de>
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 <rgoldwyn@suse.com>
Acked-by: Ian Kent <raven@themaw.net>
---
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)

43
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 <raven@themaw.net>
When constructing the mount location string in mount_nfs.c:mount_mount()
the return from get_addr_string() is not checked for NULL.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/mount_nfs.c | 6 ++++++
2 files changed, 7 insertions(+)
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);

87
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 <raven@themaw.net>
Add mount option "ignore", if the kernel supports it, as an
indicator to applications to ignore the mount entry.
Signed-off-by: Ian Kent <raven@themaw.net>
---
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;

188
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 <lars@pixar.com>
This option makes automount pass the -v flag to mount(8).
Signed-off-by: Lars R. Damerow <lars@pixar.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/spawn.c | 20 ++++++++++++--------
include/defaults.h | 2 ++
lib/defaults.c | 17 +++++++++++++++++
man/autofs.conf.5.in | 4 ++++
redhat/autofs.conf.default.in | 4 ++++
samples/autofs.conf.default.in | 4 ++++
7 files changed, 44 insertions(+), 8 deletions(-)
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

215
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 <raven@themaw.net>
Kernel commit 092a53452b (("autofs: take more care to not update
last_used on path walk") helped to (partially) resolve a problem
where automounts were not expiring due to aggressive accesses from
user space.
This patch was later reverted because, for very large environments,
it meant more mount requests from clients and when there are a lot
of clients this caused a fairly significant increase in server load.
But there is a need for both types of expire check, depending on use
case, so a mount option to allow for strict update of last use of
autofs dentrys has been added ito the autofs file system (which just
means not updating the last use on path walk accesses).
So add support for this master map mount entry option in the user
space code.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 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 <strtype> map
%type <strtype> options
@@ -206,6 +207,7 @@ line:
| PATH OPT_DEBUG { master_notify($1); YYABORT; }
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; }
| PATH OPT_SYMLINK { master_notify($1); YYABORT; }
+ | PATH OPT_STRICTEXPIRE { master_notify($1); YYABORT; }
| PATH OPT_SLAVE { master_notify($1); YYABORT; }
| PATH OPT_PRIVATE { master_notify($1); YYABORT; }
| PATH OPT_NOBIND { master_notify($1); YYABORT; }
@@ -619,6 +621,7 @@ option: daemon_option
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; }
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; }
| OPT_SYMLINK { symlnk = 1; }
+ | OPT_STRICTEXPIRE { strictexpire = 1; }
| OPT_SLAVE { slave = 1; }
| OPT_PRIVATE { private = 1; }
| OPT_NOBIND { nobind = 1; }
@@ -693,6 +696,7 @@ static void local_init_vars(void)
timeout = -1;
negative_timeout = 0;
symlnk = 0;
+ strictexpire = 0;
slave = 0;
private = 0;
nobind = 0;
@@ -901,6 +905,8 @@ int master_parse_entry(const char *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;

52
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 <raven@themaw.net>
When map source is specified in a master map entry, checking if
map type is hesiod in master_parse() will generate a SEGV if a
parser type is not also present becuase tmp will be NULL in this
case.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
lib/master_parse.y | 8 ++++----
2 files changed, 5 insertions(+), 4 deletions(-)
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;

234
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 <lars@pixar.com>
Override the debug log only setting if mount_verbose is set so that
mount parameter information is logged on mount.
Signed-off-by: Lars R. Damerow <lars@pixar.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
modules/mount_afs.c | 6 +++++-
modules/mount_bind.c | 10 +++++++---
modules/mount_ext2.c | 16 ++++++++++------
modules/mount_generic.c | 14 +++++++++-----
modules/mount_nfs.c | 29 +++++++++++++++++------------
6 files changed, 49 insertions(+), 27 deletions(-)
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);
}

171
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 <lars@pixar.com>
This information can be helpful to determine who or what is making
particular mount requests, especially when used in conjunction with
the use_mount_request_log_id option.
Signed-off-by: Lars R. Damerow <lars@pixar.com>
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/direct.c | 6 ++++++
daemon/indirect.c | 6 ++++++
include/log.h | 2 ++
lib/log.c | 39 +++++++++++++++++++++++++++++++++++++++
man/autofs.conf.5.in | 3 ++-
redhat/autofs.conf.default.in | 4 +++-
samples/autofs.conf.default.in | 4 +++-
8 files changed, 62 insertions(+), 3 deletions(-)
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
#

165
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 <raven@themaw.net>
Use malloc(3) in spawn.c functions instead of alloca(3) as a failure
return for this function is undefined.
Signed-off-by: Ian Kent <raven@themaw.net>
---
CHANGELOG | 1 +
daemon/spawn.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 45 insertions(+), 6 deletions(-)
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;
}

9
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

10
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)

Loading…
Cancel
Save