From 5b4243d8b57824ec0d80740b7a83bbda5750b888 Mon Sep 17 00:00:00 2001 From: vanhofen Date: Sun, 26 Aug 2018 22:28:34 +0200 Subject: [PATCH] - autofs: add pre-5.1.5 patches from https://mirrors.edge.kernel.org/pub/linux/daemons/autofs/v5 --- ...es.rules-remove-samples-from-SUBDIRS.patch | 66 + ...ofs-5.1.4-account-for-libnsl-changes.patch | 557 ++++++ ...ap-entry-to-the-installed-master-map.patch | 42 + ...ditional-inclusion-of-fedfs-binaries.patch | 184 ++ ...add-error-handling-for-ext_mount_add.patch | 121 ++ .../autofs-5.1.4-add-fedfs-getsrvinfo_c.patch | 402 +++++ .../autofs-5.1.4-add-fedfs-map-nfs4_c.patch | 342 ++++ ...ge-note-about-extra-slashes-in-paths.patch | 44 + .../autofs-5.1.4-add-mount_fedfs_c.patch | 696 ++++++++ ...-After-line-to-include-statd-service.patch | 43 + ...-type-naming-to-better-reflect-usage.patch | 146 ++ .../autofs-5.1.4-covarity-fixes-1.patch | 434 +++++ ...ing-slash-in-master-map-mount-points.patch | 48 + ...e-array-for-path-when-not-neccessary.patch | 56 + ...le-SIGUSR2-handling-in-rpm-spec-file.patch | 49 + ...ofs-5.1.4-fix-NFS-version-mask-usage.patch | 75 + ...utofs-5.1.4-fix-deadlock-in-dumpmaps.patch | 40 + ....1.4-fix-directory-create-permission.patch | 207 +++ ...1.4-fix-error-return-in-do_nfs_mount.patch | 35 + ...-fix-fd-leak-in-rpc_do_create_client.patch | 50 + ...utofs-5.1.4-fix-flag-file-permission.patch | 41 + ...-5.1.4-fix-libresolv-configure-check.patch | 94 + .../autofs-5.1.4-fix-monotonic_elapsed.patch | 49 + ...efix-option-handling-in-expand_entry.patch | 55 + ...permissions-on-auto_net-and-auto_smb.patch | 40 + ...sublink-option-not-set-from-defaults.patch | 48 + ...e-after-free-in-do_master_list_reset.patch | 55 + ...mprove-hostname-lookup-error-logging.patch | 123 ++ ...e-umount_ent-recognise-forced-umount.patch | 43 + ...tch-for-autofs-typo-and-possible-bug.patch | 52 + ...fs-5.1.4-use-defines-for-expire-type.patch | 108 ++ ...1.4-use-systemd-sd_notify-at-startup.patch | 1572 +++++++++++++++++ ...dnt-prevent-selection-among-replicas.patch | 226 +++ .../autofs-5.1.4/patch_order-5.1.4 | 33 + ...lude-linux-nfs.h-directly-in-rpc_sub.patch | 32 - make/system-tools.mk | 23 +- 36 files changed, 6192 insertions(+), 39 deletions(-) create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-account-for-libnsl-changes.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-map-nfs4_c.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-add-mount_fedfs_c.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-add-units-After-line-to-include-statd-service.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-covarity-fixes-1.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-NFS-version-mask-usage.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-directory-create-permission.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-flag-file-permission.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-libresolv-configure-check.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-monotonic_elapsed.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-improve-hostname-lookup-error-logging.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-use-defines-for-expire-type.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch create mode 100644 archive-patches/autofs-5.1.4/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch create mode 100644 archive-patches/autofs-5.1.4/patch_order-5.1.4 delete mode 100644 archive-patches/autofs-include-linux-nfs.h-directly-in-rpc_sub.patch diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch new file mode 100644 index 00000000..e8288852 --- /dev/null +++ b/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 + +The rules in Makefile make it quite clear that +'samples' is not expected to be part of SUBDIRS. +e.g. + - The rule for "clean" handles both $(SUBDIRS) *and* samples. + - There are separate "install" and "install_samples" targets. + +However SUBDIRS does contain 'samples'. This means that +a simple "make; make install" will over-write your configuration files. + +So remove 'samples' from SUBDIRS. Note that it has been removed in +the past, but then got added back again. + +Signed-off-by: NeilBrown +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + Makefile.rules | 2 +- + autofs.spec | 6 ++++++ + 3 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 313730b1..1e5ec15b 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -11,6 +11,7 @@ xx/xx/2018 autofs-5.1.5 + - account for recent libnsl changes. + - use_hostname_for_mounts shouldn't prevent selection among replicas. + - fix monotonic_elapsed. ++- Makefiles.rules: remove 'samples' from SUBDIRS. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/Makefile.rules b/Makefile.rules +index 2bfa043c..4deab3b9 100644 +--- a/Makefile.rules ++++ b/Makefile.rules +@@ -3,7 +3,7 @@ + # + + # Root directory contents +-SUBDIRS = lib daemon modules man samples ++SUBDIRS = lib daemon modules man + INCDIRS = include + INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \ + Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \ +diff --git a/autofs.spec b/autofs.spec +index 6da0655d..2464e741 100644 +--- a/autofs.spec ++++ b/autofs.spec +@@ -121,6 +121,12 @@ install -m 755 redhat/autofs.init $RPM_BUILD_ROOT/etc/rc.d/init.d/autofs + install -m 644 redhat/autofs.conf $RPM_BUILD_ROOT/etc/autofs.conf + install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs + ++install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master ++install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc ++install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net ++install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb ++install -m 600 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf ++ + %clean + [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-account-for-libnsl-changes.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-account-for-libnsl-changes.patch new file mode 100644 index 00000000..baf0af13 --- /dev/null +++ b/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 + +The glibc RPC code has been dropped. + +The NIS functionality comes in the libnsl library but it installs +its files into sub directories of the system include and library +directories. + +So configure needs to check for this and allow for it in the +compile and linking of the NIS and NIS+ lookup modules. +--- + CHANGELOG | 1 + Makefile.conf.in | 4 - + Makefile.rules | 2 + aclocal.m4 | 45 ++++++++ + configure | 288 ++++++++++++++++++++++++++++++++++++++++++++++++--- + configure.in | 27 ++--- + include/config.h.in | 3 + + modules/Makefile | 10 ++ + 8 files changed, 343 insertions(+), 37 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 9d19c0a7..2d5d5b1f 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -8,6 +8,7 @@ xx/xx/2018 autofs-5.1.5 + - fix sublink option not set from defaults. + - fix error return in do_nfs_mount(). + - add error handling for ext_mount_add(). ++- account for recent libnsl changes. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/Makefile.conf.in b/Makefile.conf.in +index f879e262..85662654 100644 +--- a/Makefile.conf.in ++++ b/Makefile.conf.in +@@ -14,8 +14,8 @@ DAEMON_LDFLAGS = @DAEMON_LDFLAGS@ + # Glibc < 2.17 requires librt for clock_gettime() + LIBCLOCK_GETTIME = @LIBCLOCK_GETTIME@ + +-# Special parameters for glibc (libc 6) +-LIBNSL = @LIBNSL@ ++NSLLIB = @NSL_LIBS@ ++NSLCFLAGS = @NSL_CFLAGS@ + LIBRESOLV = @LIBRESOLV@ + + # Hesiod support: yes (1) no (0) +diff --git a/Makefile.rules b/Makefile.rules +index 0edf9bfe..2bfa043c 100644 +--- a/Makefile.rules ++++ b/Makefile.rules +@@ -54,8 +54,6 @@ ifdef DMALLOCLIB + LIBS += $(DMALLOCLIB) + endif + +-LIBS += $(LIBNSL) +- + LIBS += $(LIBCLOCK_GETTIME) + + # Standard rules +diff --git a/aclocal.m4 b/aclocal.m4 +index 51772043..f1ed3870 100644 +--- a/aclocal.m4 ++++ b/aclocal.m4 +@@ -417,3 +417,48 @@ fi + LIBS="$af_check_ldap_parse_page_control_save_libs" + ]) + ++dnl -------------------------------------------------------------------------- ++dnl AF_CHECK_YPCLNT_HEADER ++dnl ++dnl Check for include file rpcsvc/ypclnt.h for YellowPages support. ++dnl -------------------------------------------------------------------------- ++AC_DEFUN([AF_CHECK_YPCLNT_HEADER], ++[ ++# save current CFLAGS ++af_check_ypclnt_header_save_cflags="$CFLAGS" ++CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS" ++ ++HAVE_YPCLNT=0 ++AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1) ++AC_SUBST(HAVE_YPCLNT) ++if test "$HAVE_YPCLNT" = "1"; then ++ AC_DEFINE(HAVE_YPCLNT, 1, ++ [Define if using YellowPages]) ++fi ++ ++# restore libs ++CFLAGS="$af_check_ypclnt_header_save_cflags" ++]) ++ ++dnl -------------------------------------------------------------------------- ++dnl AF_CHECK_NIS_HEADER ++dnl ++dnl Check for include file rpcsvc/nis.h for NIS+ support. ++dnl -------------------------------------------------------------------------- ++AC_DEFUN([AF_CHECK_NIS_HEADER], ++[ ++# save current CFLAGS ++af_check_nis_header_save_cflags="$CFLAGS" ++CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS" ++ ++HAVE_NISPLUS=0 ++AC_CHECK_HEADER([rpcsvc/nis.h], HAVE_NISPLUS=1) ++AC_SUBST(HAVE_NISPLUS) ++if test "$HAVE_NISPLUS" = "1"; then ++ AC_DEFINE(HAVE_NISPLUS, 1, ++ [Define if using NIS+]) ++fi ++ ++# restore libs ++CFLAGS="$af_check_nis_header_save_cflags" ++]) +diff --git a/configure b/configure +index 476cea4b..2d517aac 100755 +--- a/configure ++++ b/configure +@@ -634,8 +634,8 @@ XML_FLAGS + LIBLDAP + HAVE_LDAP + LDAP_FLAGS +-HAVE_YPCLNT + HAVE_NISPLUS ++HAVE_YPCLNT + EGREP + GREP + CPP +@@ -643,7 +643,8 @@ HESIOD_FLAGS + LIBHESIOD + HAVE_HESIOD + LIBRESOLV +-LIBNSL ++NSL_LIBS ++NSL_CFLAGS + LIBCLOCK_GETTIME + KRB5_CONFIG + XML_CONFIG +@@ -764,6 +765,8 @@ CFLAGS + LDFLAGS + LIBS + CPPFLAGS ++NSL_CFLAGS ++NSL_LIBS + CPP' + + +@@ -1417,6 +1420,8 @@ Some influential environment variables: + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory ++ NSL_CFLAGS C compiler flags for NSL, overriding pkg-config ++ NSL_LIBS linker flags for NSL, overriding pkg-config + CPP C preprocessor + + Use these variables to override the choices made by `configure' or to help +@@ -4500,9 +4505,186 @@ fi + + + +-# +-# glibc/libc 6 new libraries +-# ++ ++ ++ ++ ++ ++ ++ ++if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then ++ if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. ++set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_PKG_CONFIG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++fi ++PKG_CONFIG=$ac_cv_path_PKG_CONFIG ++if test -n "$PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 ++$as_echo "$PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++fi ++if test -z "$ac_cv_path_PKG_CONFIG"; then ++ ac_pt_PKG_CONFIG=$PKG_CONFIG ++ # Extract the first word of "pkg-config", so it can be a program name with args. ++set dummy pkg-config; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $ac_pt_PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++fi ++ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG ++if test -n "$ac_pt_PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 ++$as_echo "$ac_pt_PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ if test "x$ac_pt_PKG_CONFIG" = x; then ++ PKG_CONFIG="" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++ac_tool_warned=yes ;; ++esac ++ PKG_CONFIG=$ac_pt_PKG_CONFIG ++ fi ++else ++ PKG_CONFIG="$ac_cv_path_PKG_CONFIG" ++fi ++ ++fi ++if test -n "$PKG_CONFIG"; then ++ _pkg_min_version=0.9.0 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 ++$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } ++ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ PKG_CONFIG="" ++ fi ++fi ++ ++pkg_failed=no ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NSL" >&5 ++$as_echo_n "checking for NSL... " >&6; } ++ ++if test -n "$NSL_CFLAGS"; then ++ pkg_cv_NSL_CFLAGS="$NSL_CFLAGS" ++ elif test -n "$PKG_CONFIG"; then ++ if test -n "$PKG_CONFIG" && \ ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; then ++ pkg_cv_NSL_CFLAGS=`$PKG_CONFIG --cflags "libnsl" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ++else ++ pkg_failed=yes ++fi ++ else ++ pkg_failed=untried ++fi ++if test -n "$NSL_LIBS"; then ++ pkg_cv_NSL_LIBS="$NSL_LIBS" ++ elif test -n "$PKG_CONFIG"; then ++ if test -n "$PKG_CONFIG" && \ ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; then ++ pkg_cv_NSL_LIBS=`$PKG_CONFIG --libs "libnsl" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ++else ++ pkg_failed=yes ++fi ++ else ++ pkg_failed=untried ++fi ++ ++ ++ ++if test $pkg_failed = yes; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ ++if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then ++ _pkg_short_errors_supported=yes ++else ++ _pkg_short_errors_supported=no ++fi ++ if test $_pkg_short_errors_supported = yes; then ++ NSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libnsl" 2>&1` ++ else ++ NSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libnsl" 2>&1` ++ fi ++ # Put the nasty error message in config.log where it belongs ++ echo "$NSL_PKG_ERRORS" >&5 ++ ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5 + $as_echo_n "checking for yp_match in -lnsl... " >&6; } + if ${ac_cv_lib_nsl_yp_match+:} false; then : +@@ -4540,10 +4722,66 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5 + $as_echo "$ac_cv_lib_nsl_yp_match" >&6; } + if test "x$ac_cv_lib_nsl_yp_match" = xyes; then : +- LIBNSL="-lnsl" ++ NSL_LIBS="-lnsl" + fi + + ++NSL_CFLAGS="" ++ ++elif test $pkg_failed = untried; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5 ++$as_echo_n "checking for yp_match in -lnsl... " >&6; } ++if ${ac_cv_lib_nsl_yp_match+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lnsl $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char yp_match (); ++int ++main () ++{ ++return yp_match (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_lib_nsl_yp_match=yes ++else ++ ac_cv_lib_nsl_yp_match=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5 ++$as_echo "$ac_cv_lib_nsl_yp_match" >&6; } ++if test "x$ac_cv_lib_nsl_yp_match" = xyes; then : ++ NSL_LIBS="-lnsl" ++fi ++ ++ ++NSL_CFLAGS="" ++ ++else ++ NSL_CFLAGS=$pkg_cv_NSL_CFLAGS ++ NSL_LIBS=$pkg_cv_NSL_LIBS ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query in -lresolv" >&5 + $as_echo_n "checking for res_query in -lresolv... " >&6; } +@@ -4659,8 +4897,6 @@ fi + + LDFLAGS="${AF_tmp_ldflags}" + +-# NIS+ support? +-HAVE_NISPLUS=0 + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -5058,15 +5294,11 @@ fi + done + + +-ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default" +-if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then : +- HAVE_NISPLUS=1 +-fi +- + ++# save current CFLAGS ++af_check_ypclnt_header_save_cflags="$CFLAGS" ++CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS" + +- +-# YellowPages support? + HAVE_YPCLNT=0 + ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/ypclnt.h" "ac_cv_header_rpcsvc_ypclnt_h" "$ac_includes_default" + if test "x$ac_cv_header_rpcsvc_ypclnt_h" = xyes; then : +@@ -5081,6 +5313,32 @@ $as_echo "#define HAVE_YPCLNT 1" >>confdefs.h + + fi + ++# restore libs ++CFLAGS="$af_check_ypclnt_header_save_cflags" ++ ++ ++# save current CFLAGS ++af_check_nis_header_save_cflags="$CFLAGS" ++CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS" ++ ++HAVE_NISPLUS=0 ++ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default" ++if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then : ++ HAVE_NISPLUS=1 ++fi ++ ++ ++ ++if test "$HAVE_NISPLUS" = "1"; then ++ ++$as_echo "#define HAVE_NISPLUS 1" >>confdefs.h ++ ++fi ++ ++# restore libs ++CFLAGS="$af_check_nis_header_save_cflags" ++ ++ + # + # OpenLDAP support? Expect that this may have a special directory... + # +diff --git a/configure.in b/configure.in +index d3660923..d74775cc 100644 +--- a/configure.in ++++ b/configure.in +@@ -209,11 +209,13 @@ fi + AC_CHECK_LIB(rt, clock_gettime, LIBCLOCK_GETTIME="-lrt") + AC_SUBST(LIBCLOCK_GETTIME) + +-# +-# glibc/libc 6 new libraries +-# +-AC_CHECK_LIB(nsl, yp_match, LIBNSL="-lnsl") +-AC_SUBST(LIBNSL) ++PKG_PROG_PKG_CONFIG() ++PKG_CHECK_MODULES([NSL],[libnsl],, ++[ ++AC_CHECK_LIB(nsl, yp_match, NSL_LIBS="-lnsl") ++AC_SUBST(NSL_LIBS) ++NSL_CFLAGS="" ++]) + + AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv") + AC_SUBST(LIBRESOLV) +@@ -254,19 +256,8 @@ AC_SUBST(LIBHESIOD) + AC_SUBST(HESIOD_FLAGS) + LDFLAGS="${AF_tmp_ldflags}" + +-# NIS+ support? +-HAVE_NISPLUS=0 +-AC_CHECK_HEADER(rpcsvc/nis.h, HAVE_NISPLUS=1) +-AC_SUBST(HAVE_NISPLUS) +- +-# YellowPages support? +-HAVE_YPCLNT=0 +-AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1) +-AC_SUBST(HAVE_YPCLNT) +-if test "$HAVE_YPCLNT" = "1"; then +- AC_DEFINE(HAVE_YPCLNT, 1, +- [Define if using YellowPages]) +-fi ++AF_CHECK_YPCLNT_HEADER() ++AF_CHECK_NIS_HEADER() + + # + # OpenLDAP support? Expect that this may have a special directory... +diff --git a/include/config.h.in b/include/config.h.in +index 04873e8f..991a2bda 100644 +--- a/include/config.h.in ++++ b/include/config.h.in +@@ -57,6 +57,9 @@ + /* define if you have MOUNT_NFS */ + #undef HAVE_MOUNT_NFS + ++/* Define if using NIS+ */ ++#undef HAVE_NISPLUS ++ + /* define if the umount command supports the -c option */ + #undef HAVE_NO_CANON_UMOUNT + +diff --git a/modules/Makefile b/modules/Makefile +index d9ab06c5..0447559a 100644 +--- a/modules/Makefile ++++ b/modules/Makefile +@@ -116,6 +116,16 @@ parse_amd.so: parse_amd.c amd_parse.tab.o amd_tok.o + # + # Ad hoc compilation rules for modules which need auxilliary libraries + # ++lookup_yp.so: lookup_yp.c ++ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_yp.so \ ++ lookup_yp.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB) ++ $(STRIP) lookup_yp.so ++ ++lookup_nisplus.so: lookup_nisplus.c ++ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_nisplus.so \ ++ lookup_nisplus.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB) ++ $(STRIP) lookup_nisplus.so ++ + lookup_hesiod.so: lookup_hesiod.c + $(CC) $(SOLDFLAGS) $(CFLAGS) $(HESIOD_FLAGS) -o lookup_hesiod.so \ + lookup_hesiod.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBHESIOD) $(LIBRESOLV) $(LIBS) diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch new file mode 100644 index 00000000..ff3f5cc6 --- /dev/null +++ b/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 + +Add an example of using the fedfs program map (to facilitate access +to fedfs domain mounts) to the installed master map. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + samples/auto.master | 6 ++++++ + 2 files changed, 7 insertions(+) + +diff --git a/CHANGELOG b/CHANGELOG +index bbe8019e..f771a433 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -18,6 +18,7 @@ xx/xx/2018 autofs-5.1.5 + - add mount.fedfs.c. + - add fedfs-map-nfs4.c. + - add conditional inclusion of fedfs binaries. ++- add an example fedfs master map entry to the installed master map. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/samples/auto.master b/samples/auto.master +index 0f2c8ab0..9a9968a3 100644 +--- a/samples/auto.master ++++ b/samples/auto.master +@@ -17,6 +17,12 @@ + # + +dir:/etc/auto.master.d + # ++# If you have fedfs set up and the related binaries, either ++# built as part of autofs or installed from another package, ++# uncomment this line to use the fedfs program map to access ++# your fedfs mounts. ++#/nfs4 /usr/sbin/fedfs-map-nfs4 nobind ++# + # Include central master map if it can be found using + # nsswitch sources. + # diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch new file mode 100644 index 00000000..536165e8 --- /dev/null +++ b/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 + +Add conditional inclusion of the fedfs binaries. + +Using configure a --with-fedfs is needed to build and install +the fedfs binaries. + +Using rpmbuild -tb it's necessary to add the option +--without fedfs to exclude the fedfs binaries from the resulting +rpm package. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + Makefile.conf.in | 2 ++ + Makefile.rules | 6 +++++- + autofs.spec | 12 +++++++++++- + configure | 16 ++++++++++++++++ + configure.in | 9 +++++++++ + 6 files changed, 44 insertions(+), 2 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 412e3382..bbe8019e 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -17,6 +17,7 @@ xx/xx/2018 autofs-5.1.5 + - add fedfs-getsrvinfo.c. + - add mount.fedfs.c. + - add fedfs-map-nfs4.c. ++- add conditional inclusion of fedfs binaries. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/Makefile.conf.in b/Makefile.conf.in +index 85662654..3fe1a0a0 100644 +--- a/Makefile.conf.in ++++ b/Makefile.conf.in +@@ -58,6 +58,8 @@ EXT3FS = @HAVE_E3FSCK@ + # Support for calling e4fsck when mounting ext4 filesystems + EXT4FS = @HAVE_E4FSCK@ + ++FEDFS = @ENABLE_FEDFS@ ++ + LEX = @PATH_LEX@ + YACC = @PATH_YACC@ + RPCGEN = @PATH_RPCGEN@ +diff --git a/Makefile.rules b/Makefile.rules +index fc9f6019..2ccb1f6e 100644 +--- a/Makefile.rules ++++ b/Makefile.rules +@@ -3,12 +3,16 @@ + # + + # Root directory contents +-SUBDIRS = lib daemon fedfs modules man ++SUBDIRS = lib daemon modules man + INCDIRS = include + INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \ + Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \ + configure *.patch autofs.spec + ++ifeq ($(FEDFS), 1) ++ SUBDIRS += fedfs ++endif ++ + # Attempt to be friends with autotools + INSTALLROOT = $(DESTDIR) + +diff --git a/autofs.spec b/autofs.spec +index 157c09b4..2cb09ef0 100644 +--- a/autofs.spec ++++ b/autofs.spec +@@ -16,6 +16,10 @@ + # disable them. + %define with_libtirpc %{?_without_libtirpc: 0} %{?!_without_libtirpc: 1} + ++# Use --without fedfs in your rpmbuild command or force values to 0 to ++# disable them. ++%define with_fedfs %{?_without_fedfs: 0} %{?!_without_fedfs: 1} ++ + Summary: A tool from automatically mounting and umounting filesystems. + Name: autofs + %define version 5.1.4 +@@ -82,6 +86,9 @@ echo %{version}-%{release} > .version + %if %{with_libtirpc} + %define libtirpc_configure_arg --with-libtirpc + %endif ++%if %{with_fedfs} ++ %define fedfs_configure_arg --enable-fedfs ++%endif + + %build + CFLAGS="$RPM_OPT_FLAGS -Wall" \ +@@ -90,7 +97,8 @@ LDFLAGS="-Wl,-z,now" \ + --disable-mount-locking \ + --enable-ignore-busy \ + %{?systemd_configure_arg:} \ +- %{?libtirpc_configure_arg:} ++ %{?libtirpc_configure_arg:} \ ++ %{?fedfs_configure_arg:} + CFLAGS="$RPM_OPT_FLAGS -Wall" LDFLAGS="-Wl,-z,now" make initdir=/etc/rc.d/init.d DONTSTRIP=1 + + %install +@@ -191,8 +199,10 @@ fi + %config(noreplace) /etc/sysconfig/autofs + %config(noreplace) /etc/autofs_ldap_auth.conf + %{_sbindir}/automount ++%if %{with_fedfs} + %{_sbindir}/mount.fedfs + %{_sbindir}/fedfs-map-nfs4 ++%endif + %dir %{_libdir}/autofs + %{_libdir}/autofs/* + %{_mandir}/*/* +diff --git a/configure b/configure +index 5c8aae30..9682b36f 100755 +--- a/configure ++++ b/configure +@@ -648,6 +648,7 @@ NSL_CFLAGS + LIBCLOCK_GETTIME + KRB5_CONFIG + XML_CONFIG ++ENABLE_FEDFS + sssldir + HAVE_SSS_AUTOFS + PATH_RPCGEN +@@ -743,6 +744,7 @@ with_libtirpc + with_dmalloc + enable_sloppy_mount + enable_no_canon_umount ++enable_fedfs + with_hesiod + with_openldap + with_sasl +@@ -1377,6 +1379,7 @@ Optional Features: + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-sloppy-mount enable the use of the -s option to mount + --enable-no-canon-umount enable the use of the -c option to umount ++ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4 + --disable-ext-env disable search in environment for substitution variable + --disable-mount-locking disable use of locking when spawning mount command + --enable-force-shutdown enable USR1 signal to force unlink umount of any +@@ -4246,6 +4249,19 @@ $as_echo "#define HAVE_NO_CANON_UMOUNT 1" >>confdefs.h + + fi + ++ENABLE_FEDFS="" ++# Check whether --enable-fedfs was given. ++if test "${enable_fedfs+set}" = set; then : ++ enableval=$enable_fedfs; ++else ++ enable_fedfs=no ++fi ++ ++if test x$enable_fedfs = xyes; then ++ ENABLE_FEDFS="1" ++fi ++ ++ + # LDAP SASL auth needs libxml and Kerberos + for ac_prog in xml2-config + do +diff --git a/configure.in b/configure.in +index 4d1208f5..de06a96d 100644 +--- a/configure.in ++++ b/configure.in +@@ -195,6 +195,15 @@ if test x$enable_no_canon_umount = xyes; then + AC_DEFINE(HAVE_NO_CANON_UMOUNT, 1, [define if the umount command supports the -c option]) + fi + ++ENABLE_FEDFS="" ++AC_ARG_ENABLE(fedfs, ++[ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4],, ++ enable_fedfs=no) ++if test x$enable_fedfs = xyes; then ++ ENABLE_FEDFS="1" ++fi ++AC_SUBST(ENABLE_FEDFS) ++ + # LDAP SASL auth needs libxml and Kerberos + AF_CHECK_LIBXML() + AF_CHECK_KRB5() diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-error-handling-for-ext_mount_add.patch new file mode 100644 index 00000000..814ae30f --- /dev/null +++ b/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 + +Add error handling (memory allocation failures) for ext_mount_add(). + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + lib/mounts.c | 5 +---- + modules/parse_amd.c | 42 ++++++++++++++++++++++++++++++------------ + 3 files changed, 32 insertions(+), 16 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index d0cfa19b..9d19c0a7 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -7,6 +7,7 @@ xx/xx/2018 autofs-5.1.5 + - fix prefix option handling in expand_entry(). + - fix sublink option not set from defaults. + - fix error return in do_nfs_mount(). ++- add error handling for ext_mount_add(). + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/lib/mounts.c b/lib/mounts.c +index 6fa304aa..f46fab2b 100644 +--- a/lib/mounts.c ++++ b/lib/mounts.c +@@ -715,15 +715,12 @@ int ext_mount_add(struct list_head *entry, const char *path, unsigned int umount + } + + em = malloc(sizeof(struct ext_mount)); +- if (!em) { +- ret = -1; ++ if (!em) + goto done; +- } + + em->mountpoint = strdup(path); + if (!em->mountpoint) { + free(em); +- ret = -1; + goto done; + } + em->umount = umount; +diff --git a/modules/parse_amd.c b/modules/parse_amd.c +index 2a5d9a30..e7debc56 100644 +--- a/modules/parse_amd.c ++++ b/modules/parse_amd.c +@@ -1080,7 +1080,14 @@ static int do_generic_mount(struct autofs_point *ap, const char *name, + umount = 1; + } + /* We have an external mount */ +- ext_mount_add(&entry->ext_mount, entry->fs, umount); ++ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) { ++ umount_ent(ap, entry->fs); ++ error(ap->logopt, MODPREFIX ++ "error: could not add external mount %s", ++ entry->fs); ++ ret = 1; ++ goto out; ++ } + ret = do_link_mount(ap, name, entry, flags); + } + out: +@@ -1124,7 +1131,13 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name, + umount = 1; + } + /* We might be using an external mount */ +- ext_mount_add(&entry->ext_mount, entry->fs, umount); ++ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) { ++ umount_ent(ap, entry->fs); ++ error(ap->logopt, MODPREFIX ++ "error: could not add external mount %s", entry->fs); ++ ret = 1; ++ goto out; ++ } + ret = do_link_mount(ap, name, entry, flags); + } + out: +@@ -1309,6 +1322,9 @@ static int do_program_mount(struct autofs_point *ap, + */ + if (ext_mount_inuse(entry->fs)) { + rv = 0; ++ /* An external mount with path entry->fs exists ++ * so ext_mount_add() won't fail. ++ */ + ext_mount_add(&entry->ext_mount, entry->fs, 1); + } else { + rv = mkdir_path(entry->fs, mp_mode); +@@ -1325,17 +1341,19 @@ static int do_program_mount(struct autofs_point *ap, + + rv = spawnv(ap->logopt, prog, (const char * const *) argv); + if (WIFEXITED(rv) && !WEXITSTATUS(rv)) { +- rv = 0; +- ext_mount_add(&entry->ext_mount, entry->fs, 1); +- debug(ap->logopt, MODPREFIX +- "%s: mounted %s", entry->type, entry->fs); +- } else { +- if (!ext_mount_inuse(entry->fs)) +- rmdir_path(ap, entry->fs, ap->dev); +- error(ap->logopt, MODPREFIX +- "%s: failed to mount using: %s", +- entry->type, entry->mount); ++ if (ext_mount_add(&entry->ext_mount, entry->fs, 1)) { ++ rv = 0; ++ debug(ap->logopt, MODPREFIX ++ "%s: mounted %s", entry->type, entry->fs); ++ goto do_free; ++ } ++ umount_ent(ap, entry->fs); + } ++ ++ if (!ext_mount_inuse(entry->fs)) ++ rmdir_path(ap, entry->fs, ap->dev); ++ error(ap->logopt, MODPREFIX ++ "%s: failed to mount using %s", entry->type, entry->mount); + } + do_free: + free_argv(argc, (const char **) argv); diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-getsrvinfo_c.patch new file mode 100644 index 00000000..68633045 --- /dev/null +++ b/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 + +Add the fedfs domain information discovery library functions. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + fedfs/fedfs-getsrvinfo.c | 311 ++++++++++++++++++++++++++++++++++++++++++++++ + fedfs/fedfs-getsrvinfo.h | 52 ++++++++ + 3 files changed, 364 insertions(+) + create mode 100644 fedfs/fedfs-getsrvinfo.c + create mode 100644 fedfs/fedfs-getsrvinfo.h + +diff --git a/CHANGELOG b/CHANGELOG +index dbfb8389..8d6c737c 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -14,6 +14,7 @@ xx/xx/2018 autofs-5.1.5 + - Makefiles.rules: remove 'samples' from SUBDIRS. + - dont allow trailing slash in master map mount points. + - fix libresolv configure check. ++- add fedfs-getsrvinfo.c. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/fedfs/fedfs-getsrvinfo.c b/fedfs/fedfs-getsrvinfo.c +new file mode 100644 +index 00000000..02ad16b5 +--- /dev/null ++++ b/fedfs/fedfs-getsrvinfo.c +@@ -0,0 +1,311 @@ ++/* ++ * Copyright 2011 Oracle. All rights reserved. ++ * ++ * This file is part of fedfs-utils. ++ * ++ * fedfs-utils is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2.0 as ++ * published by the Free Software Foundation. ++ * ++ * fedfs-utils is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License version 2.0 for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * version 2.0 along with fedfs-utils. If not, see: ++ * ++ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "fedfs-getsrvinfo.h" ++ ++/** ++ * Parsing overlay for DNS query result record header. Fields are ++ * in network byte order. ++ */ ++struct rechdr { ++ uint16_t type; ++ uint16_t class; ++ uint32_t ttl; ++ uint16_t length; ++} __attribute__((__packed__)); ++ ++/** ++ * Parsing overlay for DNS query result SRV record data. Fields ++ * are in network byte order. ++ */ ++struct srv { ++ uint16_t priority; ++ uint16_t weight; ++ uint16_t port; ++ unsigned char *target; ++} __attribute__((__packed__)); ++ ++/** ++ * Return C string matching error value of "status" ++ * ++ * @param status error status returned by getsrvinfo ++ * @return pointer to static NUL-terminated C string containing error message ++ */ ++const char * ++gsi_strerror(int status) ++{ ++ static char buf[256]; ++ ++ switch (status) { ++ case ESI_SUCCESS: ++ return "Success"; ++ case ESI_NONAME: ++ return "Name not found"; ++ case ESI_AGAIN: ++ return "Temporary failure in name resolution"; ++ case ESI_FAIL: ++ return "Non-recoverable failure in name resolution"; ++ case ESI_NODATA: ++ return "No SRV record returned"; ++ case ESI_SERVICE: ++ return "Service is not available"; ++ case ESI_MEMORY: ++ return "Memory allocation failure"; ++ case ESI_SYSTEM: ++ snprintf(buf, sizeof(buf), "System error (%d): %s", ++ status, strerror(errno)); ++ return buf; ++ case ESI_PARSE: ++ return "Failed to parse server response"; ++ } ++ ++ snprintf(buf, sizeof(buf), "Unknown error (%d)", status); ++ return buf; ++} ++ ++/** ++ * Release a list of SRV records allocated by getsrvinfo() ++ * ++ * @param si pointer to first element of a list of struct srvinfo ++ * ++ */ ++void freesrvinfo(struct srvinfo *si) ++{ ++ struct srvinfo *tmp; ++ ++ while (si != NULL) { ++ tmp = si; ++ si = si->si_next; ++ free(tmp->si_target); ++ free(tmp); ++ } ++} ++ ++/** ++ * Ordering predicate for srvinfo lists ++ * ++ * @param a a srvinfo list element to compare ++ * @param b another srvinfo list element to compare ++ * @return true if "b" should fall later in the list than "a" ++ * ++ * See RFC 2782. The list is ordered as follows: ++ * ++ * o Lowest priority first. ++ * o In each priority class, highest weight first. ++ */ ++static _Bool ++srvinfo_is_after(const struct srvinfo *a, const struct srvinfo *b) ++{ ++ if (a->si_priority > b->si_priority) ++ return true; ++ if (a->si_priority < b->si_priority) ++ return false; ++ ++ if (a->si_weight < b->si_weight) ++ return true; ++ return false; ++} ++ ++/** ++ * Insert a srvinfo element into a list ++ * ++ * @param head pointer to head of list of elements ++ * @param entry new list element to insert ++ * ++ */ ++static void ++insert_srvinfo(struct srvinfo **head, struct srvinfo *entry) ++{ ++ entry->si_next = *head; ++ *head = entry; ++} ++ ++/** ++ * Insert a srvinfo element into a list, in order ++ * ++ * @param head pointer to head of list of elements ++ * @param entry new list element to insert ++ * ++ */ ++static void ++insert_srvinfo_sorted(struct srvinfo **head, struct srvinfo *entry) ++{ ++ struct srvinfo *spot, *back; ++ ++ spot = *head; ++ back = NULL; ++ while (spot && srvinfo_is_after(spot, entry)) { ++ back = spot; ++ spot = spot->si_next; ++ } ++ ++ if (spot == (*head)) ++ insert_srvinfo(head, entry); ++ else { ++ insert_srvinfo(&spot, entry); ++ /* off the end of the list? */ ++ if (spot == entry) ++ back->si_next = entry; ++ } ++} ++ ++/** ++ * Retrieve list of SRV records from DNS service ++ * ++ * @param srvname NUL-terminated C string containing record type to look up ++ * @param domainname NUL-terminated C string containing domain name to look up ++ * @param si OUT: list of SRV record information retrieved ++ * @return zero on success, or an ESI_ status code describing the error ++ * ++ * Caller must free list of records using freesrvinfo(). ++ */ ++int ++getsrvinfo(const char *srvname, const char *domainname, struct srvinfo **si) ++{ ++ unsigned char *msg, *eom, *comp_dn; ++ struct srvinfo *results; ++ unsigned short count, i; ++ int status, len; ++ char *exp_dn; ++ HEADER *hdr; ++ ++ msg = calloc(1, NS_MAXMSG); ++ exp_dn = calloc(1, NS_MAXDNAME); ++ if (msg == NULL || exp_dn == NULL) { ++ status = ESI_MEMORY; ++ goto out; ++ } ++ ++ _res.options |= RES_AAONLY; ++ len = res_querydomain(srvname, domainname, C_IN, T_SRV, msg, NS_MAXMSG); ++ if (len == -1) { ++ switch (h_errno) { ++ case HOST_NOT_FOUND: ++ status = ESI_NONAME; ++ break; ++ case TRY_AGAIN: ++ status = ESI_AGAIN; ++ break; ++ case NO_RECOVERY: ++ status = ESI_FAIL; ++ break; ++ case NO_DATA: ++ status = ESI_NODATA; ++ break; ++ default: ++ fprintf(stderr, "SRV query failed for %s.%s: %s\n", ++ srvname, domainname, hstrerror(h_errno)); ++ status = ESI_FAIL; ++ } ++ goto out; ++ } ++ ++ hdr = (HEADER *)msg; ++ count = ntohs(hdr->ancount); ++ if (count == 0) { ++ status = ESI_NODATA; ++ goto out; ++ } ++ eom = msg + len; ++ ++ comp_dn = &msg[HFIXEDSZ]; ++ comp_dn += dn_skipname(comp_dn, eom) + QFIXEDSZ; ++ ++ results = NULL; ++ for (i = 0; i < count; i++) { ++ struct srvinfo *new; ++ struct srv *record; ++ int l; ++ ++ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME); ++ if (l == -1) { ++ status = ESI_PARSE; ++ goto out_free; ++ } ++ comp_dn += l; ++ ++ record = (struct srv *)&comp_dn[10]; ++ comp_dn += 16; ++ ++ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME); ++ if (l == -1) { ++ status = ESI_PARSE; ++ goto out_free; ++ } ++ comp_dn += l; ++ ++ if (count == 1 && strcmp(exp_dn, ".") == 0) { ++ status = ESI_SERVICE; ++ goto out_free; ++ } ++ ++ new = calloc(1, sizeof(*new)); ++ if (new == NULL) { ++ status = ESI_MEMORY; ++ goto out; ++ } ++ ++ new->si_target = strdup(exp_dn); ++ if (new->si_target == NULL) { ++ free(new); ++ status = ESI_MEMORY; ++ goto out; ++ } ++ new->si_priority = ntohs(record->priority); ++ new->si_weight = ntohs(record->weight); ++ new->si_port = ntohs(record->port); ++ ++ insert_srvinfo_sorted(&results, new); ++ } ++ ++ status = ESI_SUCCESS; ++ *si = results; ++ ++out: ++ free(exp_dn); ++ free(msg); ++ return status; ++ ++out_free: ++ freesrvinfo(results); ++ goto out; ++} +diff --git a/fedfs/fedfs-getsrvinfo.h b/fedfs/fedfs-getsrvinfo.h +new file mode 100644 +index 00000000..13170359 +--- /dev/null ++++ b/fedfs/fedfs-getsrvinfo.h +@@ -0,0 +1,52 @@ ++/* ++ * Copyright 2011 Oracle. All rights reserved. ++ * ++ * This file is part of fedfs-utils. ++ * ++ * fedfs-utils is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2.0 as ++ * published by the Free Software Foundation. ++ * ++ * fedfs-utils is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License version 2.0 for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * version 2.0 along with fedfs-utils. If not, see: ++ * ++ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt ++ */ ++ ++#ifndef _FEDFS_GETSRVINFO_H_ ++#define _FEDFS_GETSRVINFO_H_ ++ ++/** ++ * Single list element containing SRV record data ++ */ ++struct srvinfo { ++ struct srvinfo *si_next; ++ char *si_target; ++ unsigned short si_priority; ++ unsigned short si_weight; ++ unsigned short si_port; ++}; ++ ++enum { ++ ESI_SUCCESS = 0, ++ ESI_NONAME = -2, ++ ESI_AGAIN = -3, ++ ESI_FAIL = -4, ++ ESI_NODATA = -5, ++ ESI_SERVICE = -8, ++ ESI_MEMORY = -10, ++ ESI_SYSTEM = -11, ++ ESI_PARSE = -1000, ++}; ++ ++int getsrvinfo(const char *srvname, const char *domainname, ++ struct srvinfo **si); ++void freesrvinfo(struct srvinfo *si); ++const char *gsi_strerror(int status); ++ ++#endif /* !_FEDFS_GETSRVINFO_H_ */ diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-map-nfs4_c.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-fedfs-map-nfs4_c.patch new file mode 100644 index 00000000..1563f68e --- /dev/null +++ b/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 + +Add build (and install) of the fedfs program map, fedfs-map-nfs4. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + autofs.spec | 1 + fedfs/Makefile | 12 ++- + fedfs/fedfs-map-nfs4.c | 204 ++++++++++++++++++++++++++++++++++++++++++++++++ + fedfs/fedfs-token.h | 40 +++++++++ + 5 files changed, 256 insertions(+), 2 deletions(-) + create mode 100644 fedfs/fedfs-map-nfs4.c + create mode 100644 fedfs/fedfs-token.h + +diff --git a/CHANGELOG b/CHANGELOG +index 88992147..412e3382 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -16,6 +16,7 @@ xx/xx/2018 autofs-5.1.5 + - fix libresolv configure check. + - add fedfs-getsrvinfo.c. + - add mount.fedfs.c. ++- add fedfs-map-nfs4.c. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/autofs.spec b/autofs.spec +index 2cc0e38f..157c09b4 100644 +--- a/autofs.spec ++++ b/autofs.spec +@@ -192,6 +192,7 @@ fi + %config(noreplace) /etc/autofs_ldap_auth.conf + %{_sbindir}/automount + %{_sbindir}/mount.fedfs ++%{_sbindir}/fedfs-map-nfs4 + %dir %{_libdir}/autofs + %{_libdir}/autofs/* + %{_mandir}/*/* +diff --git a/fedfs/Makefile b/fedfs/Makefile +index cb325bed..dff749e4 100644 +--- a/fedfs/Makefile ++++ b/fedfs/Makefile +@@ -6,11 +6,13 @@ + include ../Makefile.rules + + SRCS = mount.fedfs.c +-HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h ++HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h \ ++ fedfs-token.h + + fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o + + mount_fedfs_OBJ = mount.fedfs.o ++fedfs-map-nfs4_OBJ = fedfs-map-nfs4.o + + version := $(shell cat ../.version) + +@@ -18,18 +20,24 @@ CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include + CFLAGS += -DVERSION_STRING=\"$(version)\" + LDFLAGS += -rdynamic + +-all: mount.fedfs ++all: mount.fedfs fedfs-map-nfs4 + + mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS) + $(CC) -o mount.fedfs \ + $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \ + $(LDFLAGS) $(LIBRESOLV) $(LIBS) + ++fedfs-map-nfs4: $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS) ++ $(CC) -o fedfs-map-nfs4 \ ++ $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) \ ++ $(LDFLAGS) $(LIBRESOLV) $(LIBS) ++ + clean: + rm -f *.o *.s *~ mount.fedfs + + install: all + install -d -m 755 $(INSTALLROOT)$(sbindir) ++ install -c fedfs-map-nfs4 -m 755 $(INSTALLROOT)$(sbindir); \ + if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \ + then \ + install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \ +diff --git a/fedfs/fedfs-map-nfs4.c b/fedfs/fedfs-map-nfs4.c +new file mode 100644 +index 00000000..9f831cd7 +--- /dev/null ++++ b/fedfs/fedfs-map-nfs4.c +@@ -0,0 +1,204 @@ ++/* ++ * Copyright 2011 Oracle. All rights reserved. ++ * ++ * This file is part of fedfs-utils. ++ * ++ * fedfs-utils is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2.0 as ++ * published by the Free Software Foundation. ++ * ++ * fedfs-utils is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License version 2.0 for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * version 2.0 along with fedfs-utils. If not, see: ++ * ++ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt ++ */ ++ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "fedfs-nls.h" ++#include "fedfs-token.h" ++#include "fedfs-getsrvinfo.h" ++#include "fedfs-gpl-boiler.h" ++ ++/** ++ * Name of SRV record containing NFSv4 FedFS root ++ */ ++#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp" ++ ++/** ++ * Export pathname of NFSv4 FedFS root ++ */ ++#define FEDFS_NFS_EXPORTPATH "/.domainroot" ++ ++static char *progname; ++ ++/** ++ * Display usage message ++ */ ++static void ++fedfs_map_usage(void) ++{ ++ printf(_("\nUsage: %s [domain]\n\n"), progname); ++ ++ printf("%s", fedfs_gpl_boilerplate); ++} ++ ++/** ++ * Construct an NFSv4 map entry for "domainname" with one server ++ * ++ * @param si single-entry list of SRV records ++ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain ++ * @return command exit status ++ */ ++static int fedfs_map_nfs4_oneserver(struct srvinfo *si, const char *domainname) ++{ ++ printf("-fstype=nfs,vers=4,fg"); ++ if (si->si_port != 2049) ++ printf(",port=%u", si->si_port); ++ printf(" %s:%s/%s\n", si->si_target, FEDFS_NFS_EXPORTPATH, domainname); ++ return 0; ++} ++ ++/** ++ * Construct an NFSv4 map entry for "domainname" with multiple servers ++ * ++ * @param si list of SRV records for requested FedFS domain ++ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain ++ * @return command exit status ++ */ ++static int fedfs_map_nfs4_replicas(struct srvinfo *si, const char *domainname) ++{ ++ struct srvinfo *cur; ++ unsigned short port; ++ _Bool comma; ++ ++ /* ++ * Unfortunately our automounter can't handle a list of ++ * replicas where the various servers live on different ++ * ports from one another. ++ */ ++ port = si->si_port; ++ for (cur = si; cur != NULL; cur = cur->si_next) ++ if (cur->si_port != port) { ++ fprintf(stderr, _("%s: Replicas on different ports not supported\n"), ++ progname); ++ return 1; ++ } ++ ++ if (port != 2049) ++ printf("-fstype=nfs,vers=4,fg,port=%u ", port); ++ else ++ printf("-fstype=nfs,vers=4,fg "); ++ ++ /* ++ * Note that the export path is required to be indentical ++ * for all domain root servers for this domain. ++ */ ++ for (comma = false, cur = si; cur != NULL; cur = cur->si_next) { ++ if (comma) ++ printf(","); ++ printf("%s(%u)", cur->si_target, cur->si_weight); ++ comma = true; ++ } ++ printf(":%s/%s\n", FEDFS_NFS_EXPORTPATH, domainname); ++ ++ return 0; ++} ++ ++/** ++ * Construct an NFSv4 map entry for "domainname" ++ * ++ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain ++ * @return command exit status ++ */ ++static int fedfs_map_nfs4(const char *domainname) ++{ ++ struct srvinfo *cur, *si = NULL; ++ unsigned int count; ++ int error, result; ++ ++ result = 1; ++ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si); ++ switch (error) { ++ case ESI_SUCCESS: ++ break; ++ case ESI_NONAME: ++ fprintf(stderr, _("%s: Domain name %s not found\n"), ++ progname, domainname); ++ goto out; ++ case ESI_SERVICE: ++ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"), ++ progname, domainname); ++ goto out; ++ default: ++ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"), ++ progname, domainname, gsi_strerror(error)); ++ goto out; ++ } ++ ++ for (count = 0, cur = si; cur != NULL; cur = cur->si_next) ++ count++; ++ if (count == 1) ++ result = fedfs_map_nfs4_oneserver(si, domainname); ++ else ++ result = fedfs_map_nfs4_replicas(si, domainname); ++ ++out: ++ freesrvinfo(si); ++ return result; ++} ++ ++/** ++ * Program entry point ++ * ++ * @param argc count of command line arguments ++ * @param argv array of NUL-terminated C strings containing command line arguments ++ * @return program exit status ++ */ ++int main(int argc, char *argv[]) ++{ ++ (void)setlocale(LC_ALL, ""); ++ ++ progname = basename(argv[0]); ++ ++ if (argc != 2) { ++ fedfs_map_usage(); ++ return 1; ++ } ++ ++ if (strcmp(progname, "fedfs-map-nfs4") == 0) ++ return fedfs_map_nfs4(argv[1]); ++#ifdef EXAMPLE ++ /* CIFS support might plug in here */ ++ else if (strcmp(progname, "fedfs-map-cifs") == 0) ++ return fedfs_map_cifs(argv[1]); ++#endif ++ ++ fprintf(stderr, _("%s: Unsupported file system type\n"), progname); ++ return 1; ++} +diff --git a/fedfs/fedfs-token.h b/fedfs/fedfs-token.h +new file mode 100644 +index 00000000..5651409d +--- /dev/null ++++ b/fedfs/fedfs-token.h +@@ -0,0 +1,40 @@ ++/* ++ * Copyright (C) 2007 Oracle. All rights reserved. ++ * Copyright (C) 2007 Chuck Lever ++ * ++ * This file is part of fedfs-utils. ++ * ++ * fedfs-utils is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2.0 as ++ * published by the Free Software Foundation. ++ * ++ * fedfs-utils is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License version 2.0 for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * version 2.0 along with fedfs-utils. If not, see: ++ * ++ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt ++ */ ++ ++#ifndef _FEDFS_UTILS_TOKEN_H ++#define _FEDFS_UTILS_TOKEN_H ++ ++#include ++ ++/** ++ * Private tokenizer state object ++ */ ++struct tokenizer; ++ ++__attribute_malloc__ ++struct tokenizer *tk_new_tokenizer(const char *string, ++ const char delimiter); ++__attribute_malloc__ ++char *tk_next_token(struct tokenizer *state); ++void tk_free_tokenizer(struct tokenizer *state); ++int tk_tokenizer_error(const struct tokenizer *state); ++ ++#endif /* !_FEDFS_UTILS_TOKEN_H */ diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch new file mode 100644 index 00000000..a7607f15 --- /dev/null +++ b/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 + +Make note of the effect unnecessary multiple slashes can have in map +paths in auto.master(5). + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + man/auto.master.5.in | 8 ++++++++ + 2 files changed, 9 insertions(+) + +diff --git a/CHANGELOG b/CHANGELOG +index 92e60df9..14eb1de8 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -26,6 +26,7 @@ xx/xx/2018 autofs-5.1.5 + - use systemd sd_notify() at startup. + - fix NFS version mask usage. + - fix fd leak in rpc_do_create_client(). ++- add-man page note about extra slashes in paths. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/man/auto.master.5.in b/man/auto.master.5.in +index 55a6acd0..e9afb97f 100644 +--- a/man/auto.master.5.in ++++ b/man/auto.master.5.in +@@ -66,6 +66,14 @@ will process the map according to the specification described below for + map entries. Indirect map entries must be unique in the master map so + second and subsequent entries for an indirect mount point are ignored by + .BR automount (8). ++.TP ++.B NOTE: ++autofs currently does not collapse multiple slashes in paths, so it is ++important to ensure paths used in maps are correct. If unnecessary multiple ++slashes are present in a path it can lead to unexpected failures such as ++an inability to expire automounts. An exception to this is a trailing slash ++at the end of the automount point path in the master map which will be ++removed if present. + .SH "FORMAT" + Master map entries have three fields separated by an arbitrary number + of spaces or tabs. Lines beginning with # are comments. The first field diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-mount_fedfs_c.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-mount_fedfs_c.patch new file mode 100644 index 00000000..9bda028a --- /dev/null +++ b/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 + +Add build and install of the mount.fedfs binary. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + Makefile | 3 + Makefile.rules | 2 + autofs.spec | 1 + fedfs/Makefile | 36 +++ + fedfs/fedfs-gpl-boiler.h | 40 ++++ + fedfs/fedfs-nls.h | 38 ++++ + fedfs/mount.fedfs.c | 485 ++++++++++++++++++++++++++++++++++++++++++++++ + 8 files changed, 605 insertions(+), 1 deletion(-) + create mode 100644 fedfs/Makefile + create mode 100644 fedfs/fedfs-gpl-boiler.h + create mode 100644 fedfs/fedfs-nls.h + create mode 100644 fedfs/mount.fedfs.c + +diff --git a/CHANGELOG b/CHANGELOG +index 8d6c737c..88992147 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -15,6 +15,7 @@ xx/xx/2018 autofs-5.1.5 + - dont allow trailing slash in master map mount points. + - fix libresolv configure check. + - add fedfs-getsrvinfo.c. ++- add mount.fedfs.c. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/Makefile b/Makefile +index e560a7cb..99db2c75 100644 +--- a/Makefile ++++ b/Makefile +@@ -19,6 +19,9 @@ kernel: + samples: + set -e; if [ -d samples ]; then $(MAKE) -C samples all; fi + ++fedfs: ++ set -e; if [ -d fedfs ]; then $(MAKE) -C fedfs all; fi ++ + clean: + for i in $(SUBDIRS) samples; do \ + if [ -d $$i ]; then $(MAKE) -C $$i clean; fi; done +diff --git a/Makefile.rules b/Makefile.rules +index 4deab3b9..fc9f6019 100644 +--- a/Makefile.rules ++++ b/Makefile.rules +@@ -3,7 +3,7 @@ + # + + # Root directory contents +-SUBDIRS = lib daemon modules man ++SUBDIRS = lib daemon fedfs modules man + INCDIRS = include + INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \ + Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \ +diff --git a/autofs.spec b/autofs.spec +index 2464e741..2cc0e38f 100644 +--- a/autofs.spec ++++ b/autofs.spec +@@ -191,6 +191,7 @@ fi + %config(noreplace) /etc/sysconfig/autofs + %config(noreplace) /etc/autofs_ldap_auth.conf + %{_sbindir}/automount ++%{_sbindir}/mount.fedfs + %dir %{_libdir}/autofs + %{_libdir}/autofs/* + %{_mandir}/*/* +diff --git a/fedfs/Makefile b/fedfs/Makefile +new file mode 100644 +index 00000000..cb325bed +--- /dev/null ++++ b/fedfs/Makefile +@@ -0,0 +1,36 @@ ++# ++# Makefile for mount.fedfs ++# ++ ++-include ../Makefile.conf ++include ../Makefile.rules ++ ++SRCS = mount.fedfs.c ++HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h ++ ++fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o ++ ++mount_fedfs_OBJ = mount.fedfs.o ++ ++version := $(shell cat ../.version) ++ ++CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include ++CFLAGS += -DVERSION_STRING=\"$(version)\" ++LDFLAGS += -rdynamic ++ ++all: mount.fedfs ++ ++mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS) ++ $(CC) -o mount.fedfs \ ++ $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \ ++ $(LDFLAGS) $(LIBRESOLV) $(LIBS) ++ ++clean: ++ rm -f *.o *.s *~ mount.fedfs ++ ++install: all ++ install -d -m 755 $(INSTALLROOT)$(sbindir) ++ if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \ ++ then \ ++ install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \ ++ fi +diff --git a/fedfs/fedfs-gpl-boiler.h b/fedfs/fedfs-gpl-boiler.h +new file mode 100644 +index 00000000..1353e736 +--- /dev/null ++++ b/fedfs/fedfs-gpl-boiler.h +@@ -0,0 +1,40 @@ ++/* ++ * Copyright 2011 Oracle. All rights reserved. ++ * ++ * This file is part of fedfs-utils. ++ * ++ * fedfs-utils is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2.0 as ++ * published by the Free Software Foundation. ++ * ++ * fedfs-utils is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License version 2.0 for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * version 2.0 along with fedfs-utils. If not, see: ++ * ++ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt ++ */ ++ ++#ifndef _GPL_BOILER_H_ ++#define _GPL_BOILER_H_ ++ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++ ++/** ++ * GPLv2 boilerplate for usage messages ++ */ ++static const char *fedfs_gpl_boilerplate = ++ "\nCopyright 2010, 2011, 2012, 2013 Oracle. " ++ "All rights reserved.\n\n" ++ "License GPLv2: " ++ "\n" ++ "This is free software. " ++ "You are free to change and redistribute it.\n" ++ "There is NO WARRANTY, to the extent permitted by law.\n"; ++ ++#endif /* !_GPL_BOILER_H_ */ +diff --git a/fedfs/fedfs-nls.h b/fedfs/fedfs-nls.h +new file mode 100644 +index 00000000..92f968d3 +--- /dev/null ++++ b/fedfs/fedfs-nls.h +@@ -0,0 +1,38 @@ ++/* ++ * From util-linux/include/nls.h (GPLv2) ++ */ ++ ++#ifndef UTIL_LINUX_NLS_H ++#define UTIL_LINUX_NLS_H ++ ++int main(int argc, char *argv[]); ++ ++#ifndef LOCALEDIR ++#define LOCALEDIR "/usr/share/locale" ++#endif ++ ++#ifdef HAVE_LOCALE_H ++# include ++#else ++# undef setlocale ++# define setlocale(Category, Locale) ({}) /* empty */ ++#endif ++ ++#ifdef ENABLE_NLS ++# include ++# define _(Text) gettext (Text) ++# ifdef gettext_noop ++# define N_(String) gettext_noop (String) ++# else ++# define N_(String) (String) ++# endif ++#else ++# undef bindtextdomain ++# define bindtextdomain(Domain, Directory) /* empty */ ++# undef textdomain ++# define textdomain(Domain) /* empty */ ++# define _(Text) (Text) ++# define N_(Text) (Text) ++#endif ++ ++#endif /* UTIL_LINUX_NLS_H */ +diff --git a/fedfs/mount.fedfs.c b/fedfs/mount.fedfs.c +new file mode 100644 +index 00000000..bd434395 +--- /dev/null ++++ b/fedfs/mount.fedfs.c +@@ -0,0 +1,485 @@ ++/* ++ * Copyright 2011 Oracle. All rights reserved. ++ * ++ * This file is part of fedfs-utils. ++ * ++ * fedfs-utils is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2.0 as ++ * published by the Free Software Foundation. ++ * ++ * fedfs-utils is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License version 2.0 for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * version 2.0 along with fedfs-utils. If not, see: ++ * ++ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "fedfs-nls.h" ++#include "fedfs-getsrvinfo.h" ++#include "fedfs-gpl-boiler.h" ++ ++/** ++ * Top-level directory on client under which we mount NFSv4 domain roots ++ */ ++#define FEDFS_NFS4_TLDIR "nfs4" ++ ++/** ++ * Name of SRV record containing NFSv4 FedFS root ++ */ ++#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp" ++ ++/** ++ * Export path of NFSv4 FedFS root ++ */ ++#define FEDFS_NFS_EXPORTPATH "/.domainroot" ++ ++/** ++ * Pathname to mount.nfs ++ */ ++#define MOUNT_NFS_EXECUTABLE "/sbin/mount.nfs" ++ ++/** ++ * Mount status values, lifted from util-linux ++ */ ++enum { ++ EX_SUCCESS = 0, ++ EX_USAGE = 1, ++ EX_FAIL = 32, ++}; ++ ++static char *progname; ++static int nomtab; ++static int verbose; ++static _Bool readonly; ++static _Bool sloppy; ++static _Bool fake; ++ ++/** ++ * Short form command line options ++ */ ++static const char fedfs_opts[] = "fhno:rsvVw"; ++ ++/** ++ * Long form command line options ++ */ ++static const struct option fedfs_longopts[] = ++{ ++ { "fake", 0, NULL, 'f' }, ++ { "help", 0, NULL, 'h' }, ++ { "no-mtab", 0, NULL, 'n' }, ++ { "options", 1, NULL, 'o' }, ++ { "read-only", 0, NULL, 'r' }, ++ { "read-write", 0, NULL, 'w' }, ++ { "ro", 0, NULL, 'r' }, ++ { "rw", 0, NULL, 'w' }, ++ { "sloppy", 0, NULL, 's' }, ++ { "verbose", 0, NULL, 'v' }, ++ { "version", 0, NULL, 'V' }, ++ { NULL, 0, NULL, 0 } ++}; ++ ++/** ++ * Display mount.fedfs usage message ++ */ ++static void ++mount_usage(void) ++{ ++ printf(_("\nUsage: %s remotedir localdir [-fhnrsvVw]\n\n"), progname); ++ printf(_("options:\n")); ++ printf(_("\t-f\t\tFake mount, do not actually mount\n")); ++ printf(_("\t-h\t\tPrint this help\n")); ++ printf(_("\t-n\t\tDo not update /etc/mtab\n")); ++ printf(_("\t-r\t\tMount file system readonly\n")); ++ printf(_("\t-s\t\tTolerate sloppy mount options\n")); ++ printf(_("\t-v\t\tVerbose\n")); ++ printf(_("\t-V\t\tPrint version\n")); ++ printf(_("\t-w\t\tMount file system read-write\n")); ++ ++ printf("%s", fedfs_gpl_boilerplate); ++} ++ ++/** ++ * Concatenate three strings ++ * ++ * @param s NUL-terminated C string ++ * @param t NUL-terminated C string ++ * @param u NUL-terminated C string ++ * @return pointer to NUL-terminated C string or NULL ++ * ++ * Caller must free the returned string with free(3). Always frees ++ * its first arg - typical use: s = xstrconcat3(s,t,u); ++ * ++ * Lifted from util-linux. ++ */ ++static char * ++xstrconcat3(char *s, const char *t, const char *u) ++{ ++ _Bool free_s = true; ++ char *result; ++ ++ if (s == NULL) { ++ s = ""; ++ free_s = false; ++ } ++ if (t == NULL) ++ t = ""; ++ if (u == NULL) ++ u = ""; ++ result = malloc(strlen(s) + strlen(t) + strlen(u) + 1); ++ if (result == NULL) ++ goto out; ++ ++ strcpy(result, s); ++ strcat(result, t); ++ strcat(result, u); ++ ++out: ++ if (free_s) ++ free(s); ++ return result; ++} ++ ++/** ++ * Exec mount.nfs ++ * ++ * @param server NUL-terminated C string containing name of NFS server ++ * @param port server port to use when mounting ++ * @param domainname NUL-terminated C string containing FedFS domain name ++ * @param export_path NUL-terminated C string containing server export path ++ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory ++ * @param text_options NUL-terminated C string containing user's mount options ++ * ++ */ ++static void ++exec_mount_nfs4(const char *server, unsigned short port, ++ const char *domainname, const char *export_path, ++ const char *mounted_on_dir, const char *text_options) ++{ ++ static char special[2048]; ++ static char options[2048]; ++ char *args[16]; ++ int count = 0; ++ ++ snprintf(special, sizeof(special), "%s:%s/%s%s", server, ++ FEDFS_NFS_EXPORTPATH, domainname, export_path); ++ ++ if (text_options != NULL && strcmp(text_options, "") != 0) ++ snprintf(options, sizeof(options), "%s,vers=4,fg,port=%u", ++ text_options, port); ++ else ++ snprintf(options, sizeof(options), "vers=4,fg,port=%u", port); ++ ++ if (verbose) { ++ printf(_("%s: Special device: %s\n"), ++ progname, special); ++ printf(_("%s: Mounted-on directory: %s\n"), ++ progname, mounted_on_dir); ++ printf(_("%s: Mount options: %s\n"), ++ progname, options); ++ } ++ ++ args[count++] = MOUNT_NFS_EXECUTABLE; ++ args[count++] = special; ++ args[count++] = (char *)mounted_on_dir; ++ if (verbose) ++ args[count++] = "-v"; ++ if (fake) ++ args[count++] = "-f"; ++ if (nomtab) ++ args[count++] = "-n"; ++ if (readonly) ++ args[count++] = "-r"; ++ if (sloppy) ++ args[count++] = "-s"; ++ args[count++] = "-o"; ++ args[count++] = options; ++ ++ args[count] = NULL; ++ execv(args[0], args); ++} ++ ++/** ++ * Mount a FedFS domain root via NFSv4 ++ * ++ * @param domainname NUL-terminated C string containing FedFS domain name ++ * @param export_path NUL-terminated C string containing server export path ++ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory ++ * @param text_options NUL-terminated C string containing user's mount options ++ * @return exit status code from the mount.nfs command ++ * ++ * Construct the server:/export string and the mounted-on directory string ++ * based on the DNS SRV query results, then fork and exec mount.nfs to do ++ * the actual mount request. ++ */ ++static int ++nfs4_mount(const char *domainname, const char *export_path, ++ const char *mounted_on_dir, const char *text_options) ++{ ++ struct srvinfo *tmp, *si = NULL; ++ int error, status; ++ ++ status = EX_FAIL; ++ ++ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si); ++ switch (error) { ++ case ESI_SUCCESS: ++ break; ++ case ESI_NONAME: ++ fprintf(stderr, _("%s: Domain name %s not found\n"), ++ progname, domainname); ++ goto out; ++ case ESI_SERVICE: ++ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"), ++ progname, domainname); ++ goto out; ++ default: ++ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"), ++ progname, domainname, gsi_strerror(error)); ++ goto out; ++ } ++ ++ /* ++ * The srvinfo list is already in RFC 2782 sorted order. Try each ++ * SRV record once, in the foreground. Go with the first one that ++ * works. ++ */ ++ for (tmp = si; tmp != NULL; tmp = tmp->si_next) { ++ pid_t pid; ++ ++ pid = fork(); ++ switch (pid) { ++ case 0: ++ exec_mount_nfs4(tmp->si_target, tmp->si_port, ++ domainname, export_path, mounted_on_dir, ++ text_options); ++ /*NOTREACHED*/ ++ fprintf(stderr, _("%s: Failed to exec: %s\n"), ++ progname, strerror(errno)); ++ exit(EX_FAIL); ++ case -1: ++ fprintf(stderr, _("%s: Failed to fork: %s\n"), ++ progname, strerror(errno)); ++ goto out; ++ default: ++ waitpid(pid, &status, 0); ++ if (status == EX_SUCCESS) ++ goto out; ++ } ++ } ++ ++out: ++ freesrvinfo(si); ++ return status; ++} ++ ++/** ++ * Try one mount request ++ * ++ * @param source NUL-terminated C string containing name of "special device" ++ * @param target NUL-terminated C string containing local mounted-on directory ++ * @param text_options NUL-terminated C string containing user's mount options ++ * @return an exit status code ++ * ++ * Parse the pathname in "source." It contains the file system protocol ++ * and FedFS domain name. Then pass these arguments to the appropriate ++ * mount helper subcommand. ++ */ ++static int ++try_mount(const char *source, const char *target, const char *text_options) ++{ ++ char *global_name, *topdir, *domainname, *remaining; ++ int result; ++ ++ remaining = NULL; ++ result = EX_FAIL; ++ ++ global_name = strdup(source); ++ if (global_name == NULL) { ++ fprintf(stderr, _("%s: Unable to parse globally useful name\n"), ++ progname); ++ goto out; ++ } ++ ++ topdir = strtok(global_name, "/"); ++ if (topdir == NULL) { ++ fprintf(stderr, _("%s: Invalid globally useful name: %s\n"), ++ progname, source); ++ goto out; ++ } ++ if (verbose) ++ printf(_("%s: Top-level directory: %s\n"), ++ progname, topdir); ++ ++ domainname = strtok(NULL, "/"); ++ if (domainname == NULL) { ++ fprintf(stderr, _("%s: Missing domain name in globally " ++ "useful name: %s\n"), progname, source); ++ goto out; ++ } ++ if (verbose) ++ printf(_("%s: Domain name: %s\n"), ++ progname, domainname); ++ ++ remaining = strtok(NULL, "/"); ++ if (remaining == NULL) { ++ remaining = strdup("/"); ++ if (remaining == NULL) { ++ fprintf(stderr, _("%s: No memory\n"), progname); ++ goto out; ++ } ++ } else { ++ char *tmp; ++ ++ tmp = malloc(strlen(remaining) + 1); ++ if (tmp == NULL) { ++ fprintf(stderr, _("%s: No memory\n"), progname); ++ remaining = NULL; ++ goto out; ++ } ++ strcpy(tmp, "/"); ++ strcat(tmp, remaining); ++ remaining = tmp; ++ } ++ if (verbose) ++ printf(_("%s: Export path: %s\n"), ++ progname, remaining); ++ ++ if (strcmp(topdir, FEDFS_NFS4_TLDIR) == 0) ++ result = nfs4_mount(domainname, remaining, target, text_options); ++#if 0 ++ /* example: SMB support plugs in here */ ++ else if (strcmp(topdir, FEDFS_SMB_TLDIR) == 0) ++ result = smb_mount(domainname, remaining, target, text_options); ++#endif ++ else ++ fprintf(stderr, _("%s: Unrecognized file system protocol\n"), progname); ++ ++out: ++ free(global_name); ++ free(remaining); ++ ++ return result; ++} ++ ++/** ++ * Program entry point ++ * ++ * @param argc count of command line arguments ++ * @param argv array of NUL-terminated C strings containing command line arguments ++ * @return program exit status ++ */ ++int main(int argc, char *argv[]) ++{ ++ char *source, *target, *text_options; ++ int c, mnt_err; ++ ++ (void)setlocale(LC_ALL, ""); ++ ++ progname = basename(argv[0]); ++ ++ if (argv[1] && argv[1][0] == '-') { ++ if(argv[1][1] == 'V') ++ printf("%s (VERSION_STRING)\n", progname); ++ else ++ mount_usage(); ++ exit(EX_SUCCESS); ++ } ++ ++ if (argc < 3) { ++ mount_usage(); ++ exit(EX_USAGE); ++ } ++ ++ source = argv[1]; ++ target = argv[2]; ++ ++ mnt_err = EX_USAGE; ++ text_options = NULL; ++ readonly = false; ++ sloppy = false; ++ fake = false; ++ argv[2] = argv[0]; /* so that getopt error messages are correct */ ++ while ((c = getopt_long(argc - 2, argv + 2, fedfs_opts, ++ fedfs_longopts, NULL)) != -1) { ++ switch (c) { ++ case 'f': ++ fake = true; ++ break; ++ case 'n': ++ ++nomtab; ++ break; ++ case 'o': ++ /* Ugh. */ ++ if (text_options != NULL) ++ text_options = xstrconcat3(text_options, ",", optarg); ++ else ++ text_options = strdup(optarg); ++ if (text_options == NULL) { ++ fprintf(stderr, _("%s: No memory\n"), progname); ++ goto out; ++ } ++ break; ++ case 'r': ++ readonly = true; ++ break; ++ case 's': ++ sloppy = true; ++ break; ++ case 'v': ++ ++verbose; ++ break; ++ case 'V': ++ printf("%s: (VERSION_STRING)\n", progname); ++ mnt_err = EX_SUCCESS; ++ goto out; ++ case 'w': ++ readonly = false; ++ break; ++ case 'h': ++ default: ++ mount_usage(); ++ goto out; ++ } ++ } ++ ++ /* Extra non-option words at the end are bogus... */ ++ if (optind != argc - 2) { ++ mount_usage(); ++ goto out; ++ } ++ ++ if (getuid() != 0 && geteuid() != 0) { ++ fprintf(stderr, _("%s: Not installed setuid - " ++ "\"user\" FedFS mounts are not supported\n"), progname); ++ mnt_err = EX_FAIL; ++ goto out; ++ } ++ ++ mnt_err = try_mount(source, target, text_options); ++ ++out: ++ free(text_options); ++ exit(mnt_err); ++} diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-add-units-After-line-to-include-statd-service.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-add-units-After-line-to-include-statd-service.patch new file mode 100644 index 00000000..be86b45c --- /dev/null +++ b/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 + +autofs needs to ensure statd is started before any NFS mounts +are attempted. This is because if the first NFS mount starts +the service and the mount is an automounted directory that is +included in the PATH used by systemctl (eg. /usr/local/bin) +the mount cannot complete. + +Add rpc-statd.service to the unit "After=" line to try and +ensure it is started before automount. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + samples/autofs.service.in | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 1e11c3d5..b9925cf7 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -22,6 +22,7 @@ xx/xx/2018 autofs-5.1.5 + - improve hostname lookup error logging. + - fix rpm spec install premissions on auto.net and auto.smb. + - tiny patch for autofs typo and possible bug. ++- add units After line to include statd service. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/samples/autofs.service.in b/samples/autofs.service.in +index 918fc93c..766fc5a5 100644 +--- a/samples/autofs.service.in ++++ b/samples/autofs.service.in +@@ -1,6 +1,6 @@ + [Unit] + Description=Automounts filesystems on demand +-After=network.target ypbind.service sssd.service network-online.target remote-fs.target ++After=network.target ypbind.service sssd.service network-online.target remote-fs.target rpc-statd.service rpcbind.service + Wants=network-online.target rpc-statd.service rpcbind.service + + [Service] diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch new file mode 100644 index 00000000..c37517cd --- /dev/null +++ b/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 + +Expires can request different types of expire, currently normal or +immediate (and later force). + +Change the naming used in the expire functions to better indicate +usage. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + daemon/direct.c | 8 ++++---- + daemon/indirect.c | 8 ++++---- + daemon/state.c | 4 ++-- + include/state.h | 2 +- + 5 files changed, 12 insertions(+), 11 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 14eb1de8..c5ebb7e0 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -27,6 +27,7 @@ xx/xx/2018 autofs-5.1.5 + - fix NFS version mask usage. + - fix fd leak in rpc_do_create_client(). + - add-man page note about extra slashes in paths. ++- change expire type naming to better reflect usage. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/daemon/direct.c b/daemon/direct.c +index 3fdecdb8..b885d12f 100644 +--- a/daemon/direct.c ++++ b/daemon/direct.c +@@ -841,7 +841,7 @@ void *expire_proc_direct(void *arg) + struct expire_args ec; + struct autofs_point *ap; + struct mapent *me = NULL; +- unsigned int now; ++ unsigned int how; + int ioctlfd, cur_state; + int status, ret, left; + +@@ -852,7 +852,7 @@ void *expire_proc_direct(void *arg) + fatal(status); + + ap = ec.ap = ea->ap; +- now = ea->when; ++ how = ea->how; + ec.status = -1; + + ea->signaled = 1; +@@ -946,7 +946,7 @@ void *expire_proc_direct(void *arg) + + ioctlfd = me->ioctlfd; + +- ret = ops->expire(ap->logopt, ioctlfd, next->path, now); ++ ret = ops->expire(ap->logopt, ioctlfd, next->path, how); + if (ret) { + left++; + pthread_setcancelstate(cur_state, NULL); +@@ -972,7 +972,7 @@ void *expire_proc_direct(void *arg) + debug(ap->logopt, "send expire to trigger %s", next->path); + + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); +- ret = ops->expire(ap->logopt, ioctlfd, next->path, now); ++ ret = ops->expire(ap->logopt, ioctlfd, next->path, how); + if (ret) + left++; + pthread_setcancelstate(cur_state, NULL); +diff --git a/daemon/indirect.c b/daemon/indirect.c +index 03c081ed..438a0a21 100644 +--- a/daemon/indirect.c ++++ b/daemon/indirect.c +@@ -392,7 +392,7 @@ void *expire_proc_indirect(void *arg) + struct mnt_list *mnts = NULL, *next; + struct expire_args *ea; + struct expire_args ec; +- unsigned int now; ++ unsigned int how; + int offsets, submnts, count; + int retries; + int ioctlfd, cur_state; +@@ -405,7 +405,7 @@ void *expire_proc_indirect(void *arg) + fatal(status); + + ap = ec.ap = ea->ap; +- now = ea->when; ++ how = ea->how; + ec.status = -1; + + ea->signaled = 1; +@@ -530,7 +530,7 @@ void *expire_proc_indirect(void *arg) + debug(ap->logopt, "expire %s", next->path); + + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); +- ret = ops->expire(ap->logopt, ioctlfd, next->path, now); ++ ret = ops->expire(ap->logopt, ioctlfd, next->path, how); + if (ret) + left++; + pthread_setcancelstate(cur_state, NULL); +@@ -544,7 +544,7 @@ void *expire_proc_indirect(void *arg) + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); + retries = (count_mounts(ap, ap->path, ap->dev) + 1); + while (retries--) { +- ret = ops->expire(ap->logopt, ap->ioctlfd, ap->path, now); ++ ret = ops->expire(ap->logopt, ap->ioctlfd, ap->path, how); + if (ret) + left++; + } +diff --git a/daemon/state.c b/daemon/state.c +index cf835e05..ab235455 100644 +--- a/daemon/state.c ++++ b/daemon/state.c +@@ -267,7 +267,7 @@ void expire_proc_cleanup(void *arg) + return; + } + +-static enum expire expire_proc(struct autofs_point *ap, int now) ++static enum expire expire_proc(struct autofs_point *ap, int how) + { + pthread_t thid; + struct expire_args *ea; +@@ -295,7 +295,7 @@ static enum expire expire_proc(struct autofs_point *ap, int now) + fatal(status); + + ea->ap = ap; +- ea->when = now; ++ ea->how = how; + ea->status = 1; + + if (ap->type == LKP_INDIRECT) +diff --git a/include/state.h b/include/state.h +index b44a353c..e3079c20 100644 +--- a/include/state.h ++++ b/include/state.h +@@ -55,7 +55,7 @@ struct expire_args { + unsigned int signaled; + struct autofs_point *ap; /* autofs mount we are working on */ + enum states state; /* State prune or expire */ +- unsigned int when; /* Immediate expire ? */ ++ unsigned int how; /* Normal, immediate expire ? */ + int status; /* Return status */ + }; + diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-covarity-fixes-1.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-covarity-fixes-1.patch new file mode 100644 index 00000000..68505bde --- /dev/null +++ b/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 + +* remove conditional close of nullfd. +* fix memory leak of local_domain in lib/macros.c:macro_init(). +* check for NULL prior to several assignments in lib/master_parse.y. +* fix memory leak in lib/mounts.c:add_std_amd_vars(). +* add missing break in lib/rpc_subs.c:rpc_get_netid(). +* fix variable scope problem in modules/amd_parse.c:make_selector(). +* fix selector itself not freed in lib/parse_subs.c:free_selector(). +* fix possible memory leak in modules/lookup_ldap.c:parse_ldap_config(). +* fix possible memory leak in modules/lookup_ldap.c:decode_percent_hack(). +* fix usage of decode_percent_hack() in modules/lookup_ldap.c. +* initialize enc_key1 and enc_key2 in modules/lookup_ldap.c:lookup_one(). +* fix double alloc of map_type in modules/parse_amd.c:make_default_entry(). +* fix double alloc of map_type in modules/parse_amd.c:get_defaults_entry(). +* fix possible memory leak in modules/parse_sun.c:parse_reinit(). +* initialize myoptions and ro_loc in modules/parse_sun.c:mount_subtree(). +* initialize myoptions and loc in modules/parse_sun.c:parse_mount(). + +Signed-off-by: Ian Kent +--- + lib/log.c | 3 +-- + lib/macros.c | 1 + + lib/master_parse.y | 28 ++++++++++++++++++++++++++++ + lib/mounts.c | 4 +++- + lib/parse_subs.c | 1 + + lib/rpc_subs.c | 1 + + modules/amd_parse.y | 4 ++-- + modules/lookup_ldap.c | 27 ++++++++++++++++++++++----- + modules/parse_amd.c | 4 ++-- + modules/parse_sun.c | 10 +++++++++- + 10 files changed, 70 insertions(+), 13 deletions(-) + +diff --git a/lib/log.c b/lib/log.c +index 1a0bc3fa..f6ab77c1 100644 +--- a/lib/log.c ++++ b/lib/log.c +@@ -336,8 +336,7 @@ void log_to_syslog(void) + exit(1); + } + +- if (nullfd > 2) +- close(nullfd); ++ close(nullfd); + + return; + } +diff --git a/lib/macros.c b/lib/macros.c +index dfdca857..5def26da 100644 +--- a/lib/macros.c ++++ b/lib/macros.c +@@ -137,6 +137,7 @@ void macro_init(void) + + macro_init_done = 1; + macro_unlock(); ++ free(local_domain); + return; + } + +diff --git a/lib/master_parse.y b/lib/master_parse.y +index 761ade9b..5d687a70 100644 +--- a/lib/master_parse.y ++++ b/lib/master_parse.y +@@ -157,6 +157,8 @@ line: + + trim_maptype($2); + ++ if (path) ++ free(path); + path = master_strdup($1); + if (!path) { + master_error("memory allocation error"); +@@ -167,6 +169,8 @@ line: + if ((tmp = strchr($2, ','))) + *tmp++ = '\0'; + ++ if (type) ++ free(type); + type = master_strdup($2); + if (!type) { + master_error("memory allocation error"); +@@ -174,6 +178,8 @@ line: + YYABORT; + } + if (tmp) { ++ if (format) ++ free(format); + format = master_strdup(tmp); + if (!format) { + master_error("memory allocation error"); +@@ -204,6 +210,8 @@ line: + + mapspec: map + { ++ if (local_argv) ++ free_argv(local_argc, (const char **) local_argv); + local_argc = tmp_argc; + local_argv = tmp_argv; + tmp_argc = 0; +@@ -211,6 +219,8 @@ mapspec: map + } + | map options + { ++ if (local_argv) ++ free_argv(local_argc, (const char **) local_argv); + local_argc = tmp_argc; + local_argv = tmp_argv; + tmp_argc = 0; +@@ -288,6 +298,8 @@ map: PATH + } + | MAPHOSTS + { ++ if (type) ++ free(type); + type = master_strdup($1 + 1); + if (!type) { + local_free_vars(); +@@ -302,6 +314,8 @@ map: PATH + } + | MAPNULL + { ++ if (type) ++ free(type); + type = master_strdup($1 + 1); + if (!type) { + local_free_vars(); +@@ -310,6 +324,8 @@ map: PATH + } + | dnattrs + { ++ if (type) ++ free(type); + type = master_strdup("ldap"); + if (!type) { + local_free_vars(); +@@ -332,6 +348,8 @@ map: PATH + if ((tmp = strchr($1, ','))) + *tmp++ = '\0'; + ++ if (type) ++ free(type); + if (strcmp($1, "exec")) + type = master_strdup($1); + else +@@ -342,6 +360,8 @@ map: PATH + YYABORT; + } + if (tmp) { ++ if (format) ++ free(format); + format = master_strdup(tmp); + if (!format) { + master_error("memory allocation error"); +@@ -366,6 +386,8 @@ map: PATH + if ((tmp = strchr($1, ','))) + *tmp++ = '\0'; + ++ if (type) ++ free(type); + if (strcmp($1, "exec")) + type = master_strdup($1); + else +@@ -376,6 +398,8 @@ map: PATH + YYABORT; + } + if (tmp) { ++ if (format) ++ free(format); + format = master_strdup(tmp); + if (!format) { + master_error("memory allocation error"); +@@ -400,6 +424,8 @@ map: PATH + if ((tmp = strchr($1, ','))) + *tmp++ = '\0'; + ++ if (type) ++ free(type); + if (strcmp($1, "exec")) + type = master_strdup($1); + else +@@ -410,6 +436,8 @@ map: PATH + YYABORT; + } + if (tmp) { ++ if (format) ++ free(format); + format = master_strdup(tmp); + if (!format) { + master_error("memory allocation error"); +diff --git a/lib/mounts.c b/lib/mounts.c +index f46fab2b..a35503bf 100644 +--- a/lib/mounts.c ++++ b/lib/mounts.c +@@ -489,8 +489,10 @@ void add_std_amd_vars(struct substvar *sv) + const struct substvar *v = macro_findvar(sv, "domain", 4); + if (v && *v->val) { + tmp = strdup(v->val); +- if (tmp) ++ if (tmp) { + macro_global_addvar("cluster", 7, tmp); ++ free(tmp); ++ } + } + } + +diff --git a/lib/parse_subs.c b/lib/parse_subs.c +index 841e81fd..cdda2e1a 100644 +--- a/lib/parse_subs.c ++++ b/lib/parse_subs.c +@@ -189,6 +189,7 @@ void free_selector(struct selector *selector) + free(s->func.arg2); + s = next; + } ++ free(selector); + return; + } + +diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c +index 9451c455..8b23627a 100644 +--- a/lib/rpc_subs.c ++++ b/lib/rpc_subs.c +@@ -389,6 +389,7 @@ static enum clnt_stat rpc_get_netid(const sa_family_t family, + } + + *netid = nc_netid; ++ break; + } + endnetconfig(handle); + free(nc_proto); +diff --git a/modules/amd_parse.y b/modules/amd_parse.y +index 1d72f190..5bd688d9 100644 +--- a/modules/amd_parse.y ++++ b/modules/amd_parse.y +@@ -822,13 +822,13 @@ static int make_selector(char *name, + if (!value1) + tmp = NULL; + else { +- char *tmp = amd_strdup(value1); ++ tmp = amd_strdup(value1); + if (!tmp) + goto error; + } + s->func.arg1 = tmp; + } else if (s->sel->flags & SEL_FLAG_FUNC2) { +- char *tmp = amd_strdup(value1); ++ tmp = amd_strdup(value1); + if (!tmp) + goto error; + s->func.arg1 = tmp; +diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c +index 37810e1c..06c96973 100644 +--- a/modules/lookup_ldap.c ++++ b/modules/lookup_ldap.c +@@ -1137,6 +1137,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt) + error(logopt, + MODPREFIX "stat(2) failed with error %s.", + strerror(errno)); ++ free(auth_conf); + return 0; + } + +@@ -1148,6 +1149,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt) + "Please make sure that it is owned by root, group " + "is root, and the mode is 0600.", + auth_conf); ++ free(auth_conf); + return -1; + } + +@@ -1182,9 +1184,11 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt) + goto out; + } + +- if (!usetls || ctxt->port == LDAPS_PORT) ++ if (!usetls || ctxt->port == LDAPS_PORT) { + use_tls = LDAP_TLS_DONT_USE; +- else { ++ if (usetls) ++ free(usetls); ++ } else { + if (!strcasecmp(usetls, "yes")) + use_tls = LDAP_TLS_INIT; + else if (!strcasecmp(usetls, "no")) +@@ -1194,6 +1198,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt) + MODPREFIX + "The usetls property must have value " + "\"yes\" or \"no\"."); ++ free(usetls); + ret = -1; + goto out; + } +@@ -1221,6 +1226,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt) + MODPREFIX + "The tlsrequired property must have value " + "\"yes\" or \"no\"."); ++ free(tlsrequired); + ret = -1; + goto out; + } +@@ -1252,6 +1258,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt) + MODPREFIX + "The authrequired property must have value " + "\"yes\", \"no\", \"autodetect\", or \"simple\"."); ++ free(authrequired); + ret = -1; + goto out; + } +@@ -1338,6 +1345,7 @@ auth_fail: + (void)get_property(logopt, root, "credentialcache", &client_cc); + + ctxt->auth_conf = auth_conf; ++ auth_conf = NULL; + ctxt->use_tls = use_tls; + ctxt->tls_required = tls_required; + ctxt->auth_required = auth_required; +@@ -1375,8 +1383,12 @@ auth_fail: + user, secret ? "specified" : "unspecified", + client_princ, client_cc); + } ++ if (authtype) ++ free(authtype); + out: + xmlFreeDoc(doc); ++ if (auth_conf) ++ free(auth_conf); + + if (fallback) + return 0; +@@ -1986,7 +1998,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) + } + } else if (count == 1) { + dec_len = decode_percent_hack(keyValue[0], &key); +- if (dec_len < 0) { ++ if (dec_len <= 0) { + error(logopt, MODPREFIX + "invalid map key %s - ignoring", + *keyValue); +@@ -1994,7 +2006,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) + } + } else { + dec_len = decode_percent_hack(keyValue[0], &key); +- if (dec_len < 0) { ++ if (dec_len <= 0) { + error(logopt, MODPREFIX + "invalid map key %s - ignoring", + *keyValue); +@@ -2004,7 +2016,7 @@ int lookup_read_master(struct master *master, time_t age, void *context) + for (i = 1; i < count; i++) { + char *k; + dec_len = decode_percent_hack(keyValue[i], &k); +- if (dec_len < 0) { ++ if (dec_len <= 0) { + error(logopt, MODPREFIX + "invalid map key %s - ignoring", + *keyValue); +@@ -2159,6 +2171,8 @@ static int decode_percent_hack(const char *name, char **key) + *key = NULL; + + len = get_percent_decoded_len(name); ++ if (!len) ++ return 0; + new = malloc(len + 1); + if (!new) + return -1; +@@ -2998,6 +3012,9 @@ static int lookup_one(struct autofs_point *ap, struct map_source *source, + attrs[1] = info; + attrs[2] = NULL; + ++ enc_key1 = NULL; ++ enc_key2 = NULL; ++ + if (*qKey == '*' && qKey_len == 1) + *qKey = '/'; + else if (!strcasecmp(class, "nisObject")) { +diff --git a/modules/parse_amd.c b/modules/parse_amd.c +index 9543ced3..ea57270a 100644 +--- a/modules/parse_amd.c ++++ b/modules/parse_amd.c +@@ -1879,7 +1879,7 @@ struct amd_entry *make_default_entry(struct autofs_point *ap, + */ + map_type = conf_amd_get_map_type(ap->path); + if (map_type) +- defaults_entry->map_type = strdup(map_type); ++ defaults_entry->map_type = map_type; + /* The list should now be empty .... */ + free_amd_entry_list(&dflts); + return defaults_entry; +@@ -2006,7 +2006,7 @@ static struct amd_entry *get_defaults_entry(struct autofs_point *ap, + */ + char *map_type = conf_amd_get_map_type(ap->path); + if (map_type) +- entry->map_type = strdup(map_type); ++ entry->map_type = map_type; + } + free(expand); + } +diff --git a/modules/parse_sun.c b/modules/parse_sun.c +index 536a9bc1..88dde0b2 100644 +--- a/modules/parse_sun.c ++++ b/modules/parse_sun.c +@@ -443,8 +443,10 @@ int parse_reinit(int argc, const char *const *argv, void **context) + + *new = default_context; + +- if (do_init(argc, argv, new)) ++ if (do_init(argc, argv, new)) { ++ free(new); + return 1; ++ } + + kill_context(ctxt); + +@@ -1143,6 +1145,9 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me, + const char *root; + int ro_len; + ++ myoptions = NULL; ++ ro_loc = NULL; ++ + rv = parse_mapent(ro->mapent, + options, &myoptions, &ro_loc, ap->logopt); + if (!rv) { +@@ -1524,6 +1529,9 @@ dont_expand: + p += l; + p = skipspace(p); + ++ myoptions = NULL; ++ loc = NULL; ++ + l = parse_mapent(p, options, &myoptions, &loc, ap->logopt); + if (!l) { + cache_delete_offset_list(mc, name); diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch new file mode 100644 index 00000000..456dc807 --- /dev/null +++ b/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 + +If a master map mount point path has a trailing '/' this can cause +problems so remove them at parse time. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + lib/master_parse.y | 5 +++++ + 2 files changed, 6 insertions(+) + +diff --git a/CHANGELOG b/CHANGELOG +index 1e5ec15b..a7bb89dc 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -12,6 +12,7 @@ xx/xx/2018 autofs-5.1.5 + - use_hostname_for_mounts shouldn't prevent selection among replicas. + - fix monotonic_elapsed. + - Makefiles.rules: remove 'samples' from SUBDIRS. ++- dont allow trailing slash in master map mount points. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/lib/master_parse.y b/lib/master_parse.y +index 42e03c2d..761ade9b 100644 +--- a/lib/master_parse.y ++++ b/lib/master_parse.y +@@ -749,6 +749,7 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne + struct map_source *source; + unsigned int logopt = logging; + unsigned int m_logopt = master->logopt; ++ size_t mp_len; + int ret; + + local_init_vars(); +@@ -763,6 +764,10 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne + return 0; + } + ++ mp_len = strlen(path); ++ while (mp_len && path[--mp_len] == '/') ++ path[mp_len] = 0; ++ + nc = master->nc; + + /* Add null map entries to the null map cache */ diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch new file mode 100644 index 00000000..b95f0eaa --- /dev/null +++ b/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 + +In parse_amd.c:do_link_mount() a character array is used to construct +a path when a pointer to the relevant amd entry field is sufficient. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + modules/parse_amd.c | 6 +++--- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 0f30596f..13f01397 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -3,6 +3,7 @@ xx/xx/2018 autofs-5.1.5 + - fix directory create permission. + - fix use after free in do_master_list_reset(). + - fix deadlock in dumpmaps. ++- dont use array for path when not necessary. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/modules/parse_amd.c b/modules/parse_amd.c +index c4b3ef0b..2cce5417 100644 +--- a/modules/parse_amd.c ++++ b/modules/parse_amd.c +@@ -967,8 +967,8 @@ static int do_auto_mount(struct autofs_point *ap, const char *name, + static int do_link_mount(struct autofs_point *ap, const char *name, + struct amd_entry *entry, unsigned int flags) + { +- char target[PATH_MAX + 1]; + const char *opts = (entry->opts && *entry->opts) ? entry->opts : NULL; ++ char *target; + int ret; + + if (entry->sublink) { +@@ -977,14 +977,14 @@ static int do_link_mount(struct autofs_point *ap, const char *name, + "error: sublink option length is too long"); + return 0; + } +- strcpy(target, entry->sublink); ++ target = entry->sublink; + } else { + if (strlen(entry->fs) > PATH_MAX) { + error(ap->logopt, MODPREFIX + "error: fs option length is too long"); + return 0; + } +- strcpy(target, entry->fs); ++ target = entry->fs; + } + + if (!(flags & CONF_AUTOFS_USE_LOFS)) diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch new file mode 100644 index 00000000..b807372d --- /dev/null +++ b/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 + +Because the preferred usage is to leave busy mounts in place and +re-connect to them on start up the SIGUSR2 logic hasn't been used +or tested for a long time. + +But it can be useful so enable it so any problems with it can be +identified and resolved. + +It turns out that the SIGUSR2 forced shutdown behaves like a SIGUSR1 +prune expire excpet that autofs will shutdown if all current mounts +are expired. But the kernel currently won't trigger expires for +mounts that are in use so it doesn't function quite as intended. + +Enable the forced shutdown anyway so it will function if the kernel +supports it. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + autofs.spec | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/CHANGELOG b/CHANGELOG +index 0b7983ea..740f804f 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -29,6 +29,7 @@ xx/xx/2018 autofs-5.1.5 + - add-man page note about extra slashes in paths. + - change expire type naming to better reflect usage. + - use defines for expire type. ++- enable SIGUSR2 handling in rpm spec file. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/autofs.spec b/autofs.spec +index f857d9da..6419e3e3 100644 +--- a/autofs.spec ++++ b/autofs.spec +@@ -97,6 +97,7 @@ LDFLAGS="-Wl,-z,now" \ + ./configure --libdir=%{_libdir} \ + --disable-mount-locking \ + --enable-ignore-busy \ ++ --enable-forced-shutdown \ + %{?systemd_configure_arg:} \ + %{?libtirpc_configure_arg:} \ + %{?fedfs_configure_arg:} diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-NFS-version-mask-usage.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-NFS-version-mask-usage.patch new file mode 100644 index 00000000..bd4c7f2f --- /dev/null +++ b/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 + +Upstream commit a8af65195 changed NFS_VERS_MASK to exclude NFSv2 +so NFSv2 would be excluded in the default availability probe. + +But NFS_VERS_MASK is used like a mask elsewhere and causes NFSv2 +to be cleared for the availability probe even when it is requested. + +So add a macro to NFS_VERS_DEFAULT (and accompanying macros) to be +used to set initial defaults and restore NFS_VERS_MASK to what it +should be when used as a mask. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + include/replicated.h | 5 ++++- + modules/mount_nfs.c | 6 +++--- + 3 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index e3ada7e7..dd48bf71 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -24,6 +24,7 @@ xx/xx/2018 autofs-5.1.5 + - tiny patch for autofs typo and possible bug. + - add units After line to include statd service. + - use systemd sd_notify() at startup. ++- fix NFS version mask usage. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/include/replicated.h b/include/replicated.h +index 0f482d21..95ff1f0d 100644 +--- a/include/replicated.h ++++ b/include/replicated.h +@@ -26,7 +26,9 @@ + #define NFS2_SUPPORTED 0x0010 + #define NFS3_SUPPORTED 0x0020 + #define NFS4_SUPPORTED 0x0040 +-#define NFS_VERS_MASK (NFS3_SUPPORTED) ++#define NFS_VERS_DEFAULT (NFS3_SUPPORTED) ++#define NFS_VERS_MASK (NFS2_SUPPORTED|NFS3_SUPPORTED) ++#define NFS4_VERS_DEFAULT (NFS4_SUPPORTED) + #define NFS4_VERS_MASK (NFS4_SUPPORTED) + + #define NFS2_REQUESTED NFS2_SUPPORTED +@@ -39,6 +41,7 @@ + #define UDP_REQUESTED UDP_SUPPORTED + #define TCP6_REQUESTED 0x0100 + #define UDP6_REQUESTED 0x0200 ++#define NFS_PROTO_DEFAULT (TCP_SUPPORTED|UDP_SUPPORTED) + #define NFS_PROTO_MASK (TCP_SUPPORTED|UDP_SUPPORTED) + + #define NFS2_TCP_SUPPORTED NFS2_SUPPORTED +diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c +index 4cf0cd27..426c27bd 100644 +--- a/modules/mount_nfs.c ++++ b/modules/mount_nfs.c +@@ -86,11 +86,11 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + root, name, what, fstype, options); + + mount_default_proto = defaults_get_mount_nfs_default_proto(); +- vers = NFS_VERS_MASK | NFS_PROTO_MASK; ++ vers = NFS_VERS_DEFAULT | NFS_PROTO_DEFAULT; + if (strcmp(fstype, "nfs4") == 0) +- vers = NFS4_VERS_MASK | TCP_SUPPORTED; ++ vers = NFS4_VERS_DEFAULT | TCP_SUPPORTED; + else if (mount_default_proto == 4) +- vers = vers | NFS4_VERS_MASK; ++ vers = vers | NFS4_VERS_DEFAULT; + + /* Extract "nosymlink" pseudo-option which stops local filesystems + * from being symlinked. diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-deadlock-in-dumpmaps.patch new file mode 100644 index 00000000..12bd077f --- /dev/null +++ b/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 + +Commit a223d11fa8e (autofs-5.1.3 - serialize calls to open_xxxx() +functions) introduces a deadlock when using the dumpmaps function. + +In this case the open fd mutex needs to be unlocked in the forked +child process of the do_spawn() function. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + daemon/spawn.c | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/CHANGELOG b/CHANGELOG +index 2747327b..0f30596f 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -2,6 +2,7 @@ xx/xx/2018 autofs-5.1.5 + - fix flag file permission. + - fix directory create permission. + - fix use after free in do_master_list_reset(). ++- fix deadlock in dumpmaps. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/daemon/spawn.c b/daemon/spawn.c +index fabe577e..dbbca7fa 100644 +--- a/daemon/spawn.c ++++ b/daemon/spawn.c +@@ -338,6 +338,7 @@ static int do_spawn(unsigned logopt, unsigned int wait, + dup2(pipefd[1], STDOUT_FILENO); + dup2(pipefd[1], STDERR_FILENO); + close(pipefd[1]); ++ open_mutex_unlock(); + + /* what to mount must always be second last */ + while (*pargv++) diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-directory-create-permission.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-directory-create-permission.patch new file mode 100644 index 00000000..97230310 --- /dev/null +++ b/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 + +autofs mount point directory creation is done using a permission of +0555. + +But it is necessary to create directories within autofs mount points +for some map entry types so write access should be set for the owner +on mount point directories. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + daemon/automount.c | 2 ++ + daemon/direct.c | 4 ++-- + daemon/indirect.c | 2 +- + daemon/lookup.c | 2 +- + include/automount.h | 1 + + modules/mount_bind.c | 6 +++--- + modules/mount_changer.c | 2 +- + modules/mount_ext2.c | 2 +- + modules/mount_generic.c | 2 +- + modules/mount_nfs.c | 2 +- + modules/parse_amd.c | 2 +- + 12 files changed, 16 insertions(+), 12 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index d07d88ce..4faab510 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -1,5 +1,6 @@ + xx/xx/2018 autofs-5.1.5 + - fix flag file permission. ++- fix directory create permission. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/daemon/automount.c b/daemon/automount.c +index 5c739617..dcdc19fb 100644 +--- a/daemon/automount.c ++++ b/daemon/automount.c +@@ -51,6 +51,8 @@ const char *libdir = AUTOFS_LIB_DIR; /* Location of library modules */ + const char *mapdir = AUTOFS_MAP_DIR; /* Location of mount maps */ + const char *confdir = AUTOFS_CONF_DIR; /* Location of autofs config file */ + ++unsigned int mp_mode = 0755; ++ + unsigned int nfs_mount_uses_string_options = 0; + static struct nfs_mount_vers vers, check = {1, 1, 1}; + +diff --git a/daemon/direct.c b/daemon/direct.c +index 9a134351..3fdecdb8 100644 +--- a/daemon/direct.c ++++ b/daemon/direct.c +@@ -424,7 +424,7 @@ int do_mount_autofs_direct(struct autofs_point *ap, + } + + /* In case the directory doesn't exist, try to mkdir it */ +- if (mkdir_path(me->key, 0555) < 0) { ++ if (mkdir_path(me->key, mp_mode) < 0) { + if (errno != EEXIST && errno != EROFS) { + crit(ap->logopt, + "failed to create mount directory %s", me->key); +@@ -739,7 +739,7 @@ int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, const char * + strcat(mountpoint, offset); + + /* In case the directory doesn't exist, try to mkdir it */ +- if (mkdir_path(mountpoint, 0555) < 0) { ++ if (mkdir_path(mountpoint, mp_mode) < 0) { + if (errno == EEXIST) { + /* + * If the mount point directory is a real mount +diff --git a/daemon/indirect.c b/daemon/indirect.c +index ffb11b8c..03c081ed 100644 +--- a/daemon/indirect.c ++++ b/daemon/indirect.c +@@ -133,7 +133,7 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root) + } + + /* In case the directory doesn't exist, try to mkdir it */ +- if (mkdir_path(root, 0555) < 0) { ++ if (mkdir_path(root, mp_mode) < 0) { + if (errno != EEXIST && errno != EROFS) { + crit(ap->logopt, + "failed to create autofs directory %s", +diff --git a/daemon/lookup.c b/daemon/lookup.c +index cb67e7d9..6a722b3b 100644 +--- a/daemon/lookup.c ++++ b/daemon/lookup.c +@@ -802,7 +802,7 @@ int lookup_ghost(struct autofs_point *ap, const char *root) + goto next; + } + +- ret = mkdir_path(fullpath, 0555); ++ ret = mkdir_path(fullpath, mp_mode); + if (ret < 0 && errno != EEXIST) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + warn(ap->logopt, +diff --git a/include/automount.h b/include/automount.h +index 2e2c2b02..e5c19d23 100644 +--- a/include/automount.h ++++ b/include/automount.h +@@ -269,6 +269,7 @@ void reset_signals(void); + int do_mount(struct autofs_point *ap, const char *root, const char *name, + int name_len, const char *what, const char *fstype, + const char *options); ++extern unsigned int mp_mode; + int mkdir_path(const char *path, mode_t mode); + int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev); + +diff --git a/modules/mount_bind.c b/modules/mount_bind.c +index 4864ea51..5effa880 100644 +--- a/modules/mount_bind.c ++++ b/modules/mount_bind.c +@@ -151,7 +151,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + + debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); + +- status = mkdir_path(fullpath, 0555); ++ status = mkdir_path(fullpath, mp_mode); + if (status && errno != EEXIST) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, +@@ -203,7 +203,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + } else { + debug(ap->logopt, + MODPREFIX "calling mkdir_path %s", basepath); +- if (mkdir_path(basepath, 0555) && errno != EEXIST) { ++ if (mkdir_path(basepath, mp_mode) && errno != EEXIST) { + char *estr; + estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, +@@ -219,7 +219,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + "failed to create symlink %s -> %s", + fullpath, what); + if ((ap->flags & MOUNT_FLAG_GHOST) && !status) { +- if (mkdir_path(fullpath, 0555) && errno != EEXIST) { ++ if (mkdir_path(fullpath, mp_mode) && errno != EEXIST) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, + MODPREFIX "mkdir_path %s failed: %s", +diff --git a/modules/mount_changer.c b/modules/mount_changer.c +index 798f23b2..7d44a720 100644 +--- a/modules/mount_changer.c ++++ b/modules/mount_changer.c +@@ -87,7 +87,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + + debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); + +- status = mkdir_path(fullpath, 0555); ++ status = mkdir_path(fullpath, mp_mode); + if (status && errno != EEXIST) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, +diff --git a/modules/mount_ext2.c b/modules/mount_ext2.c +index 90fc0876..3bbea95a 100644 +--- a/modules/mount_ext2.c ++++ b/modules/mount_ext2.c +@@ -69,7 +69,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + + debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); + +- status = mkdir_path(fullpath, 0555); ++ status = mkdir_path(fullpath, mp_mode); + if (status && errno != EEXIST) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, +diff --git a/modules/mount_generic.c b/modules/mount_generic.c +index ae637875..b1a3adbf 100644 +--- a/modules/mount_generic.c ++++ b/modules/mount_generic.c +@@ -68,7 +68,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + + debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); + +- status = mkdir_path(fullpath, 0555); ++ status = mkdir_path(fullpath, mp_mode); + if (status && errno != EEXIST) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, +diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c +index bf712a93..77166544 100644 +--- a/modules/mount_nfs.c ++++ b/modules/mount_nfs.c +@@ -277,7 +277,7 @@ dont_probe: + + debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); + +- status = mkdir_path(fullpath, 0555); ++ status = mkdir_path(fullpath, mp_mode); + if (status && errno != EEXIST) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, +diff --git a/modules/parse_amd.c b/modules/parse_amd.c +index b40c1ad1..c4b3ef0b 100644 +--- a/modules/parse_amd.c ++++ b/modules/parse_amd.c +@@ -1288,7 +1288,7 @@ static int do_program_mount(struct autofs_point *ap, + rv = 0; + ext_mount_add(&entry->ext_mount, entry->fs, 1); + } else { +- rv = mkdir_path(entry->fs, 0555); ++ rv = mkdir_path(entry->fs, mp_mode); + if (rv && errno != EEXIST) { + char buf[MAX_ERR_BUF]; + char *estr; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch new file mode 100644 index 00000000..80d0a874 --- /dev/null +++ b/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 + +Fix incorrect error return in modules/parse_amd.c:do_nfs_mount(). +--- + CHANGELOG | 1 + + modules/parse_amd.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 756ef927..d0cfa19b 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -6,6 +6,7 @@ xx/xx/2018 autofs-5.1.5 + - dont use array for path when not necessary. + - fix prefix option handling in expand_entry(). + - fix sublink option not set from defaults. ++- fix error return in do_nfs_mount(). + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/modules/parse_amd.c b/modules/parse_amd.c +index 1c962fff..2a5d9a30 100644 +--- a/modules/parse_amd.c ++++ b/modules/parse_amd.c +@@ -1099,7 +1099,7 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name, + if (strlen(entry->rhost) + strlen(entry->rfs) + 1 > PATH_MAX) { + error(ap->logopt, MODPREFIX + "error: rhost + rfs options length is too long"); +- return 0; ++ return 1; + } + + strcpy(target, entry->rhost); diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch new file mode 100644 index 00000000..b4b9e2e3 --- /dev/null +++ b/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 + +Commit 94f87e203a (fix create_client() RPC client handling) fixed +possible use of an invalid RPC client handle but the change neglected +to account for a check in rpc_do_create_client() that would open a new +file descriptor without checking if the passed in descriptor was +already opened. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + lib/rpc_subs.c | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index dd48bf71..92e60df9 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -25,6 +25,7 @@ xx/xx/2018 autofs-5.1.5 + - add units After line to include statd service. + - use systemd sd_notify() at startup. + - fix NFS version mask usage. ++- fix fd leak in rpc_do_create_client(). + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c +index cc83e84d..9451c455 100644 +--- a/lib/rpc_subs.c ++++ b/lib/rpc_subs.c +@@ -183,7 +183,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i + in4_laddr.sin_addr.s_addr = htonl(INADDR_ANY); + slen = sizeof(struct sockaddr_in); + +- if (!info->client) { ++ if (!info->client && *fd == RPC_ANYSOCK) { + struct sockaddr *laddr; + + *fd = open_sock(addr->sa_family, type, proto); +@@ -296,7 +296,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i + * it would bind to a reserved port, which has been shown to + * exhaust the reserved port range in some situations. + */ +- if (!info->client) { ++ if (!info->client && *fd == RPC_ANYSOCK) { + *fd = open_sock(addr->sa_family, type, proto); + if (*fd < 0) { + ret = -errno; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-flag-file-permission.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-flag-file-permission.patch new file mode 100644 index 00000000..c2f8fdb7 --- /dev/null +++ b/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 + +The flag file used to check if automount(8) is running was being +created with mode 0 which caused unnecessary dac_override AVC +failures. + +There's no reason to protect this file so just use 0644 as the +file permission. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 3 +++ + daemon/flag.c | 2 +- + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 246279ae..d07d88ce 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -1,3 +1,6 @@ ++xx/xx/2018 autofs-5.1.5 ++- fix flag file permission. ++ + 19/12/2017 autofs-5.1.4 + - fix spec file url. + - fix unset tsd group name handling. +diff --git a/daemon/flag.c b/daemon/flag.c +index 99f26847..ff9858c8 100644 +--- a/daemon/flag.c ++++ b/daemon/flag.c +@@ -164,7 +164,7 @@ int aquire_flag_file(void) + while (!we_created_flagfile) { + int errsv, i, j; + +- i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0); ++ i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0644); + if (i < 0) { + release_flag_file(); + return 0; diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-libresolv-configure-check.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-libresolv-configure-check.patch new file mode 100644 index 00000000..f6a9bb3e --- /dev/null +++ b/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 + +The libresolv functions are not found by AC_CHECK_LIB() unless +they are prefixed with "__". + +So change the library check to also look for __ during +the check. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + configure | 41 +++++++++++++++++++++++++++++++++++++++++ + configure.in | 2 +- + 3 files changed, 43 insertions(+), 1 deletion(-) + +diff --git a/CHANGELOG b/CHANGELOG +index a7bb89dc..dbfb8389 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -13,6 +13,7 @@ xx/xx/2018 autofs-5.1.5 + - fix monotonic_elapsed. + - Makefiles.rules: remove 'samples' from SUBDIRS. + - dont allow trailing slash in master map mount points. ++- fix libresolv configure check. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/configure b/configure +index 2d517aac..5c8aae30 100755 +--- a/configure ++++ b/configure +@@ -4821,6 +4821,47 @@ fi + $as_echo "$ac_cv_lib_resolv_res_query" >&6; } + if test "x$ac_cv_lib_resolv_res_query" = xyes; then : + LIBRESOLV="-lresolv" ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __res_query in -lresolv" >&5 ++$as_echo_n "checking for __res_query in -lresolv... " >&6; } ++if ${ac_cv_lib_resolv___res_query+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lresolv $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char __res_query (); ++int ++main () ++{ ++return __res_query (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_lib_resolv___res_query=yes ++else ++ ac_cv_lib_resolv___res_query=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv___res_query" >&5 ++$as_echo "$ac_cv_lib_resolv___res_query" >&6; } ++if test "x$ac_cv_lib_resolv___res_query" = xyes; then : ++ LIBRESOLV="-lresolv" ++fi ++ + fi + + +diff --git a/configure.in b/configure.in +index d74775cc..4d1208f5 100644 +--- a/configure.in ++++ b/configure.in +@@ -217,7 +217,7 @@ AC_SUBST(NSL_LIBS) + NSL_CFLAGS="" + ]) + +-AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv") ++AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv", AC_CHECK_LIB(resolv, __res_query, LIBRESOLV="-lresolv")) + AC_SUBST(LIBRESOLV) + + # diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-monotonic_elapsed.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-monotonic_elapsed.patch new file mode 100644 index 00000000..17c5a6e7 --- /dev/null +++ b/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 + +When automount probes multiple hosts to find the one which +responds most quickly, it currently ignores the nanoseconds. +This often makes the cost "0", which makes weights ineffective. + +The cause is that monotonic_elapsed() casts tv_nsec to a +double *after* dividing by 1 billion, rather than before. + +With this change, weights become effective for choosing +between hosts which respond in under one second. + +Signed-off-by: NeilBrown +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + lib/rpc_subs.c | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 104fca90..313730b1 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -10,6 +10,7 @@ xx/xx/2018 autofs-5.1.5 + - add error handling for ext_mount_add(). + - account for recent libnsl changes. + - use_hostname_for_mounts shouldn't prevent selection among replicas. ++- fix monotonic_elapsed. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c +index 73097c9d..60ede9f8 100644 +--- a/lib/rpc_subs.c ++++ b/lib/rpc_subs.c +@@ -1093,9 +1093,9 @@ double monotonic_elapsed(struct timespec start, struct timespec end) + double t1, t2; + + t1 = (double) start.tv_sec + +- (double) (start.tv_nsec/(1000*1000*1000)); ++ ((double) start.tv_nsec/(1000*1000*1000)); + t2 = (double) end.tv_sec + +- (double) (end.tv_nsec/(1000*1000*1000)); ++ ((double) end.tv_nsec/(1000*1000*1000)); + return t2 - t1; + } + diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch new file mode 100644 index 00000000..4e3996be --- /dev/null +++ b/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 + +The changes to fix the defaults handling in the amd map parser caused +the prefix option to not be expanded and also to not be propagated to +submounts in some cases. + +But the prefix should be expanded in modules/parse_amd.c:expand_entry() +along with the reset of the amd map entry fields. + +Just adding this to modules/parse_amd.c:expand_entry() (where it should +be) fixes the amd map entry expansion and also fixes the propagation +of the prefix to submounts. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + modules/parse_amd.c | 11 +++++++++++ + 2 files changed, 12 insertions(+) + +diff --git a/CHANGELOG b/CHANGELOG +index 13f01397..19aec2ae 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -4,6 +4,7 @@ xx/xx/2018 autofs-5.1.5 + - fix use after free in do_master_list_reset(). + - fix deadlock in dumpmaps. + - dont use array for path when not necessary. ++- fix prefix option handling in expand_entry(). + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/modules/parse_amd.c b/modules/parse_amd.c +index 2cce5417..1a5a2960 100644 +--- a/modules/parse_amd.c ++++ b/modules/parse_amd.c +@@ -725,6 +725,17 @@ static struct substvar *expand_entry(struct autofs_point *ap, + entry->rhost = host; + } + next: ++ if (entry->pref) { ++ if (expand_selectors(ap, entry->pref, &expand, sv)) { ++ debug(logopt, MODPREFIX ++ "pref expand(\"%s\") -> %s", ++ entry->pref, expand); ++ free(entry->pref); ++ entry->pref = expand; ++ } ++ sv = macro_addvar(sv, "pref", 4, entry->pref); ++ } ++ + if (entry->sublink) { + if (expand_selectors(ap, entry->sublink, &expand, sv)) { + debug(logopt, MODPREFIX diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch new file mode 100644 index 00000000..6b681e39 --- /dev/null +++ b/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 + +Commit 0da3f5695d removes execute permissions from the install of +auto.net and auto.smb. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + autofs.spec | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 596590a8..a5b79dd6 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -20,6 +20,7 @@ xx/xx/2018 autofs-5.1.5 + - add conditional inclusion of fedfs binaries. + - add an example fedfs master map entry to the installed master map. + - improve hostname lookup error logging. ++- fix rpm spec install premissions on auto.net and auto.smb. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/autofs.spec b/autofs.spec +index 2cb09ef0..ac3b0a3f 100644 +--- a/autofs.spec ++++ b/autofs.spec +@@ -131,8 +131,8 @@ install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs + + install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master + install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc +-install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net +-install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb ++install -m 755 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net ++install -m 755 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb + install -m 600 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf + + %clean diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch new file mode 100644 index 00000000..cefb27c2 --- /dev/null +++ b/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 + +If the amd entry sublink option is given in a defaults entry +it isn't merged into the current entry during parsing. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + modules/parse_amd.c | 12 ++++++++++++ + 2 files changed, 13 insertions(+) + +diff --git a/CHANGELOG b/CHANGELOG +index 19aec2ae..756ef927 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -5,6 +5,7 @@ xx/xx/2018 autofs-5.1.5 + - fix deadlock in dumpmaps. + - dont use array for path when not necessary. + - fix prefix option handling in expand_entry(). ++- fix sublink option not set from defaults. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/modules/parse_amd.c b/modules/parse_amd.c +index 1a5a2960..1c962fff 100644 +--- a/modules/parse_amd.c ++++ b/modules/parse_amd.c +@@ -645,6 +645,18 @@ static void update_with_defaults(struct amd_entry *defaults, + } + } + ++ if (!entry->sublink) { ++ if (defaults->sublink) { ++ tmp = strdup(defaults->sublink); ++ if (tmp) ++ entry->sublink = tmp; ++ } else { ++ v = macro_findvar(sv, "sublink", 2); ++ if (v) ++ entry->sublink = strdup(v->val); ++ } ++ } ++ + return; + } + diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch new file mode 100644 index 00000000..ff12fd93 --- /dev/null +++ b/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 + +Umm ... list_for_each() can't be used in do_master_list_reset() because +the subject entry of the loop is removed for the list within the loop +body. Therefore it can't be used to calculate the next pointer within a +for (...) loop. + +There is no list_for_each_safe() macro in the list.h of autofs so it +needs to be done manually. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + daemon/automount.c | 8 ++++++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 4faab510..2747327b 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -1,6 +1,7 @@ + xx/xx/2018 autofs-5.1.5 + - fix flag file permission. + - fix directory create permission. ++- fix use after free in do_master_list_reset(). + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/daemon/automount.c b/daemon/automount.c +index dcdc19fb..28b3f2f5 100644 +--- a/daemon/automount.c ++++ b/daemon/automount.c +@@ -2070,14 +2070,18 @@ static void remove_empty_args(char **argv, int *argc) + + static void do_master_list_reset(struct master *master) + { +- struct list_head *head, *p; ++ struct list_head *head, *p, *n; + + master_mutex_lock(); + + head = &master->mounts; +- list_for_each(p, head) { ++ n = head->next; ++ while (n != head) { + struct master_mapent *entry; + ++ p = n; ++ n = p->next; ++ + entry = list_entry(p, struct master_mapent, list); + + if (!list_empty(&entry->list)) diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-improve-hostname-lookup-error-logging.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-improve-hostname-lookup-error-logging.patch new file mode 100644 index 00000000..cfab93ec --- /dev/null +++ b/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 + +There's not enough information in name lookup log messages +to determine if the failed lookup is in fact a problem or +is expected. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + lib/parse_subs.c | 3 ++- + lib/rpc_subs.c | 3 ++- + modules/dclist.c | 4 +++- + modules/parse_amd.c | 9 ++++++--- + modules/replicated.c | 5 +++-- + 6 files changed, 17 insertions(+), 8 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index f771a433..596590a8 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -19,6 +19,7 @@ xx/xx/2018 autofs-5.1.5 + - add fedfs-map-nfs4.c. + - add conditional inclusion of fedfs binaries. + - add an example fedfs master map entry to the installed master map. ++- improve hostname lookup error logging. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/lib/parse_subs.c b/lib/parse_subs.c +index db784a58..841e81fd 100644 +--- a/lib/parse_subs.c ++++ b/lib/parse_subs.c +@@ -476,7 +476,8 @@ unsigned int get_network_proximity(const char *name) + + ret = getaddrinfo(name_or_num, NULL, &hints, &ni); + if (ret) { +- logerr("getaddrinfo: %s", gai_strerror(ret)); ++ logerr("hostname lookup for %s failed: %s", ++ name_or_num, gai_strerror(ret)); + return PROXIMITY_ERROR; + } + +diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c +index 60ede9f8..cc83e84d 100644 +--- a/lib/rpc_subs.c ++++ b/lib/rpc_subs.c +@@ -693,7 +693,8 @@ static int create_client(struct conn_info *info, CLIENT **client) + ret = getaddrinfo(info->host, NULL, &hints, &ai); + if (ret) { + error(LOGOPT_ANY, +- "hostname lookup failed: %s", gai_strerror(ret)); ++ "hostname lookup for %s failed: %s", ++ info->host, gai_strerror(ret)); + goto out_close; + } + +diff --git a/modules/dclist.c b/modules/dclist.c +index 4daa199b..ba32134d 100644 +--- a/modules/dclist.c ++++ b/modules/dclist.c +@@ -357,7 +357,9 @@ static char *getdnsdomainname(unsigned int logopt) + + ret = getaddrinfo(name, NULL, &hints, &ni); + if (ret) { +- error(logopt, "hostname lookup failed: %s", gai_strerror(ret)); ++ error(logopt, ++ "hostname lookup for %s failed: %s", ++ name, gai_strerror(ret)); + return NULL; + } + +diff --git a/modules/parse_amd.c b/modules/parse_amd.c +index e7debc56..9543ced3 100644 +--- a/modules/parse_amd.c ++++ b/modules/parse_amd.c +@@ -260,7 +260,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar + ret = getaddrinfo(v->val, NULL, &hints, &cni); + if (ret) { + error(logopt, MODPREFIX +- "hostname lookup failed: %s\n", gai_strerror(ret)); ++ "hostname lookup for %s failed: %s\n", ++ v->val, gai_strerror(ret)); + goto out; + } + +@@ -270,7 +271,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar + ret = getaddrinfo(name, NULL, &hints, &ni); + if (ret) { + error(logopt, MODPREFIX +- "hostname lookup failed: %s\n", gai_strerror(ret)); ++ "hostname lookup for %s failed: %s\n", ++ name, gai_strerror(ret)); + freeaddrinfo(cni); + goto out; + } +@@ -678,7 +680,8 @@ static char *normalize_hostname(unsigned int logopt, const char *host, + ret = getaddrinfo(host, NULL, &hints, &ni); + if (ret) { + error(logopt, MODPREFIX +- "hostname lookup failed: %s", gai_strerror(ret)); ++ "hostname lookup for %s failed: %s", ++ host, gai_strerror(ret)); + return NULL; + } + name = strdup(ni->ai_canonname); +diff --git a/modules/replicated.c b/modules/replicated.c +index f7b83236..740270ec 100644 +--- a/modules/replicated.c ++++ b/modules/replicated.c +@@ -1007,8 +1007,9 @@ try_name: + + ret = getaddrinfo(name, NULL, &hints, &ni); + if (ret) { +- error(LOGOPT_ANY, "hostname lookup failed: %s", +- gai_strerror(ret)); ++ error(LOGOPT_ANY, ++ "hostname lookup for %s failed: %s", ++ name, gai_strerror(ret)); + free(name); + return 0; + } diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch new file mode 100644 index 00000000..103612a4 --- /dev/null +++ b/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 + +When doing a forced shutdown umount_ent() tries a normal expire +first resulting in a fair amount of unnecessary log noise. + +Change umount_ent() to do a forced expire when a forced shutdown +has been requested to avoid the log noise. + +Signed-off-by: Ian Kent +--- + lib/mounts.c | 16 +++++++++------- + 1 file changed, 9 insertions(+), 7 deletions(-) + +diff --git a/lib/mounts.c b/lib/mounts.c +index a35503bf..e4092d2f 100644 +--- a/lib/mounts.c ++++ b/lib/mounts.c +@@ -2029,14 +2029,16 @@ int umount_ent(struct autofs_point *ap, const char *path) + { + int rv; + +- rv = spawn_umount(ap->logopt, path, NULL); +- /* We are doing a forced shutcwdown down so unlink busy mounts */ +- if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) { +- if (ap->state == ST_SHUTDOWN_FORCE) { +- info(ap->logopt, "forcing umount of %s", path); +- rv = spawn_umount(ap->logopt, "-l", path, NULL); +- } ++ if (ap->state != ST_SHUTDOWN_FORCE) ++ rv = spawn_umount(ap->logopt, path, NULL); ++ else { ++ /* We are doing a forced shutdown so unlink busy ++ * mounts */ ++ info(ap->logopt, "forcing umount of %s", path); ++ rv = spawn_umount(ap->logopt, "-l", path, NULL); ++ } + ++ if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) { + /* + * Verify that we actually unmounted the thing. This is a + * belt and suspenders approach to not eating user data. diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch new file mode 100644 index 00000000..b91191d5 --- /dev/null +++ b/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 + +(1) The word "to" is doubled in two warnings. + +(2) It prints a warning when it can't open the "old" config file, even +if it was able to open the default one. That's a reasonable warning if +it *couldn't* open the new one, but seems unnecessary if it could. + +The patch removes the unneeded "to"s and only prints warning about the +old config file if it couldn't open the default one. + +Signed-off-by: Todd Eigenschink +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + lib/defaults.c | 6 +++--- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index a5b79dd6..1e11c3d5 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -21,6 +21,7 @@ xx/xx/2018 autofs-5.1.5 + - add an example fedfs master map entry to the installed master map. + - improve hostname lookup error logging. + - fix rpm spec install premissions on auto.net and auto.smb. ++- tiny patch for autofs typo and possible bug. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/lib/defaults.c b/lib/defaults.c +index d20c1907..ae4d27c1 100644 +--- a/lib/defaults.c ++++ b/lib/defaults.c +@@ -1207,12 +1207,12 @@ unsigned int defaults_read_config(unsigned int to_syslog) + + conf = open_fopen_r(DEFAULT_CONFIG_FILE); + if (!conf) +- message(to_syslog, "failed to to open config %s", ++ message(to_syslog, "failed to open config %s", + DEFAULT_CONFIG_FILE); + + oldconf = open_fopen_r(OLD_CONFIG_FILE); +- if (!oldconf) +- message(to_syslog, "failed to to open old config %s", ++ if (!oldconf && !conf) ++ message(to_syslog, "failed to open old config %s", + OLD_CONFIG_FILE); + + /* Neither config has been updated */ diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-use-defines-for-expire-type.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-use-defines-for-expire-type.patch new file mode 100644 index 00000000..9198be51 --- /dev/null +++ b/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 + +The kernel defines for expire type such as an immediate expire +shoule be used to clearify what is being requested. + +AUTOFS_EXP_IMMEDIATE corresponds to a SIGUSR1 prune operation. + +AUTOFS_EXP_FORCE corresponds to an expire type not yet implemented in +the kernel, a SIGUSR2 forced expire. Define it in our internal autofs +kernel include file, the kernel will ignore it if it doesn't support it. + +AUTOFS_EXP_LEAVES is no longer used in autofs version 5. + +Finally add a define AUTOFS_EXP_NORMAL to indicate we're perfoming a +normal expire. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + daemon/state.c | 8 ++++---- + include/linux/auto_fs4.h | 6 ++++-- + include/state.h | 2 +- + 4 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index c5ebb7e0..0b7983ea 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -28,6 +28,7 @@ xx/xx/2018 autofs-5.1.5 + - fix fd leak in rpc_do_create_client(). + - add-man page note about extra slashes in paths. + - change expire type naming to better reflect usage. ++- use defines for expire type. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/daemon/state.c b/daemon/state.c +index ab235455..3d91f5b1 100644 +--- a/daemon/state.c ++++ b/daemon/state.c +@@ -645,7 +645,7 @@ static unsigned int st_prepare_shutdown(struct autofs_point *ap) + ap->state = ST_SHUTDOWN_PENDING; + + /* Unmount everything */ +- exp = expire_proc(ap, 1); ++ exp = expire_proc(ap, AUTOFS_EXP_IMMEDIATE); + switch (exp) { + case EXP_ERROR: + case EXP_PARTIAL: +@@ -671,7 +671,7 @@ static unsigned int st_force_shutdown(struct autofs_point *ap) + ap->state = ST_SHUTDOWN_FORCE; + + /* Unmount everything */ +- exp = expire_proc(ap, 1); ++ exp = expire_proc(ap, AUTOFS_EXP_FORCE | AUTOFS_EXP_IMMEDIATE); + switch (exp) { + case EXP_ERROR: + case EXP_PARTIAL: +@@ -706,7 +706,7 @@ static unsigned int st_prune(struct autofs_point *ap) + assert(ap->state == ST_READY); + ap->state = ST_PRUNE; + +- switch (expire_proc(ap, 1)) { ++ switch (expire_proc(ap, AUTOFS_EXP_IMMEDIATE)) { + case EXP_ERROR: + case EXP_PARTIAL: + if (!ap->submount) +@@ -727,7 +727,7 @@ static unsigned int st_expire(struct autofs_point *ap) + assert(ap->state == ST_READY); + ap->state = ST_EXPIRE; + +- switch (expire_proc(ap, 0)) { ++ switch (expire_proc(ap, AUTOFS_EXP_NORMAL)) { + case EXP_ERROR: + case EXP_PARTIAL: + if (!ap->submount) +diff --git a/include/linux/auto_fs4.h b/include/linux/auto_fs4.h +index e02982fa..9196e7bb 100644 +--- a/include/linux/auto_fs4.h ++++ b/include/linux/auto_fs4.h +@@ -27,8 +27,10 @@ + #define AUTOFS_PROTO_SUBVERSION 2 + + /* Mask for expire behaviour */ +-#define AUTOFS_EXP_IMMEDIATE 1 +-#define AUTOFS_EXP_LEAVES 2 ++#define AUTOFS_EXP_NORMAL 0x00 ++#define AUTOFS_EXP_IMMEDIATE 0x01 ++#define AUTOFS_EXP_LEAVES 0x02 ++#define AUTOFS_EXP_FORCE 0x04 + + #define AUTOFS_TYPE_ANY 0U + #define AUTOFS_TYPE_INDIRECT 1U +diff --git a/include/state.h b/include/state.h +index e3079c20..98f27d3f 100644 +--- a/include/state.h ++++ b/include/state.h +@@ -55,7 +55,7 @@ struct expire_args { + unsigned int signaled; + struct autofs_point *ap; /* autofs mount we are working on */ + enum states state; /* State prune or expire */ +- unsigned int how; /* Normal, immediate expire ? */ ++ unsigned int how; /* Normal, immediate, forced expire ? */ + int status; /* Return status */ + }; + diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch new file mode 100644 index 00000000..8f840f33 --- /dev/null +++ b/archive-patches/autofs-5.1.4/autofs-5.1.4-use-systemd-sd_notify-at-startup.patch @@ -0,0 +1,1572 @@ +autofs-5.1.4 - use systemd sd_notify() at startup + +From: Ian Kent + +autofs needs to ensure statd is started before any NFS mounts +are attempted. + +When starting the statd service with the autofs service the statd +service will trigger a restart of the autofs service during its +start up. Sometimes this can happen during the automount start up +itself. + +When this happens it causes systemd to become confused and remove +the pid file created by automount leaving systemd thinking the +autofs service had failed start up when it was actually running. + +It was recommened that autofs be changed to a "Type=notify" service +to avoid this. Using this a pid file is no longer needed and is now +not used. + +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + Makefile.conf.in | 3 + aclocal.m4 | 3 + autofs.spec | 1 + configure | 1136 ++++++++++++++++++++++++++------------------- + configure.in | 8 + daemon/Makefile | 5 + daemon/automount.c | 83 ++- + samples/autofs.service.in | 5 + 9 files changed, 729 insertions(+), 516 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index b9925cf7..e3ada7e7 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -23,6 +23,7 @@ xx/xx/2018 autofs-5.1.5 + - fix rpm spec install premissions on auto.net and auto.smb. + - tiny patch for autofs typo and possible bug. + - add units After line to include statd service. ++- use systemd sd_notify() at startup. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/Makefile.conf.in b/Makefile.conf.in +index 3fe1a0a0..ff9b18a1 100644 +--- a/Makefile.conf.in ++++ b/Makefile.conf.in +@@ -18,6 +18,9 @@ NSLLIB = @NSL_LIBS@ + NSLCFLAGS = @NSL_CFLAGS@ + LIBRESOLV = @LIBRESOLV@ + ++SYSTEMD = @WITH_SYSTEMD@ ++LIBSYSTEMD = @systemd_LIBS@ ++ + # Hesiod support: yes (1) no (0) + HESIOD = @HAVE_HESIOD@ + LIBHESIOD = @LIBHESIOD@ +diff --git a/aclocal.m4 b/aclocal.m4 +index f1ed3870..ec362bb4 100644 +--- a/aclocal.m4 ++++ b/aclocal.m4 +@@ -257,14 +257,17 @@ AC_DEFUN([AF_WITH_SYSTEMD], + fi + done + fi ++ WITH_SYSTEMD=0 + if test -n "$systemddir"; then + AC_MSG_RESULT($systemddir) ++ WITH_SYSTEMD=1 + else + AC_MSG_RESULT(not found) + fi + else + if test "$withval" != no; then + systemddir=$withval ++ WITH_SYSTEMD=1 + fi + fi]) + ]) +diff --git a/autofs.spec b/autofs.spec +index ac3b0a3f..f857d9da 100644 +--- a/autofs.spec ++++ b/autofs.spec +@@ -32,6 +32,7 @@ Source: https://www.kernel.org/pub/linux/daemons/autofs/v5/autofs-%{version}.tar + Buildroot: %{_tmppath}/%{name}-tmp + %if %{with_systemd} + BuildRequires: systemd-units ++BuildRequires: systemd-devel + %endif + %if %{with_libtirpc} + BuildRequires: libtirpc-devel +diff --git a/configure b/configure +index 9682b36f..827921ba 100755 +--- a/configure ++++ b/configure +@@ -674,6 +674,12 @@ MOUNT_NFS + HAVE_MOUNT + MOUNT + DMALLOCLIB ++TIRPC_LIBS ++TIRPC_CFLAGS ++flagdir ++fifodir ++mapdir ++confdir + OBJEXT + EXEEXT + ac_ct_CC +@@ -681,16 +687,13 @@ CPPFLAGS + LDFLAGS + CFLAGS + CC +-TIRPC_LIBS +-TIRPC_CFLAGS ++systemd_LIBS ++systemd_CFLAGS ++WITH_SYSTEMD ++systemddir + PKG_CONFIG_LIBDIR + PKG_CONFIG_PATH + PKG_CONFIG +-flagdir +-fifodir +-mapdir +-confdir +-systemddir + piddir + initdir + target_alias +@@ -760,13 +763,15 @@ target_alias + PKG_CONFIG + PKG_CONFIG_PATH + PKG_CONFIG_LIBDIR +-TIRPC_CFLAGS +-TIRPC_LIBS ++systemd_CFLAGS ++systemd_LIBS + CC + CFLAGS + LDFLAGS + LIBS + CPPFLAGS ++TIRPC_CFLAGS ++TIRPC_LIBS + NSL_CFLAGS + NSL_LIBS + CPP' +@@ -1413,9 +1418,10 @@ Some influential environment variables: + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path +- TIRPC_CFLAGS +- C compiler flags for TIRPC, overriding pkg-config +- TIRPC_LIBS linker flags for TIRPC, overriding pkg-config ++ systemd_CFLAGS ++ C compiler flags for systemd, overriding pkg-config ++ systemd_LIBS ++ linker flags for systemd, overriding pkg-config + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a +@@ -1423,6 +1429,9 @@ Some influential environment variables: + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory ++ TIRPC_CFLAGS ++ C compiler flags for TIRPC, overriding pkg-config ++ TIRPC_LIBS linker flags for TIRPC, overriding pkg-config + NSL_CFLAGS C compiler flags for NSL, overriding pkg-config + NSL_LIBS linker flags for NSL, overriding pkg-config + CPP C preprocessor +@@ -2291,166 +2300,6 @@ if test -z "$piddir"; then + fi + + +-# +-# Check for systemd unit files direectory exists if unit file installation +-# is requested +-# +- +-# Check whether --with-systemd was given. +-if test "${with_systemd+set}" = set; then : +- withval=$with_systemd; if test "$withval" = yes; then +- if test -z "$systemddir"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking location of the systemd unit files directory" >&5 +-$as_echo_n "checking location of the systemd unit files directory... " >&6; } +- for systemd_d in /usr/lib/systemd/system /usr/lib64/systemd/system /lib/systemd/system /lib64/systemd/system; do +- if test -z "$systemddir"; then +- if test -d "$systemd_d"; then +- systemddir="$systemd_d" +- fi +- fi +- done +- fi +- if test -n "$systemddir"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $systemddir" >&5 +-$as_echo "$systemddir" >&6; } +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +-$as_echo "not found" >&6; } +- fi +-else +- if test "$withval" != no; then +- systemddir=$withval +- fi +-fi +-fi +- +- +- +- +-# +-# Location of system config script directory? +-# +-if test -z "$confdir"; then +- for conf_d in /etc/sysconfig /etc/defaults /etc/conf.d /etc/default; do +- if test -z "$confdir"; then +- if test -d "$conf_d"; then +- confdir="$conf_d" +- fi +- fi +- done +-fi +- +-# Check whether --with-confdir was given. +-if test "${with_confdir+set}" = set; then : +- withval=$with_confdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" +- then +- : +- else +- confdir="${withval}" +- fi +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs configuration file directory" >&5 +-$as_echo_n "checking for autofs configuration file directory... " >&6; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $confdir" >&5 +-$as_echo "$confdir" >&6; } +- +- +-# +-# The user can specify --with-mapsdir=PATH to specify autofs maps go +-# +-if test -z "$mapdir"; then +- for map_d in /etc/autofs /etc; do +- if test -z "$mapdir"; then +- if test -d "$map_d"; then +- mapdir="$map_d" +- fi +- fi +- done +-fi +- +-# Check whether --with-mapdir was given. +-if test "${with_mapdir+set}" = set; then : +- withval=$with_mapdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" +- then +- : +- else +- mapdir="${withval}" +- fi +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs maps directory" >&5 +-$as_echo_n "checking for autofs maps directory... " >&6; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mapdir" >&5 +-$as_echo "$mapdir" >&6; } +- +- +-# +-# The user can specify --with-fifodir=PATH to specify where autofs fifos go +-# +-if test -z "$fifodir"; then +- for fifo_d in /run /var/run /tmp; do +- if test -z "$fifodir"; then +- if test -d "$fifo_d"; then +- fifodir="$fifo_d" +- fi +- fi +- done +-fi +- +-# Check whether --with-fifodir was given. +-if test "${with_fifodir+set}" = set; then : +- withval=$with_fifodir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" +- then +- : +- else +- fifodir="${withval}" +- fi +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs fifos directory" >&5 +-$as_echo_n "checking for autofs fifos directory... " >&6; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $fifodir" >&5 +-$as_echo "$fifodir" >&6; } +- +- +-# +-# The user can specify --with-flagdir=PATH to specify where autofs flag file goes +-# +-if test -z "$flagdir"; then +- for flag_d in /run /var/run /tmp; do +- if test -z "$flagdir"; then +- if test -d "$flag_d"; then +- flagdir="$flag_d" +- fi +- fi +- done +-fi +- +-# Check whether --with-flagdir was given. +-if test "${with_flagdir+set}" = set; then : +- withval=$with_flagdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" +- then +- : +- else +- flagdir="${withval}" +- fi +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs flag file directory" >&5 +-$as_echo_n "checking for autofs flag file directory... " >&6; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $flagdir" >&5 +-$as_echo "$flagdir" >&6; } +- +- +-# +-# Use libtirpc +-# +- + + + +@@ -2571,111 +2420,46 @@ $as_echo "no" >&6; } + fi + fi + +-# Check whether --with-libtirpc was given. +-if test "${with_libtirpc+set}" = set; then : +- withval=$with_libtirpc; +-fi +- +-if test "x$with_libtirpc" = "xyes"; then +- +-pkg_failed=no +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIRPC" >&5 +-$as_echo_n "checking for TIRPC... " >&6; } ++# ++# Check for systemd unit files direectory exists if unit file installation ++# is requested ++# + +-if test -n "$TIRPC_CFLAGS"; then +- pkg_cv_TIRPC_CFLAGS="$TIRPC_CFLAGS" +- elif test -n "$PKG_CONFIG"; then +- if test -n "$PKG_CONFIG" && \ +- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 +- ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- pkg_cv_TIRPC_CFLAGS=`$PKG_CONFIG --cflags "libtirpc" 2>/dev/null` +- test "x$?" != "x0" && pkg_failed=yes +-else +- pkg_failed=yes +-fi +- else +- pkg_failed=untried +-fi +-if test -n "$TIRPC_LIBS"; then +- pkg_cv_TIRPC_LIBS="$TIRPC_LIBS" +- elif test -n "$PKG_CONFIG"; then +- if test -n "$PKG_CONFIG" && \ +- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 +- ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- pkg_cv_TIRPC_LIBS=`$PKG_CONFIG --libs "libtirpc" 2>/dev/null` +- test "x$?" != "x0" && pkg_failed=yes ++# Check whether --with-systemd was given. ++if test "${with_systemd+set}" = set; then : ++ withval=$with_systemd; if test "$withval" = yes; then ++ if test -z "$systemddir"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking location of the systemd unit files directory" >&5 ++$as_echo_n "checking location of the systemd unit files directory... " >&6; } ++ for systemd_d in /usr/lib/systemd/system /usr/lib64/systemd/system /lib/systemd/system /lib64/systemd/system; do ++ if test -z "$systemddir"; then ++ if test -d "$systemd_d"; then ++ systemddir="$systemd_d" ++ fi ++ fi ++ done ++ fi ++ WITH_SYSTEMD=0 ++ if test -n "$systemddir"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $systemddir" >&5 ++$as_echo "$systemddir" >&6; } ++ WITH_SYSTEMD=1 ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 ++$as_echo "not found" >&6; } ++ fi + else +- pkg_failed=yes ++ if test "$withval" != no; then ++ systemddir=$withval ++ WITH_SYSTEMD=1 ++ fi + fi +- else +- pkg_failed=untried + fi + + + +-if test $pkg_failed = yes; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } + +-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then +- _pkg_short_errors_supported=yes +-else +- _pkg_short_errors_supported=no +-fi +- if test $_pkg_short_errors_supported = yes; then +- TIRPC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtirpc" 2>&1` +- else +- TIRPC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtirpc" 2>&1` +- fi +- # Put the nasty error message in config.log where it belongs +- echo "$TIRPC_PKG_ERRORS" >&5 +- +- as_fn_error $? "Package requirements (libtirpc) were not met: +- +-$TIRPC_PKG_ERRORS +- +-Consider adjusting the PKG_CONFIG_PATH environment variable if you +-installed software in a non-standard prefix. +- +-Alternatively, you may set the environment variables TIRPC_CFLAGS +-and TIRPC_LIBS to avoid the need to call pkg-config. +-See the pkg-config man page for more details." "$LINENO" 5 +-elif test $pkg_failed = untried; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +-is in your PATH or set the PKG_CONFIG environment variable to the full +-path to pkg-config. +- +-Alternatively, you may set the environment variables TIRPC_CFLAGS +-and TIRPC_LIBS to avoid the need to call pkg-config. +-See the pkg-config man page for more details. +- +-To get pkg-config, see . +-See \`config.log' for more details" "$LINENO" 5; } +-else +- TIRPC_CFLAGS=$pkg_cv_TIRPC_CFLAGS +- TIRPC_LIBS=$pkg_cv_TIRPC_LIBS +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- +- +-$as_echo "#define WITH_LIBTIRPC 1" >>confdefs.h +- +- +-$as_echo "#define TIRPC_WORKAROUND 1" >>confdefs.h +- +- +-fi +- ac_ext=c ++ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +@@ -3362,110 +3146,614 @@ elif test $ac_cv_prog_cc_g = yes; then + CFLAGS="-g" + fi + else +- if test "$GCC" = yes; then +- CFLAGS="-O2" +- else +- CFLAGS= +- fi ++ if test "$GCC" = yes; then ++ CFLAGS="-O2" ++ else ++ CFLAGS= ++ fi ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 ++$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } ++if ${ac_cv_prog_cc_c89+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_cv_prog_cc_c89=no ++ac_save_CC=$CC ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++#include ++struct stat; ++/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ ++struct buf { int x; }; ++FILE * (*rcsopen) (struct buf *, struct stat *, int); ++static char *e (p, i) ++ char **p; ++ int i; ++{ ++ return p[i]; ++} ++static char *f (char * (*g) (char **, int), char **p, ...) ++{ ++ char *s; ++ va_list v; ++ va_start (v,p); ++ s = g (p, va_arg (v,int)); ++ va_end (v); ++ return s; ++} ++ ++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has ++ function prototypes and stuff, but not '\xHH' hex character constants. ++ These don't provoke an error unfortunately, instead are silently treated ++ as 'x'. The following induces an error, until -std is added to get ++ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an ++ array size at least. It's necessary to write '\x00'==0 to get something ++ that's true only with -std. */ ++int osf4_cc_array ['\x00' == 0 ? 1 : -1]; ++ ++/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters ++ inside strings and character constants. */ ++#define FOO(x) 'x' ++int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; ++ ++int test (int i, double x); ++struct s1 {int (*f) (int a);}; ++struct s2 {int (*f) (double a);}; ++int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); ++int argc; ++char **argv; ++int ++main () ++{ ++return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ++ ; ++ return 0; ++} ++_ACEOF ++for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ ++ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" ++do ++ CC="$ac_save_CC $ac_arg" ++ if ac_fn_c_try_compile "$LINENO"; then : ++ ac_cv_prog_cc_c89=$ac_arg ++fi ++rm -f core conftest.err conftest.$ac_objext ++ test "x$ac_cv_prog_cc_c89" != "xno" && break ++done ++rm -f conftest.$ac_ext ++CC=$ac_save_CC ++ ++fi ++# AC_CACHE_VAL ++case "x$ac_cv_prog_cc_c89" in ++ x) ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 ++$as_echo "none needed" >&6; } ;; ++ xno) ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 ++$as_echo "unsupported" >&6; } ;; ++ *) ++ CC="$CC $ac_cv_prog_cc_c89" ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 ++$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; ++esac ++if test "x$ac_cv_prog_cc_c89" != xno; then : ++ ++fi ++ ++ac_ext=c ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ++ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ ++ ++ ++pkg_failed=no ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for systemd" >&5 ++$as_echo_n "checking for systemd... " >&6; } ++ ++if test -n "$systemd_CFLAGS"; then ++ pkg_cv_systemd_CFLAGS="$systemd_CFLAGS" ++ elif test -n "$PKG_CONFIG"; then ++ if test -n "$PKG_CONFIG" && \ ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "libsystemd") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; then ++ pkg_cv_systemd_CFLAGS=`$PKG_CONFIG --cflags "libsystemd" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ++else ++ pkg_failed=yes ++fi ++ else ++ pkg_failed=untried ++fi ++if test -n "$systemd_LIBS"; then ++ pkg_cv_systemd_LIBS="$systemd_LIBS" ++ elif test -n "$PKG_CONFIG"; then ++ if test -n "$PKG_CONFIG" && \ ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "libsystemd") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; then ++ pkg_cv_systemd_LIBS=`$PKG_CONFIG --libs "libsystemd" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ++else ++ pkg_failed=yes ++fi ++ else ++ pkg_failed=untried ++fi ++ ++ ++ ++if test $pkg_failed = yes; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ ++if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then ++ _pkg_short_errors_supported=yes ++else ++ _pkg_short_errors_supported=no ++fi ++ if test $_pkg_short_errors_supported = yes; then ++ systemd_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd" 2>&1` ++ else ++ systemd_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd" 2>&1` ++ fi ++ # Put the nasty error message in config.log where it belongs ++ echo "$systemd_PKG_ERRORS" >&5 ++ ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sm_notify in -lsystemd" >&5 ++$as_echo_n "checking for sm_notify in -lsystemd... " >&6; } ++if ${ac_cv_lib_systemd_sm_notify+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lsystemd $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char sm_notify (); ++int ++main () ++{ ++return sm_notify (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_lib_systemd_sm_notify=yes ++else ++ ac_cv_lib_systemd_sm_notify=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_systemd_sm_notify" >&5 ++$as_echo "$ac_cv_lib_systemd_sm_notify" >&6; } ++if test "x$ac_cv_lib_systemd_sm_notify" = xyes; then : ++ systemd_LIBS="-lsystemd" ++fi ++ ++ ++ ++elif test $pkg_failed = untried; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sm_notify in -lsystemd" >&5 ++$as_echo_n "checking for sm_notify in -lsystemd... " >&6; } ++if ${ac_cv_lib_systemd_sm_notify+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lsystemd $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char sm_notify (); ++int ++main () ++{ ++return sm_notify (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_lib_systemd_sm_notify=yes ++else ++ ac_cv_lib_systemd_sm_notify=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_systemd_sm_notify" >&5 ++$as_echo "$ac_cv_lib_systemd_sm_notify" >&6; } ++if test "x$ac_cv_lib_systemd_sm_notify" = xyes; then : ++ systemd_LIBS="-lsystemd" ++fi ++ ++ ++ ++else ++ systemd_CFLAGS=$pkg_cv_systemd_CFLAGS ++ systemd_LIBS=$pkg_cv_systemd_LIBS ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++fi ++ ++# ++# Location of system config script directory? ++# ++if test -z "$confdir"; then ++ for conf_d in /etc/sysconfig /etc/defaults /etc/conf.d /etc/default; do ++ if test -z "$confdir"; then ++ if test -d "$conf_d"; then ++ confdir="$conf_d" ++ fi ++ fi ++ done ++fi ++ ++# Check whether --with-confdir was given. ++if test "${with_confdir+set}" = set; then : ++ withval=$with_confdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" ++ then ++ : ++ else ++ confdir="${withval}" ++ fi ++ ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs configuration file directory" >&5 ++$as_echo_n "checking for autofs configuration file directory... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $confdir" >&5 ++$as_echo "$confdir" >&6; } ++ ++ ++# ++# The user can specify --with-mapsdir=PATH to specify autofs maps go ++# ++if test -z "$mapdir"; then ++ for map_d in /etc/autofs /etc; do ++ if test -z "$mapdir"; then ++ if test -d "$map_d"; then ++ mapdir="$map_d" ++ fi ++ fi ++ done ++fi ++ ++# Check whether --with-mapdir was given. ++if test "${with_mapdir+set}" = set; then : ++ withval=$with_mapdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" ++ then ++ : ++ else ++ mapdir="${withval}" ++ fi ++ ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs maps directory" >&5 ++$as_echo_n "checking for autofs maps directory... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mapdir" >&5 ++$as_echo "$mapdir" >&6; } ++ ++ ++# ++# The user can specify --with-fifodir=PATH to specify where autofs fifos go ++# ++if test -z "$fifodir"; then ++ for fifo_d in /run /var/run /tmp; do ++ if test -z "$fifodir"; then ++ if test -d "$fifo_d"; then ++ fifodir="$fifo_d" ++ fi ++ fi ++ done ++fi ++ ++# Check whether --with-fifodir was given. ++if test "${with_fifodir+set}" = set; then : ++ withval=$with_fifodir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" ++ then ++ : ++ else ++ fifodir="${withval}" ++ fi ++ ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs fifos directory" >&5 ++$as_echo_n "checking for autofs fifos directory... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $fifodir" >&5 ++$as_echo "$fifodir" >&6; } ++ ++ ++# ++# The user can specify --with-flagdir=PATH to specify where autofs flag file goes ++# ++if test -z "$flagdir"; then ++ for flag_d in /run /var/run /tmp; do ++ if test -z "$flagdir"; then ++ if test -d "$flag_d"; then ++ flagdir="$flag_d" ++ fi ++ fi ++ done ++fi ++ ++# Check whether --with-flagdir was given. ++if test "${with_flagdir+set}" = set; then : ++ withval=$with_flagdir; if test -z "$withval" -o "$withval" = "yes" -o "$withval" = "no" ++ then ++ : ++ else ++ flagdir="${withval}" ++ fi ++ ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for autofs flag file directory" >&5 ++$as_echo_n "checking for autofs flag file directory... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $flagdir" >&5 ++$as_echo "$flagdir" >&6; } ++ ++ ++# ++# Use libtirpc ++# ++ ++ ++ ++ ++ ++ ++ ++if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then ++ if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. ++set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_PKG_CONFIG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++fi ++PKG_CONFIG=$ac_cv_path_PKG_CONFIG ++if test -n "$PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 ++$as_echo "$PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++fi ++if test -z "$ac_cv_path_PKG_CONFIG"; then ++ ac_pt_PKG_CONFIG=$PKG_CONFIG ++ # Extract the first word of "pkg-config", so it can be a program name with args. ++set dummy pkg-config; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $ac_pt_PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++fi ++ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG ++if test -n "$ac_pt_PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 ++$as_echo "$ac_pt_PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ if test "x$ac_pt_PKG_CONFIG" = x; then ++ PKG_CONFIG="" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++ac_tool_warned=yes ;; ++esac ++ PKG_CONFIG=$ac_pt_PKG_CONFIG ++ fi ++else ++ PKG_CONFIG="$ac_cv_path_PKG_CONFIG" ++fi ++ ++fi ++if test -n "$PKG_CONFIG"; then ++ _pkg_min_version=0.9.0 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 ++$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } ++ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ PKG_CONFIG="" ++ fi ++fi ++ ++# Check whether --with-libtirpc was given. ++if test "${with_libtirpc+set}" = set; then : ++ withval=$with_libtirpc; ++fi ++ ++if test "x$with_libtirpc" = "xyes"; then ++ ++pkg_failed=no ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIRPC" >&5 ++$as_echo_n "checking for TIRPC... " >&6; } ++ ++if test -n "$TIRPC_CFLAGS"; then ++ pkg_cv_TIRPC_CFLAGS="$TIRPC_CFLAGS" ++ elif test -n "$PKG_CONFIG"; then ++ if test -n "$PKG_CONFIG" && \ ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; then ++ pkg_cv_TIRPC_CFLAGS=`$PKG_CONFIG --cflags "libtirpc" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ++else ++ pkg_failed=yes ++fi ++ else ++ pkg_failed=untried ++fi ++if test -n "$TIRPC_LIBS"; then ++ pkg_cv_TIRPC_LIBS="$TIRPC_LIBS" ++ elif test -n "$PKG_CONFIG"; then ++ if test -n "$PKG_CONFIG" && \ ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtirpc\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "libtirpc") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; then ++ pkg_cv_TIRPC_LIBS=`$PKG_CONFIG --libs "libtirpc" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ++else ++ pkg_failed=yes ++fi ++ else ++ pkg_failed=untried ++fi ++ ++ ++ ++if test $pkg_failed = yes; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ ++if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then ++ _pkg_short_errors_supported=yes ++else ++ _pkg_short_errors_supported=no + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if ${ac_cv_prog_cc_c89+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_prog_cc_c89=no +-ac_save_CC=$CC +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-struct stat; +-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +-struct buf { int x; }; +-FILE * (*rcsopen) (struct buf *, struct stat *, int); +-static char *e (p, i) +- char **p; +- int i; +-{ +- return p[i]; +-} +-static char *f (char * (*g) (char **, int), char **p, ...) +-{ +- char *s; +- va_list v; +- va_start (v,p); +- s = g (p, va_arg (v,int)); +- va_end (v); +- return s; +-} ++ if test $_pkg_short_errors_supported = yes; then ++ TIRPC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtirpc" 2>&1` ++ else ++ TIRPC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtirpc" 2>&1` ++ fi ++ # Put the nasty error message in config.log where it belongs ++ echo "$TIRPC_PKG_ERRORS" >&5 + +-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has +- function prototypes and stuff, but not '\xHH' hex character constants. +- These don't provoke an error unfortunately, instead are silently treated +- as 'x'. The following induces an error, until -std is added to get +- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an +- array size at least. It's necessary to write '\x00'==0 to get something +- that's true only with -std. */ +-int osf4_cc_array ['\x00' == 0 ? 1 : -1]; ++ as_fn_error $? "Package requirements (libtirpc) were not met: + +-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters +- inside strings and character constants. */ +-#define FOO(x) 'x' +-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; ++$TIRPC_PKG_ERRORS + +-int test (int i, double x); +-struct s1 {int (*f) (int a);}; +-struct s2 {int (*f) (double a);}; +-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +-int argc; +-char **argv; +-int +-main () +-{ +-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +- ; +- return 0; +-} +-_ACEOF +-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ +- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +-do +- CC="$ac_save_CC $ac_arg" +- if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_c89=$ac_arg +-fi +-rm -f core conftest.err conftest.$ac_objext +- test "x$ac_cv_prog_cc_c89" != "xno" && break +-done +-rm -f conftest.$ac_ext +-CC=$ac_save_CC ++Consider adjusting the PKG_CONFIG_PATH environment variable if you ++installed software in a non-standard prefix. + +-fi +-# AC_CACHE_VAL +-case "x$ac_cv_prog_cc_c89" in +- x) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; +- xno) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; +- *) +- CC="$CC $ac_cv_prog_cc_c89" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +-esac +-if test "x$ac_cv_prog_cc_c89" != xno; then : ++Alternatively, you may set the environment variables TIRPC_CFLAGS ++and TIRPC_LIBS to avoid the need to call pkg-config. ++See the pkg-config man page for more details." "$LINENO" 5 ++elif test $pkg_failed = untried; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it ++is in your PATH or set the PKG_CONFIG environment variable to the full ++path to pkg-config. + +-fi ++Alternatively, you may set the environment variables TIRPC_CFLAGS ++and TIRPC_LIBS to avoid the need to call pkg-config. ++See the pkg-config man page for more details. + +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu ++To get pkg-config, see . ++See \`config.log' for more details" "$LINENO" 5; } ++else ++ TIRPC_CFLAGS=$pkg_cv_TIRPC_CFLAGS ++ TIRPC_LIBS=$pkg_cv_TIRPC_LIBS ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++ ++$as_echo "#define WITH_LIBTIRPC 1" >>confdefs.h + + +-for ac_func in getrpcbyname getservbyname ++$as_echo "#define TIRPC_WORKAROUND 1" >>confdefs.h ++ ++ ++fi ++ for ac_func in getrpcbyname getservbyname + do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +@@ -4522,126 +4810,6 @@ fi + + + +- +- +- +- +- +- +-if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_path_PKG_CONFIG+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $PKG_CONFIG in +- [\\/]* | ?:[\\/]*) +- ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. +- ;; +- *) +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +- ;; +-esac +-fi +-PKG_CONFIG=$ac_cv_path_PKG_CONFIG +-if test -n "$PKG_CONFIG"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +-$as_echo "$PKG_CONFIG" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_path_PKG_CONFIG"; then +- ac_pt_PKG_CONFIG=$PKG_CONFIG +- # Extract the first word of "pkg-config", so it can be a program name with args. +-set dummy pkg-config; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $ac_pt_PKG_CONFIG in +- [\\/]* | ?:[\\/]*) +- ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. +- ;; +- *) +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +- ;; +-esac +-fi +-ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +-if test -n "$ac_pt_PKG_CONFIG"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +-$as_echo "$ac_pt_PKG_CONFIG" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_pt_PKG_CONFIG" = x; then +- PKG_CONFIG="" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- PKG_CONFIG=$ac_pt_PKG_CONFIG +- fi +-else +- PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +-fi +- +-fi +-if test -n "$PKG_CONFIG"; then +- _pkg_min_version=0.9.0 +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +-$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } +- if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +- PKG_CONFIG="" +- fi +-fi +- + pkg_failed=no + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NSL" >&5 + $as_echo_n "checking for NSL... " >&6; } +diff --git a/configure.in b/configure.in +index de06a96d..4b0a81f2 100644 +--- a/configure.in ++++ b/configure.in +@@ -48,6 +48,7 @@ AF_INIT_D() + AC_SUBST(initdir) + AF_PID_D() + AC_SUBST(piddir) ++PKG_PROG_PKG_CONFIG() + + # + # Check for systemd unit files direectory exists if unit file installation +@@ -55,6 +56,12 @@ AC_SUBST(piddir) + # + AF_WITH_SYSTEMD() + AC_SUBST(systemddir) ++AC_SUBST(WITH_SYSTEMD) ++PKG_CHECK_MODULES([systemd],[libsystemd],, ++[ ++ AC_CHECK_LIB(systemd, sm_notify, systemd_LIBS="-lsystemd") ++ AC_SUBST(systemd_LIBS) ++]) + + # + # Location of system config script directory? +@@ -218,7 +225,6 @@ fi + AC_CHECK_LIB(rt, clock_gettime, LIBCLOCK_GETTIME="-lrt") + AC_SUBST(LIBCLOCK_GETTIME) + +-PKG_PROG_PKG_CONFIG() + PKG_CHECK_MODULES([NSL],[libnsl],, + [ + AC_CHECK_LIB(nsl, yp_match, NSL_LIBS="-lnsl") +diff --git a/daemon/Makefile b/daemon/Makefile +index a455c683..a7ce430e 100644 +--- a/daemon/Makefile ++++ b/daemon/Makefile +@@ -22,6 +22,11 @@ CFLAGS += -DVERSION_STRING=\"$(version)\" + LDFLAGS += -rdynamic + LIBS += -ldl -lpthread + ++ifeq ($(SYSTEMD), 1) ++ CFLAGS += -DWITH_SYSTEMD ++ LIBS += $(LIBSYSTEMD) ++endif ++ + ifeq ($(LDAP), 1) + CFLAGS += $(XML_FLAGS) + LIBS += $(XML_LIBS) +diff --git a/daemon/automount.c b/daemon/automount.c +index 28b3f2f5..3fbfb9aa 100644 +--- a/daemon/automount.c ++++ b/daemon/automount.c +@@ -36,6 +36,9 @@ + #include + #include + #include ++#ifdef WITH_SYSTEMD ++#include ++#endif + + #include "automount.h" + #if defined(LIBXML2_WORKAROUND) || defined(TIRPC_WORKAROUND) +@@ -67,7 +70,7 @@ unsigned int global_selection_options; + long global_negative_timeout = -1; + int do_force_unlink = 0; /* Forceably unlink mount tree at startup */ + +-static int start_pipefd[2]; ++static int start_pipefd[2] = {-1, -1}; + static int st_stat = 1; + static int *pst_stat = &st_stat; + static pthread_t state_mach_thid; +@@ -1206,12 +1209,6 @@ static void become_daemon(unsigned foreground, unsigned daemon_check) + exit(0); + } + +- if (open_pipe(start_pipefd) < 0) { +- fprintf(stderr, "%s: failed to create start_pipefd.\n", +- program); +- exit(0); +- } +- + /* Detach from foreground process */ + if (foreground) { + if (daemon_check && !aquire_flag_file()) { +@@ -1221,6 +1218,12 @@ static void become_daemon(unsigned foreground, unsigned daemon_check) + } + log_to_stderr(); + } else { ++ if (open_pipe(start_pipefd) < 0) { ++ fprintf(stderr, "%s: failed to create start_pipefd.\n", ++ program); ++ exit(0); ++ } ++ + pid = fork(); + if (pid > 0) { + close(start_pipefd[1]); +@@ -2450,8 +2453,10 @@ int main(int argc, char *argv[]) + if (pthread_attr_init(&th_attr)) { + logerr("%s: failed to init thread attribute struct!", + program); +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } + release_flag_file(); + macro_free_global_table(); + exit(1); +@@ -2460,8 +2465,10 @@ int main(int argc, char *argv[]) + if (pthread_attr_init(&th_attr_detached)) { + logerr("%s: failed to init thread attribute struct!", + program); +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } + release_flag_file(); + macro_free_global_table(); + exit(1); +@@ -2471,8 +2478,10 @@ int main(int argc, char *argv[]) + &th_attr_detached, PTHREAD_CREATE_DETACHED)) { + logerr("%s: failed to set detached thread attribute!", + program); +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } + release_flag_file(); + macro_free_global_table(); + exit(1); +@@ -2483,8 +2492,10 @@ int main(int argc, char *argv[]) + &th_attr_detached, detached_thread_stack_size)) { + logerr("%s: failed to set stack size thread attribute!", + program); +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } + release_flag_file(); + macro_free_global_table(); + exit(1); +@@ -2495,8 +2506,10 @@ int main(int argc, char *argv[]) + &th_attr_detached, &detached_thread_stack_size)) { + logerr("%s: failed to get detached thread stack size!", + program); +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } + release_flag_file(); + macro_free_global_table(); + exit(1); +@@ -2513,8 +2526,10 @@ int main(int argc, char *argv[]) + logerr("%s: failed to create thread data key for std env vars!", + program); + master_kill(master_list); +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } + release_flag_file(); + macro_free_global_table(); + exit(1); +@@ -2525,8 +2540,10 @@ int main(int argc, char *argv[]) + logerr("%s: failed to create thread data key for attempt ID!", + program); + master_kill(master_list); +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } + release_flag_file(); + macro_free_global_table(); + exit(1); +@@ -2537,8 +2554,10 @@ int main(int argc, char *argv[]) + if (!alarm_start_handler()) { + logerr("%s: failed to create alarm handler thread!", program); + master_kill(master_list); +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } + release_flag_file(); + macro_free_global_table(); + exit(1); +@@ -2547,8 +2566,10 @@ int main(int argc, char *argv[]) + if (!st_start_handler()) { + logerr("%s: failed to create FSM handler thread!", program); + master_kill(master_list); +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } + release_flag_file(); + macro_free_global_table(); + exit(1); +@@ -2596,9 +2617,15 @@ int main(int argc, char *argv[]) + */ + do_force_unlink = 0; + +- st_stat = 0; +- res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); +- close(start_pipefd[1]); ++ if (start_pipefd[1] != -1) { ++ st_stat = 0; ++ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat)); ++ close(start_pipefd[1]); ++ } ++ ++#ifdef WITH_SYSTEMD ++ sd_notify(1, "READY=1"); ++#endif + + state_mach_thid = pthread_self(); + statemachine(NULL); +diff --git a/samples/autofs.service.in b/samples/autofs.service.in +index 766fc5a5..281d31ef 100644 +--- a/samples/autofs.service.in ++++ b/samples/autofs.service.in +@@ -4,10 +4,9 @@ After=network.target ypbind.service sssd.service network-online.target remote-fs + Wants=network-online.target rpc-statd.service rpcbind.service + + [Service] +-Type=forking +-PIDFile=@@autofspiddir@@/autofs.pid ++Type=notify + EnvironmentFile=-@@autofsconfdir@@/autofs +-ExecStart=@@sbindir@@/automount $OPTIONS --pid-file @@autofspiddir@@/autofs.pid ++ExecStart=@@sbindir@@/automount $OPTIONS --foreground --dont-check-daemon + ExecReload=/usr/bin/kill -HUP $MAINPID + KillMode=process + TimeoutSec=180 diff --git a/archive-patches/autofs-5.1.4/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch b/archive-patches/autofs-5.1.4/autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch new file mode 100644 index 00000000..f398e45c --- /dev/null +++ b/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 + +If several replicas have been specified for a mount point, +and use_hostname_for_mount is set to "yes", the selection +between these replicas is currently disabled and the last in +the list is always chosen. + +There is little point selecting between different addresses +for the one host in this case, but it is still worth +selecting between different hosts, particularly if different +weights have been specified. + +This patch restores the "prune_host_list()" functionality +when use_hostname_for_mount is set, and modifies it slightly +so that only on IP address for any host:/path entry in the +config file is willl be successfully probed. After a +success, further addresses from the same entry are skipped. +This is achieved by tracking an entry number ("ent_num") for +each 'struct host'. + +Signed-off-by: NeilBrown +Signed-off-by: Ian Kent +--- + CHANGELOG | 1 + + include/replicated.h | 3 ++- + modules/mount_nfs.c | 2 +- + modules/replicated.c | 35 ++++++++++++++++++++--------------- + 4 files changed, 24 insertions(+), 17 deletions(-) + +diff --git a/CHANGELOG b/CHANGELOG +index 2d5d5b1f..104fca90 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -9,6 +9,7 @@ xx/xx/2018 autofs-5.1.5 + - fix error return in do_nfs_mount(). + - add error handling for ext_mount_add(). + - account for recent libnsl changes. ++- use_hostname_for_mounts shouldn't prevent selection among replicas. + + 19/12/2017 autofs-5.1.4 + - fix spec file url. +diff --git a/include/replicated.h b/include/replicated.h +index 69ab7800..0f482d21 100644 +--- a/include/replicated.h ++++ b/include/replicated.h +@@ -57,6 +57,7 @@ + + struct host { + char *name; ++ int ent_num; + struct sockaddr *addr; + size_t addr_len; + unsigned int rr; +@@ -70,7 +71,7 @@ struct host { + }; + + void seed_random(void); +-struct host *new_host(const char *, struct sockaddr *, size_t, ++struct host *new_host(const char *, int, struct sockaddr *, size_t, + unsigned int, unsigned int, unsigned int); + void free_host_list(struct host **); + int parse_location(unsigned, struct host **, const char *, unsigned int); +diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c +index 77166544..4cf0cd27 100644 +--- a/modules/mount_nfs.c ++++ b/modules/mount_nfs.c +@@ -236,7 +236,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int + (vers & NFS4_VERS_MASK) != 0 && + !(vers & UDP6_REQUESTED)) { + unsigned int v4_probe_ok = 0; +- struct host *tmp = new_host(hosts->name, ++ struct host *tmp = new_host(hosts->name, 0, + hosts->addr, hosts->addr_len, + hosts->proximity, + hosts->weight, hosts->options); +diff --git a/modules/replicated.c b/modules/replicated.c +index 3ac4c70f..f7b83236 100644 +--- a/modules/replicated.c ++++ b/modules/replicated.c +@@ -83,7 +83,7 @@ void seed_random(void) + return; + } + +-struct host *new_host(const char *name, ++struct host *new_host(const char *name, int ent_num, + struct sockaddr *addr, size_t addr_len, + unsigned int proximity, unsigned int weight, + unsigned int options) +@@ -116,6 +116,7 @@ struct host *new_host(const char *name, + memset(new, 0, sizeof(struct host)); + + new->name = tmp1; ++ new->ent_num = ent_num; + new->addr_len = addr_len; + new->addr = tmp2; + new->proximity = proximity; +@@ -714,7 +715,7 @@ done: + int prune_host_list(unsigned logopt, struct host **list, + unsigned int vers, int port) + { +- struct host *this, *last, *first; ++ struct host *this, *last, *first, *prev; + struct host *new = NULL; + unsigned int proximity, selected_version = 0; + unsigned int v2_tcp_count, v3_tcp_count, v4_tcp_count; +@@ -726,12 +727,6 @@ int prune_host_list(unsigned logopt, struct host **list, + if (!*list) + return 0; + +- /* If we're using the host name then there's no point probing +- * avialability and respose time. +- */ +- if (defaults_use_hostname_for_mounts()) +- return 1; +- + /* Use closest hosts to choose NFS version */ + + first = *list; +@@ -877,11 +872,18 @@ int prune_host_list(unsigned logopt, struct host **list, + + first = last; + this = first; ++ prev = NULL; + while (this) { + struct host *next = this->next; + if (!this->name) { + remove_host(list, this); + add_host(&new, this); ++ } else if (defaults_use_hostname_for_mounts() && prev && ++ prev->ent_num == this->ent_num) { ++ /* When we use the hostname to mount, there is no ++ * point in probing every address it has, just one is ++ * enough. Skip the rest. ++ */ + } else { + status = get_supported_ver_and_cost(logopt, this, + selected_version, port); +@@ -889,6 +891,7 @@ int prune_host_list(unsigned logopt, struct host **list, + this->version = selected_version; + remove_host(list, this); + add_host(&new, this); ++ prev = this; + } + } + this = next; +@@ -901,7 +904,7 @@ int prune_host_list(unsigned logopt, struct host **list, + } + + static int add_new_host(struct host **list, +- const char *host, unsigned int weight, ++ const char *host, int ent_num, unsigned int weight, + struct addrinfo *host_addr, + unsigned int rr, unsigned int options) + { +@@ -940,7 +943,7 @@ static int add_new_host(struct host **list, + else + return 0; + +- new = new_host(host, host_addr->ai_addr, addr_len, prx, weight, options); ++ new = new_host(host, ent_num, host_addr->ai_addr, addr_len, prx, weight, options); + if (!new) + return 0; + +@@ -953,7 +956,7 @@ static int add_new_host(struct host **list, + return 1; + } + +-static int add_host_addrs(struct host **list, const char *host, ++static int add_host_addrs(struct host **list, const char *host, int ent_num, + unsigned int weight, unsigned int options) + { + struct addrinfo hints, *ni, *this; +@@ -988,7 +991,7 @@ static int add_host_addrs(struct host **list, const char *host, + + this = ni; + while (this) { +- ret = add_new_host(list, host, weight, this, 0, options); ++ ret = add_new_host(list, host, ent_num, weight, this, 0, options); + if (!ret) + break; + this = this->ai_next; +@@ -1027,7 +1030,7 @@ try_name: + rr++; + this = ni; + while (this) { +- ret = add_new_host(list, host, weight, this, rr, options); ++ ret = add_new_host(list, host, ent_num, weight, this, rr, options); + if (!ret) + break; + this = this->ai_next; +@@ -1120,6 +1123,7 @@ int parse_location(unsigned logopt, struct host **hosts, + { + char *str, *p, *delim; + unsigned int empty = 1; ++ int ent_num = 1; + + if (!list) + return 0; +@@ -1177,7 +1181,7 @@ int parse_location(unsigned logopt, struct host **hosts, + } + + if (p != delim) { +- if (!add_host_addrs(hosts, p, weight, options)) { ++ if (!add_host_addrs(hosts, p, ent_num, weight, options)) { + if (empty) { + p = next; + continue; +@@ -1199,7 +1203,7 @@ int parse_location(unsigned logopt, struct host **hosts, + *delim = '\0'; + next = delim + 1; + +- if (!add_host_addrs(hosts, p, weight, options)) { ++ if (!add_host_addrs(hosts, p, ent_num, weight, options)) { + p = next; + continue; + } +@@ -1213,6 +1217,7 @@ int parse_location(unsigned logopt, struct host **hosts, + return 0; + } + ++ ent_num++; + p = next; + } + diff --git a/archive-patches/autofs-5.1.4/patch_order-5.1.4 b/archive-patches/autofs-5.1.4/patch_order-5.1.4 new file mode 100644 index 00000000..e7185317 --- /dev/null +++ b/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 diff --git a/archive-patches/autofs-include-linux-nfs.h-directly-in-rpc_sub.patch b/archive-patches/autofs-include-linux-nfs.h-directly-in-rpc_sub.patch deleted file mode 100644 index 26f22653..00000000 --- a/archive-patches/autofs-include-linux-nfs.h-directly-in-rpc_sub.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 44bdce8c6ed9b30c1643e5981172a4f9025f013c Mon Sep 17 00:00:00 2001 -From: Andreas Oberritter -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 -Signed-off-by: Thomas Petazzoni -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 - #include --#include -+#include - #include - #include - --- -1.7.10.4 - diff --git a/make/system-tools.mk b/make/system-tools.mk index da75b52b..996315cb 100644 --- a/make/system-tools.mk +++ b/make/system-tools.mk @@ -453,17 +453,24 @@ $(D)/ntfs-3g: $(ARCHIVE)/ntfs-3g_ntfsprogs-$(NTFS3G_VER).tgz | $(TARGET_DIR) $(REMOVE)/ntfs-3g_ntfsprogs-$(NTFS3G_VER) 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) $(REMOVE)/autofs-$(AUTOFS5_VER) $(UNTAR)/autofs-$(AUTOFS5_VER).tar.gz cd $(BUILD_TMP)/autofs-$(AUTOFS5_VER) && \ - $(PATCH)/autofs-include-linux-nfs.h-directly-in-rpc_sub.patch && \ - export ac_cv_linux_procfs=yes && \ - export ac_cv_path_KRB5_CONFIG=no && \ - export ac_cv_path_MODPROBE=/sbin/modprobe && \ - export ac_cv_path_RANLIB=$(TARGET)-ranlib && \ + $(call apply_patches, $(AUTOFS_PATCH)) && \ + read; \ + export ac_cv_linux_procfs=yes && \ + export ac_cv_path_KRB5_CONFIG=no && \ + export ac_cv_path_MODPROBE=/sbin/modprobe && \ + export ac_cv_path_RANLIB=$(TARGET)-ranlib && \ autoreconf -fi && \ $(CONFIGURE) \ --prefix= \ @@ -489,6 +496,8 @@ $(D)/autofs5: $(D)/libtirpc $(ARCHIVE)/autofs-$(AUTOFS5_VER).tar.gz | $(TARGET_D $(REMOVE)/autofs-$(AUTOFS5_VER) touch $@ +# ----------------------------------------------------------------------------- + samba: samba-$(BOXSERIES) $(D)/samba-hd1: $(D)/zlib $(ARCHIVE)/samba-$(SAMBA33_VER).tar.gz | $(TARGET_DIR)