vanhofen 6 years ago
parent
commit
5b4243d8b5
  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. 42
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch
  4. 184
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch
  5. 121
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch
  6. 402
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch
  7. 342
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-map-nfs4_c.patch
  8. 44
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch
  9. 696
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-mount_fedfs_c.patch
  10. 43
      archive-patches/autofs-5.1.4/autofs-5.1.4-add-units-After-line-to-include-statd-service.patch
  11. 146
      archive-patches/autofs-5.1.4/autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch
  12. 434
      archive-patches/autofs-5.1.4/autofs-5.1.4-covarity-fixes-1.patch
  13. 48
      archive-patches/autofs-5.1.4/autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch
  14. 56
      archive-patches/autofs-5.1.4/autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch
  15. 49
      archive-patches/autofs-5.1.4/autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch
  16. 75
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-NFS-version-mask-usage.patch
  17. 40
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch
  18. 207
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-directory-create-permission.patch
  19. 35
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch
  20. 50
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch
  21. 41
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-flag-file-permission.patch
  22. 94
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-libresolv-configure-check.patch
  23. 49
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-monotonic_elapsed.patch
  24. 55
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch
  25. 40
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch
  26. 48
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch
  27. 55
      archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch
  28. 123
      archive-patches/autofs-5.1.4/autofs-5.1.4-improve-hostname-lookup-error-logging.patch
  29. 43
      archive-patches/autofs-5.1.4/autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch
  30. 52
      archive-patches/autofs-5.1.4/autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch
  31. 108
      archive-patches/autofs-5.1.4/autofs-5.1.4-use-defines-for-expire-type.patch
  32. 1572
      archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch
  33. 226
      archive-patches/autofs-5.1.4/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch
  34. 33
      archive-patches/autofs-5.1.4/patch_order-5.1.4
  35. 32
      archive-patches/autofs-include-linux-nfs.h-directly-in-rpc_sub.patch
  36. 15
      make/system-tools.mk

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -0,0 +1,44 @@
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

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

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

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

@ -0,0 +1,43 @@
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]

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

@ -0,0 +1,146 @@
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

@ -0,0 +1,434 @@
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

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

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

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

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

@ -0,0 +1,49 @@
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

@ -0,0 +1,75 @@
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.

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

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

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

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

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

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

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

@ -0,0 +1,50 @@
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

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

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

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

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

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

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

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

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

@ -0,0 +1,40 @@
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

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

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

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

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

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

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

@ -0,0 +1,43 @@
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.

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

@ -0,0 +1,52 @@
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 */

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

@ -0,0 +1,108 @@
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 */
};

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

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

33
archive-patches/autofs-5.1.4/patch_order-5.1.4

@ -0,0 +1,33 @@
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

32
archive-patches/autofs-include-linux-nfs.h-directly-in-rpc_sub.patch

@ -1,32 +0,0 @@
From 44bdce8c6ed9b30c1643e5981172a4f9025f013c Mon Sep 17 00:00:00 2001
From: Andreas Oberritter <obi@opendreambox.org>
Date: Wed, 13 Mar 2013 16:17:08 +0100
Subject: [PATCH] autofs-5.0.7: include linux/nfs.h directly in rpc_subs.h
Fixes compile error with uclibc. Glibc's nfs/nfs.h contains
nothing but "#include linux/nfs.h". rpc_subs.h already includes
other linux/nfs*.h files directly.
Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Upstream-Status: Pending
---
include/rpc_subs.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/rpc_subs.h b/include/rpc_subs.h
index b6d59f9..a2d9648 100644
--- a/include/rpc_subs.h
+++ b/include/rpc_subs.h
@@ -18,7 +18,7 @@
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
-#include <nfs/nfs.h>
+#include <linux/nfs.h>
#include <linux/nfs2.h>
#include <linux/nfs3.h>
--
1.7.10.4

15
make/system-tools.mk

@ -453,13 +453,20 @@ $(D)/ntfs-3g: $(ARCHIVE)/ntfs-3g_ntfsprogs-$(NTFS3G_VER).tgz | $(TARGET_DIR)
$(REMOVE)/ntfs-3g_ntfsprogs-$(NTFS3G_VER) $(REMOVE)/ntfs-3g_ntfsprogs-$(NTFS3G_VER)
touch $@ touch $@
# the 'autofs-use-pkg-config' patch for libtirpc link should hopefully be added upstream soon # -----------------------------------------------------------------------------
# see: https://patchwork.ozlabs.org/patch/782714/
# 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
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) $(D)/autofs5: $(D)/libtirpc $(ARCHIVE)/autofs-$(AUTOFS5_VER).tar.gz | $(TARGET_DIR)
$(REMOVE)/autofs-$(AUTOFS5_VER) $(REMOVE)/autofs-$(AUTOFS5_VER)
$(UNTAR)/autofs-$(AUTOFS5_VER).tar.gz $(UNTAR)/autofs-$(AUTOFS5_VER).tar.gz
cd $(BUILD_TMP)/autofs-$(AUTOFS5_VER) && \ cd $(BUILD_TMP)/autofs-$(AUTOFS5_VER) && \
$(PATCH)/autofs-include-linux-nfs.h-directly-in-rpc_sub.patch && \ $(call apply_patches, $(AUTOFS_PATCH)) && \
read; \
export ac_cv_linux_procfs=yes && \ export ac_cv_linux_procfs=yes && \
export ac_cv_path_KRB5_CONFIG=no && \ export ac_cv_path_KRB5_CONFIG=no && \
export ac_cv_path_MODPROBE=/sbin/modprobe && \ export ac_cv_path_MODPROBE=/sbin/modprobe && \
@ -489,6 +496,8 @@ $(D)/autofs5: $(D)/libtirpc $(ARCHIVE)/autofs-$(AUTOFS5_VER).tar.gz | $(TARGET_D
$(REMOVE)/autofs-$(AUTOFS5_VER) $(REMOVE)/autofs-$(AUTOFS5_VER)
touch $@ touch $@
# -----------------------------------------------------------------------------
samba: samba-$(BOXSERIES) samba: samba-$(BOXSERIES)
$(D)/samba-hd1: $(D)/zlib $(ARCHIVE)/samba-$(SAMBA33_VER).tar.gz | $(TARGET_DIR) $(D)/samba-hd1: $(D)/zlib $(ARCHIVE)/samba-$(SAMBA33_VER).tar.gz | $(TARGET_DIR)

Loading…
Cancel
Save