67 changed files with 1216 additions and 8407 deletions
@ -1,66 +0,0 @@ |
|||
autofs-5.1.4 - Makefiles.rules: remove 'samples' from SUBDIRS |
|||
|
|||
From: NeilBrown <neilb@suse.com> |
|||
|
|||
The rules in Makefile make it quite clear that |
|||
'samples' is not expected to be part of SUBDIRS. |
|||
e.g. |
|||
- The rule for "clean" handles both $(SUBDIRS) *and* samples. |
|||
- There are separate "install" and "install_samples" targets. |
|||
|
|||
However SUBDIRS does contain 'samples'. This means that |
|||
a simple "make; make install" will over-write your configuration files. |
|||
|
|||
So remove 'samples' from SUBDIRS. Note that it has been removed in |
|||
the past, but then got added back again. |
|||
|
|||
Signed-off-by: NeilBrown <neilb@suse.com> |
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
Makefile.rules | 2 +- |
|||
autofs.spec | 6 ++++++ |
|||
3 files changed, 8 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 313730b1..1e5ec15b 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -11,6 +11,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- account for recent libnsl changes. |
|||
- use_hostname_for_mounts shouldn't prevent selection among replicas. |
|||
- fix monotonic_elapsed. |
|||
+- Makefiles.rules: remove 'samples' from SUBDIRS.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/Makefile.rules b/Makefile.rules
|
|||
index 2bfa043c..4deab3b9 100644
|
|||
--- a/Makefile.rules
|
|||
+++ b/Makefile.rules
|
|||
@@ -3,7 +3,7 @@
|
|||
# |
|||
|
|||
# Root directory contents |
|||
-SUBDIRS = lib daemon modules man samples
|
|||
+SUBDIRS = lib daemon modules man
|
|||
INCDIRS = include |
|||
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \ |
|||
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \ |
|||
diff --git a/autofs.spec b/autofs.spec
|
|||
index 6da0655d..2464e741 100644
|
|||
--- a/autofs.spec
|
|||
+++ b/autofs.spec
|
|||
@@ -121,6 +121,12 @@ install -m 755 redhat/autofs.init $RPM_BUILD_ROOT/etc/rc.d/init.d/autofs
|
|||
install -m 644 redhat/autofs.conf $RPM_BUILD_ROOT/etc/autofs.conf |
|||
install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs |
|||
|
|||
+install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master
|
|||
+install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc
|
|||
+install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net
|
|||
+install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb
|
|||
+install -m 600 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf
|
|||
+
|
|||
%clean |
|||
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT |
|||
|
@ -1,557 +0,0 @@ |
|||
autofs-5.1.4 - account for recent libnsl changes |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The glibc RPC code has been dropped. |
|||
|
|||
The NIS functionality comes in the libnsl library but it installs |
|||
its files into sub directories of the system include and library |
|||
directories. |
|||
|
|||
So configure needs to check for this and allow for it in the |
|||
compile and linking of the NIS and NIS+ lookup modules. |
|||
---
|
|||
CHANGELOG | 1 |
|||
Makefile.conf.in | 4 - |
|||
Makefile.rules | 2 |
|||
aclocal.m4 | 45 ++++++++ |
|||
configure | 288 ++++++++++++++++++++++++++++++++++++++++++++++++--- |
|||
configure.in | 27 ++--- |
|||
include/config.h.in | 3 + |
|||
modules/Makefile | 10 ++ |
|||
8 files changed, 343 insertions(+), 37 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 9d19c0a7..2d5d5b1f 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -8,6 +8,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix sublink option not set from defaults. |
|||
- fix error return in do_nfs_mount(). |
|||
- add error handling for ext_mount_add(). |
|||
+- account for recent libnsl changes.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/Makefile.conf.in b/Makefile.conf.in
|
|||
index f879e262..85662654 100644
|
|||
--- a/Makefile.conf.in
|
|||
+++ b/Makefile.conf.in
|
|||
@@ -14,8 +14,8 @@ DAEMON_LDFLAGS = @DAEMON_LDFLAGS@
|
|||
# Glibc < 2.17 requires librt for clock_gettime() |
|||
LIBCLOCK_GETTIME = @LIBCLOCK_GETTIME@ |
|||
|
|||
-# Special parameters for glibc (libc 6)
|
|||
-LIBNSL = @LIBNSL@
|
|||
+NSLLIB = @NSL_LIBS@
|
|||
+NSLCFLAGS = @NSL_CFLAGS@
|
|||
LIBRESOLV = @LIBRESOLV@ |
|||
|
|||
# Hesiod support: yes (1) no (0) |
|||
diff --git a/Makefile.rules b/Makefile.rules
|
|||
index 0edf9bfe..2bfa043c 100644
|
|||
--- a/Makefile.rules
|
|||
+++ b/Makefile.rules
|
|||
@@ -54,8 +54,6 @@ ifdef DMALLOCLIB
|
|||
LIBS += $(DMALLOCLIB) |
|||
endif |
|||
|
|||
-LIBS += $(LIBNSL)
|
|||
-
|
|||
LIBS += $(LIBCLOCK_GETTIME) |
|||
|
|||
# Standard rules |
|||
diff --git a/aclocal.m4 b/aclocal.m4
|
|||
index 51772043..f1ed3870 100644
|
|||
--- a/aclocal.m4
|
|||
+++ b/aclocal.m4
|
|||
@@ -417,3 +417,48 @@ fi
|
|||
LIBS="$af_check_ldap_parse_page_control_save_libs" |
|||
]) |
|||
|
|||
+dnl --------------------------------------------------------------------------
|
|||
+dnl AF_CHECK_YPCLNT_HEADER
|
|||
+dnl
|
|||
+dnl Check for include file rpcsvc/ypclnt.h for YellowPages support.
|
|||
+dnl --------------------------------------------------------------------------
|
|||
+AC_DEFUN([AF_CHECK_YPCLNT_HEADER],
|
|||
+[
|
|||
+# save current CFLAGS
|
|||
+af_check_ypclnt_header_save_cflags="$CFLAGS"
|
|||
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
|
|||
+
|
|||
+HAVE_YPCLNT=0
|
|||
+AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1)
|
|||
+AC_SUBST(HAVE_YPCLNT)
|
|||
+if test "$HAVE_YPCLNT" = "1"; then
|
|||
+ AC_DEFINE(HAVE_YPCLNT, 1,
|
|||
+ [Define if using YellowPages])
|
|||
+fi
|
|||
+
|
|||
+# restore libs
|
|||
+CFLAGS="$af_check_ypclnt_header_save_cflags"
|
|||
+])
|
|||
+
|
|||
+dnl --------------------------------------------------------------------------
|
|||
+dnl AF_CHECK_NIS_HEADER
|
|||
+dnl
|
|||
+dnl Check for include file rpcsvc/nis.h for NIS+ support.
|
|||
+dnl --------------------------------------------------------------------------
|
|||
+AC_DEFUN([AF_CHECK_NIS_HEADER],
|
|||
+[
|
|||
+# save current CFLAGS
|
|||
+af_check_nis_header_save_cflags="$CFLAGS"
|
|||
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
|
|||
+
|
|||
+HAVE_NISPLUS=0
|
|||
+AC_CHECK_HEADER([rpcsvc/nis.h], HAVE_NISPLUS=1)
|
|||
+AC_SUBST(HAVE_NISPLUS)
|
|||
+if test "$HAVE_NISPLUS" = "1"; then
|
|||
+ AC_DEFINE(HAVE_NISPLUS, 1,
|
|||
+ [Define if using NIS+])
|
|||
+fi
|
|||
+
|
|||
+# restore libs
|
|||
+CFLAGS="$af_check_nis_header_save_cflags"
|
|||
+])
|
|||
diff --git a/configure b/configure
|
|||
index 476cea4b..2d517aac 100755
|
|||
--- a/configure
|
|||
+++ b/configure
|
|||
@@ -634,8 +634,8 @@ XML_FLAGS
|
|||
LIBLDAP |
|||
HAVE_LDAP |
|||
LDAP_FLAGS |
|||
-HAVE_YPCLNT
|
|||
HAVE_NISPLUS |
|||
+HAVE_YPCLNT
|
|||
EGREP |
|||
GREP |
|||
CPP |
|||
@@ -643,7 +643,8 @@ HESIOD_FLAGS
|
|||
LIBHESIOD |
|||
HAVE_HESIOD |
|||
LIBRESOLV |
|||
-LIBNSL
|
|||
+NSL_LIBS
|
|||
+NSL_CFLAGS
|
|||
LIBCLOCK_GETTIME |
|||
KRB5_CONFIG |
|||
XML_CONFIG |
|||
@@ -764,6 +765,8 @@ CFLAGS
|
|||
LDFLAGS |
|||
LIBS |
|||
CPPFLAGS |
|||
+NSL_CFLAGS
|
|||
+NSL_LIBS
|
|||
CPP' |
|||
|
|||
|
|||
@@ -1417,6 +1420,8 @@ Some influential environment variables:
|
|||
LIBS libraries to pass to the linker, e.g. -l<library> |
|||
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if |
|||
you have headers in a nonstandard directory <include dir> |
|||
+ NSL_CFLAGS C compiler flags for NSL, overriding pkg-config
|
|||
+ NSL_LIBS linker flags for NSL, overriding pkg-config
|
|||
CPP C preprocessor |
|||
|
|||
Use these variables to override the choices made by `configure' or to help |
|||
@@ -4500,9 +4505,186 @@ fi
|
|||
|
|||
|
|||
|
|||
-#
|
|||
-# glibc/libc 6 new libraries
|
|||
-#
|
|||
+
|
|||
+
|
|||
+
|
|||
+
|
|||
+
|
|||
+
|
|||
+
|
|||
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
|
|||
+ if test -n "$ac_tool_prefix"; then
|
|||
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
|
|||
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
|
|||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
|||
+$as_echo_n "checking for $ac_word... " >&6; }
|
|||
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
|
|||
+ $as_echo_n "(cached) " >&6
|
|||
+else
|
|||
+ case $PKG_CONFIG in
|
|||
+ [\\/]* | ?:[\\/]*)
|
|||
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
|
|||
+ ;;
|
|||
+ *)
|
|||
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
|||
+for as_dir in $PATH
|
|||
+do
|
|||
+ IFS=$as_save_IFS
|
|||
+ test -z "$as_dir" && as_dir=.
|
|||
+ for ac_exec_ext in '' $ac_executable_extensions; do
|
|||
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
|||
+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
|
|||
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
|||
+ break 2
|
|||
+ fi
|
|||
+done
|
|||
+ done
|
|||
+IFS=$as_save_IFS
|
|||
+
|
|||
+ ;;
|
|||
+esac
|
|||
+fi
|
|||
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
|
|||
+if test -n "$PKG_CONFIG"; then
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
|
|||
+$as_echo "$PKG_CONFIG" >&6; }
|
|||
+else
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|||
+$as_echo "no" >&6; }
|
|||
+fi
|
|||
+
|
|||
+
|
|||
+fi
|
|||
+if test -z "$ac_cv_path_PKG_CONFIG"; then
|
|||
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
|
|||
+ # Extract the first word of "pkg-config", so it can be a program name with args.
|
|||
+set dummy pkg-config; ac_word=$2
|
|||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
|||
+$as_echo_n "checking for $ac_word... " >&6; }
|
|||
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
|
|||
+ $as_echo_n "(cached) " >&6
|
|||
+else
|
|||
+ case $ac_pt_PKG_CONFIG in
|
|||
+ [\\/]* | ?:[\\/]*)
|
|||
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
|
|||
+ ;;
|
|||
+ *)
|
|||
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
|||
+for as_dir in $PATH
|
|||
+do
|
|||
+ IFS=$as_save_IFS
|
|||
+ test -z "$as_dir" && as_dir=.
|
|||
+ for ac_exec_ext in '' $ac_executable_extensions; do
|
|||
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
|||
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
|
|||
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
|||
+ break 2
|
|||
+ fi
|
|||
+done
|
|||
+ done
|
|||
+IFS=$as_save_IFS
|
|||
+
|
|||
+ ;;
|
|||
+esac
|
|||
+fi
|
|||
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
|
|||
+if test -n "$ac_pt_PKG_CONFIG"; then
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
|
|||
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
|
|||
+else
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|||
+$as_echo "no" >&6; }
|
|||
+fi
|
|||
+
|
|||
+ if test "x$ac_pt_PKG_CONFIG" = x; then
|
|||
+ PKG_CONFIG=""
|
|||
+ else
|
|||
+ case $cross_compiling:$ac_tool_warned in
|
|||
+yes:)
|
|||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
|
|||
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
|
|||
+ac_tool_warned=yes ;;
|
|||
+esac
|
|||
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
|
|||
+ fi
|
|||
+else
|
|||
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
|
|||
+fi
|
|||
+
|
|||
+fi
|
|||
+if test -n "$PKG_CONFIG"; then
|
|||
+ _pkg_min_version=0.9.0
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
|
|||
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
|
|||
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
|||
+$as_echo "yes" >&6; }
|
|||
+ else
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|||
+$as_echo "no" >&6; }
|
|||
+ PKG_CONFIG=""
|
|||
+ fi
|
|||
+fi
|
|||
+
|
|||
+pkg_failed=no
|
|||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NSL" >&5
|
|||
+$as_echo_n "checking for NSL... " >&6; }
|
|||
+
|
|||
+if test -n "$NSL_CFLAGS"; then
|
|||
+ pkg_cv_NSL_CFLAGS="$NSL_CFLAGS"
|
|||
+ elif test -n "$PKG_CONFIG"; then
|
|||
+ if test -n "$PKG_CONFIG" && \
|
|||
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5
|
|||
+ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5
|
|||
+ ac_status=$?
|
|||
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|||
+ test $ac_status = 0; }; then
|
|||
+ pkg_cv_NSL_CFLAGS=`$PKG_CONFIG --cflags "libnsl" 2>/dev/null`
|
|||
+ test "x$?" != "x0" && pkg_failed=yes
|
|||
+else
|
|||
+ pkg_failed=yes
|
|||
+fi
|
|||
+ else
|
|||
+ pkg_failed=untried
|
|||
+fi
|
|||
+if test -n "$NSL_LIBS"; then
|
|||
+ pkg_cv_NSL_LIBS="$NSL_LIBS"
|
|||
+ elif test -n "$PKG_CONFIG"; then
|
|||
+ if test -n "$PKG_CONFIG" && \
|
|||
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnsl\""; } >&5
|
|||
+ ($PKG_CONFIG --exists --print-errors "libnsl") 2>&5
|
|||
+ ac_status=$?
|
|||
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|||
+ test $ac_status = 0; }; then
|
|||
+ pkg_cv_NSL_LIBS=`$PKG_CONFIG --libs "libnsl" 2>/dev/null`
|
|||
+ test "x$?" != "x0" && pkg_failed=yes
|
|||
+else
|
|||
+ pkg_failed=yes
|
|||
+fi
|
|||
+ else
|
|||
+ pkg_failed=untried
|
|||
+fi
|
|||
+
|
|||
+
|
|||
+
|
|||
+if test $pkg_failed = yes; then
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|||
+$as_echo "no" >&6; }
|
|||
+
|
|||
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
|||
+ _pkg_short_errors_supported=yes
|
|||
+else
|
|||
+ _pkg_short_errors_supported=no
|
|||
+fi
|
|||
+ if test $_pkg_short_errors_supported = yes; then
|
|||
+ NSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libnsl" 2>&1`
|
|||
+ else
|
|||
+ NSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libnsl" 2>&1`
|
|||
+ fi
|
|||
+ # Put the nasty error message in config.log where it belongs
|
|||
+ echo "$NSL_PKG_ERRORS" >&5
|
|||
+
|
|||
+
|
|||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5 |
|||
$as_echo_n "checking for yp_match in -lnsl... " >&6; } |
|||
if ${ac_cv_lib_nsl_yp_match+:} false; then : |
|||
@@ -4540,10 +4722,66 @@ fi
|
|||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5 |
|||
$as_echo "$ac_cv_lib_nsl_yp_match" >&6; } |
|||
if test "x$ac_cv_lib_nsl_yp_match" = xyes; then : |
|||
- LIBNSL="-lnsl"
|
|||
+ NSL_LIBS="-lnsl"
|
|||
fi |
|||
|
|||
|
|||
+NSL_CFLAGS=""
|
|||
+
|
|||
+elif test $pkg_failed = untried; then
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|||
+$as_echo "no" >&6; }
|
|||
+
|
|||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_match in -lnsl" >&5
|
|||
+$as_echo_n "checking for yp_match in -lnsl... " >&6; }
|
|||
+if ${ac_cv_lib_nsl_yp_match+:} false; then :
|
|||
+ $as_echo_n "(cached) " >&6
|
|||
+else
|
|||
+ ac_check_lib_save_LIBS=$LIBS
|
|||
+LIBS="-lnsl $LIBS"
|
|||
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|||
+/* end confdefs.h. */
|
|||
+
|
|||
+/* Override any GCC internal prototype to avoid an error.
|
|||
+ Use char because int might match the return type of a GCC
|
|||
+ builtin and then its argument prototype would still apply. */
|
|||
+#ifdef __cplusplus
|
|||
+extern "C"
|
|||
+#endif
|
|||
+char yp_match ();
|
|||
+int
|
|||
+main ()
|
|||
+{
|
|||
+return yp_match ();
|
|||
+ ;
|
|||
+ return 0;
|
|||
+}
|
|||
+_ACEOF
|
|||
+if ac_fn_c_try_link "$LINENO"; then :
|
|||
+ ac_cv_lib_nsl_yp_match=yes
|
|||
+else
|
|||
+ ac_cv_lib_nsl_yp_match=no
|
|||
+fi
|
|||
+rm -f core conftest.err conftest.$ac_objext \
|
|||
+ conftest$ac_exeext conftest.$ac_ext
|
|||
+LIBS=$ac_check_lib_save_LIBS
|
|||
+fi
|
|||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_yp_match" >&5
|
|||
+$as_echo "$ac_cv_lib_nsl_yp_match" >&6; }
|
|||
+if test "x$ac_cv_lib_nsl_yp_match" = xyes; then :
|
|||
+ NSL_LIBS="-lnsl"
|
|||
+fi
|
|||
+
|
|||
+
|
|||
+NSL_CFLAGS=""
|
|||
+
|
|||
+else
|
|||
+ NSL_CFLAGS=$pkg_cv_NSL_CFLAGS
|
|||
+ NSL_LIBS=$pkg_cv_NSL_LIBS
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
|||
+$as_echo "yes" >&6; }
|
|||
+
|
|||
+fi
|
|||
|
|||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query in -lresolv" >&5 |
|||
$as_echo_n "checking for res_query in -lresolv... " >&6; } |
|||
@@ -4659,8 +4897,6 @@ fi
|
|||
|
|||
LDFLAGS="${AF_tmp_ldflags}" |
|||
|
|||
-# NIS+ support?
|
|||
-HAVE_NISPLUS=0
|
|||
ac_ext=c |
|||
ac_cpp='$CPP $CPPFLAGS' |
|||
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' |
|||
@@ -5058,15 +5294,11 @@ fi
|
|||
done |
|||
|
|||
|
|||
-ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default"
|
|||
-if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then :
|
|||
- HAVE_NISPLUS=1
|
|||
-fi
|
|||
-
|
|||
|
|||
+# save current CFLAGS
|
|||
+af_check_ypclnt_header_save_cflags="$CFLAGS"
|
|||
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
|
|||
|
|||
-
|
|||
-# YellowPages support?
|
|||
HAVE_YPCLNT=0 |
|||
ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/ypclnt.h" "ac_cv_header_rpcsvc_ypclnt_h" "$ac_includes_default" |
|||
if test "x$ac_cv_header_rpcsvc_ypclnt_h" = xyes; then : |
|||
@@ -5081,6 +5313,32 @@ $as_echo "#define HAVE_YPCLNT 1" >>confdefs.h
|
|||
|
|||
fi |
|||
|
|||
+# restore libs
|
|||
+CFLAGS="$af_check_ypclnt_header_save_cflags"
|
|||
+
|
|||
+
|
|||
+# save current CFLAGS
|
|||
+af_check_nis_header_save_cflags="$CFLAGS"
|
|||
+CFLAGS="$CFLAGS $NSL_CFLAGS $TIRPC_CFLAGS"
|
|||
+
|
|||
+HAVE_NISPLUS=0
|
|||
+ac_fn_c_check_header_mongrel "$LINENO" "rpcsvc/nis.h" "ac_cv_header_rpcsvc_nis_h" "$ac_includes_default"
|
|||
+if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then :
|
|||
+ HAVE_NISPLUS=1
|
|||
+fi
|
|||
+
|
|||
+
|
|||
+
|
|||
+if test "$HAVE_NISPLUS" = "1"; then
|
|||
+
|
|||
+$as_echo "#define HAVE_NISPLUS 1" >>confdefs.h
|
|||
+
|
|||
+fi
|
|||
+
|
|||
+# restore libs
|
|||
+CFLAGS="$af_check_nis_header_save_cflags"
|
|||
+
|
|||
+
|
|||
# |
|||
# OpenLDAP support? Expect that this may have a special directory... |
|||
# |
|||
diff --git a/configure.in b/configure.in
|
|||
index d3660923..d74775cc 100644
|
|||
--- a/configure.in
|
|||
+++ b/configure.in
|
|||
@@ -209,11 +209,13 @@ fi
|
|||
AC_CHECK_LIB(rt, clock_gettime, LIBCLOCK_GETTIME="-lrt") |
|||
AC_SUBST(LIBCLOCK_GETTIME) |
|||
|
|||
-#
|
|||
-# glibc/libc 6 new libraries
|
|||
-#
|
|||
-AC_CHECK_LIB(nsl, yp_match, LIBNSL="-lnsl")
|
|||
-AC_SUBST(LIBNSL)
|
|||
+PKG_PROG_PKG_CONFIG()
|
|||
+PKG_CHECK_MODULES([NSL],[libnsl],,
|
|||
+[
|
|||
+AC_CHECK_LIB(nsl, yp_match, NSL_LIBS="-lnsl")
|
|||
+AC_SUBST(NSL_LIBS)
|
|||
+NSL_CFLAGS=""
|
|||
+])
|
|||
|
|||
AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv") |
|||
AC_SUBST(LIBRESOLV) |
|||
@@ -254,19 +256,8 @@ AC_SUBST(LIBHESIOD)
|
|||
AC_SUBST(HESIOD_FLAGS) |
|||
LDFLAGS="${AF_tmp_ldflags}" |
|||
|
|||
-# NIS+ support?
|
|||
-HAVE_NISPLUS=0
|
|||
-AC_CHECK_HEADER(rpcsvc/nis.h, HAVE_NISPLUS=1)
|
|||
-AC_SUBST(HAVE_NISPLUS)
|
|||
-
|
|||
-# YellowPages support?
|
|||
-HAVE_YPCLNT=0
|
|||
-AC_CHECK_HEADER([rpcsvc/ypclnt.h], HAVE_YPCLNT=1)
|
|||
-AC_SUBST(HAVE_YPCLNT)
|
|||
-if test "$HAVE_YPCLNT" = "1"; then
|
|||
- AC_DEFINE(HAVE_YPCLNT, 1,
|
|||
- [Define if using YellowPages])
|
|||
-fi
|
|||
+AF_CHECK_YPCLNT_HEADER()
|
|||
+AF_CHECK_NIS_HEADER()
|
|||
|
|||
# |
|||
# OpenLDAP support? Expect that this may have a special directory... |
|||
diff --git a/include/config.h.in b/include/config.h.in
|
|||
index 04873e8f..991a2bda 100644
|
|||
--- a/include/config.h.in
|
|||
+++ b/include/config.h.in
|
|||
@@ -57,6 +57,9 @@
|
|||
/* define if you have MOUNT_NFS */ |
|||
#undef HAVE_MOUNT_NFS |
|||
|
|||
+/* Define if using NIS+ */
|
|||
+#undef HAVE_NISPLUS
|
|||
+
|
|||
/* define if the umount command supports the -c option */ |
|||
#undef HAVE_NO_CANON_UMOUNT |
|||
|
|||
diff --git a/modules/Makefile b/modules/Makefile
|
|||
index d9ab06c5..0447559a 100644
|
|||
--- a/modules/Makefile
|
|||
+++ b/modules/Makefile
|
|||
@@ -116,6 +116,16 @@ parse_amd.so: parse_amd.c amd_parse.tab.o amd_tok.o
|
|||
# |
|||
# Ad hoc compilation rules for modules which need auxilliary libraries |
|||
# |
|||
+lookup_yp.so: lookup_yp.c
|
|||
+ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_yp.so \
|
|||
+ lookup_yp.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB)
|
|||
+ $(STRIP) lookup_yp.so
|
|||
+
|
|||
+lookup_nisplus.so: lookup_nisplus.c
|
|||
+ $(CC) $(SOLDFLAGS) $(CFLAGS) $(NSLCFLAGS) -o lookup_nisplus.so \
|
|||
+ lookup_nisplus.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBS) $(NSLLIB)
|
|||
+ $(STRIP) lookup_nisplus.so
|
|||
+
|
|||
lookup_hesiod.so: lookup_hesiod.c |
|||
$(CC) $(SOLDFLAGS) $(CFLAGS) $(HESIOD_FLAGS) -o lookup_hesiod.so \ |
|||
lookup_hesiod.c $(LDFLAGS) $(AUTOFS_LIB) $(LIBHESIOD) $(LIBRESOLV) $(LIBS) |
@ -1,38 +0,0 @@ |
|||
autofs-5.1.4 - add NULL check in prepare_attempt_prefix() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
prepare_attempt_prefix() calls calloc(3) and continues without |
|||
checking if the allocation succeeded. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/log.c | 2 ++ |
|||
2 files changed, 3 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 0a56df5a..ad9932a2 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -43,6 +43,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- better handle hesiod support not built in. |
|||
- fix indent in automount(8) man page. |
|||
- remove autofs4 module load code. |
|||
+- add NULL check in prepare_attempt_prefix().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/lib/log.c b/lib/log.c
|
|||
index f6ab77c1..41f95fe8 100644
|
|||
--- a/lib/log.c
|
|||
+++ b/lib/log.c
|
|||
@@ -44,6 +44,8 @@ static char *prepare_attempt_prefix(const char *msg)
|
|||
|
|||
snprintf(buffer, ATTEMPT_ID_SIZE, "%02lx", *attempt_id); |
|||
prefixed_msg = (char *) calloc(len, sizeof(char)); |
|||
+ if (!prefixed_msg)
|
|||
+ return NULL;
|
|||
strcpy(prefixed_msg, buffer); |
|||
strcat(prefixed_msg, "|"); |
|||
strcat(prefixed_msg, msg); |
@ -1,42 +0,0 @@ |
|||
autofs-5.1.4 - add an example fedfs master map entry to the installed master map |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Add an example of using the fedfs program map (to facilitate access |
|||
to fedfs domain mounts) to the installed master map. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
samples/auto.master | 6 ++++++ |
|||
2 files changed, 7 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index bbe8019e..f771a433 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -18,6 +18,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add mount.fedfs.c. |
|||
- add fedfs-map-nfs4.c. |
|||
- add conditional inclusion of fedfs binaries. |
|||
+- add an example fedfs master map entry to the installed master map.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/samples/auto.master b/samples/auto.master
|
|||
index 0f2c8ab0..9a9968a3 100644
|
|||
--- a/samples/auto.master
|
|||
+++ b/samples/auto.master
|
|||
@@ -17,6 +17,12 @@
|
|||
# |
|||
+dir:/etc/auto.master.d |
|||
# |
|||
+# If you have fedfs set up and the related binaries, either
|
|||
+# built as part of autofs or installed from another package,
|
|||
+# uncomment this line to use the fedfs program map to access
|
|||
+# your fedfs mounts.
|
|||
+#/nfs4 /usr/sbin/fedfs-map-nfs4 nobind
|
|||
+#
|
|||
# Include central master map if it can be found using |
|||
# nsswitch sources. |
|||
# |
@ -1,184 +0,0 @@ |
|||
autofs-5.1.4 - add conditional inclusion of fedfs binaries |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Add conditional inclusion of the fedfs binaries. |
|||
|
|||
Using configure a --with-fedfs is needed to build and install |
|||
the fedfs binaries. |
|||
|
|||
Using rpmbuild -tb <autofs tar> it's necessary to add the option |
|||
--without fedfs to exclude the fedfs binaries from the resulting
|
|||
rpm package. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
Makefile.conf.in | 2 ++ |
|||
Makefile.rules | 6 +++++- |
|||
autofs.spec | 12 +++++++++++- |
|||
configure | 16 ++++++++++++++++ |
|||
configure.in | 9 +++++++++ |
|||
6 files changed, 44 insertions(+), 2 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 412e3382..bbe8019e 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -17,6 +17,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add fedfs-getsrvinfo.c. |
|||
- add mount.fedfs.c. |
|||
- add fedfs-map-nfs4.c. |
|||
+- add conditional inclusion of fedfs binaries.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/Makefile.conf.in b/Makefile.conf.in
|
|||
index 85662654..3fe1a0a0 100644
|
|||
--- a/Makefile.conf.in
|
|||
+++ b/Makefile.conf.in
|
|||
@@ -58,6 +58,8 @@ EXT3FS = @HAVE_E3FSCK@
|
|||
# Support for calling e4fsck when mounting ext4 filesystems |
|||
EXT4FS = @HAVE_E4FSCK@ |
|||
|
|||
+FEDFS = @ENABLE_FEDFS@
|
|||
+
|
|||
LEX = @PATH_LEX@ |
|||
YACC = @PATH_YACC@ |
|||
RPCGEN = @PATH_RPCGEN@ |
|||
diff --git a/Makefile.rules b/Makefile.rules
|
|||
index fc9f6019..2ccb1f6e 100644
|
|||
--- a/Makefile.rules
|
|||
+++ b/Makefile.rules
|
|||
@@ -3,12 +3,16 @@
|
|||
# |
|||
|
|||
# Root directory contents |
|||
-SUBDIRS = lib daemon fedfs modules man
|
|||
+SUBDIRS = lib daemon modules man
|
|||
INCDIRS = include |
|||
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \ |
|||
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \ |
|||
configure *.patch autofs.spec |
|||
|
|||
+ifeq ($(FEDFS), 1)
|
|||
+ SUBDIRS += fedfs
|
|||
+endif
|
|||
+
|
|||
# Attempt to be friends with autotools |
|||
INSTALLROOT = $(DESTDIR) |
|||
|
|||
diff --git a/autofs.spec b/autofs.spec
|
|||
index 157c09b4..2cb09ef0 100644
|
|||
--- a/autofs.spec
|
|||
+++ b/autofs.spec
|
|||
@@ -16,6 +16,10 @@
|
|||
# disable them. |
|||
%define with_libtirpc %{?_without_libtirpc: 0} %{?!_without_libtirpc: 1} |
|||
|
|||
+# Use --without fedfs in your rpmbuild command or force values to 0 to
|
|||
+# disable them.
|
|||
+%define with_fedfs %{?_without_fedfs: 0} %{?!_without_fedfs: 1}
|
|||
+
|
|||
Summary: A tool from automatically mounting and umounting filesystems. |
|||
Name: autofs |
|||
%define version 5.1.4 |
|||
@@ -82,6 +86,9 @@ echo %{version}-%{release} > .version
|
|||
%if %{with_libtirpc} |
|||
%define libtirpc_configure_arg --with-libtirpc |
|||
%endif |
|||
+%if %{with_fedfs}
|
|||
+ %define fedfs_configure_arg --enable-fedfs
|
|||
+%endif
|
|||
|
|||
%build |
|||
CFLAGS="$RPM_OPT_FLAGS -Wall" \ |
|||
@@ -90,7 +97,8 @@ LDFLAGS="-Wl,-z,now" \
|
|||
--disable-mount-locking \ |
|||
--enable-ignore-busy \ |
|||
%{?systemd_configure_arg:} \ |
|||
- %{?libtirpc_configure_arg:}
|
|||
+ %{?libtirpc_configure_arg:} \
|
|||
+ %{?fedfs_configure_arg:}
|
|||
CFLAGS="$RPM_OPT_FLAGS -Wall" LDFLAGS="-Wl,-z,now" make initdir=/etc/rc.d/init.d DONTSTRIP=1 |
|||
|
|||
%install |
|||
@@ -191,8 +199,10 @@ fi
|
|||
%config(noreplace) /etc/sysconfig/autofs |
|||
%config(noreplace) /etc/autofs_ldap_auth.conf |
|||
%{_sbindir}/automount |
|||
+%if %{with_fedfs}
|
|||
%{_sbindir}/mount.fedfs |
|||
%{_sbindir}/fedfs-map-nfs4 |
|||
+%endif
|
|||
%dir %{_libdir}/autofs |
|||
%{_libdir}/autofs/* |
|||
%{_mandir}/*/* |
|||
diff --git a/configure b/configure
|
|||
index 5c8aae30..9682b36f 100755
|
|||
--- a/configure
|
|||
+++ b/configure
|
|||
@@ -648,6 +648,7 @@ NSL_CFLAGS
|
|||
LIBCLOCK_GETTIME |
|||
KRB5_CONFIG |
|||
XML_CONFIG |
|||
+ENABLE_FEDFS
|
|||
sssldir |
|||
HAVE_SSS_AUTOFS |
|||
PATH_RPCGEN |
|||
@@ -743,6 +744,7 @@ with_libtirpc
|
|||
with_dmalloc |
|||
enable_sloppy_mount |
|||
enable_no_canon_umount |
|||
+enable_fedfs
|
|||
with_hesiod |
|||
with_openldap |
|||
with_sasl |
|||
@@ -1377,6 +1379,7 @@ Optional Features:
|
|||
--enable-FEATURE[=ARG] include FEATURE [ARG=yes] |
|||
--enable-sloppy-mount enable the use of the -s option to mount |
|||
--enable-no-canon-umount enable the use of the -c option to umount |
|||
+ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4
|
|||
--disable-ext-env disable search in environment for substitution variable |
|||
--disable-mount-locking disable use of locking when spawning mount command |
|||
--enable-force-shutdown enable USR1 signal to force unlink umount of any |
|||
@@ -4246,6 +4249,19 @@ $as_echo "#define HAVE_NO_CANON_UMOUNT 1" >>confdefs.h
|
|||
|
|||
fi |
|||
|
|||
+ENABLE_FEDFS=""
|
|||
+# Check whether --enable-fedfs was given.
|
|||
+if test "${enable_fedfs+set}" = set; then :
|
|||
+ enableval=$enable_fedfs;
|
|||
+else
|
|||
+ enable_fedfs=no
|
|||
+fi
|
|||
+
|
|||
+if test x$enable_fedfs = xyes; then
|
|||
+ ENABLE_FEDFS="1"
|
|||
+fi
|
|||
+
|
|||
+
|
|||
# LDAP SASL auth needs libxml and Kerberos |
|||
for ac_prog in xml2-config |
|||
do |
|||
diff --git a/configure.in b/configure.in
|
|||
index 4d1208f5..de06a96d 100644
|
|||
--- a/configure.in
|
|||
+++ b/configure.in
|
|||
@@ -195,6 +195,15 @@ if test x$enable_no_canon_umount = xyes; then
|
|||
AC_DEFINE(HAVE_NO_CANON_UMOUNT, 1, [define if the umount command supports the -c option]) |
|||
fi |
|||
|
|||
+ENABLE_FEDFS=""
|
|||
+AC_ARG_ENABLE(fedfs,
|
|||
+[ --enable-fedfs enable inclusion of fedfs binaries mount.fedfs and fedfs-map-nfs4],,
|
|||
+ enable_fedfs=no)
|
|||
+if test x$enable_fedfs = xyes; then
|
|||
+ ENABLE_FEDFS="1"
|
|||
+fi
|
|||
+AC_SUBST(ENABLE_FEDFS)
|
|||
+
|
|||
# LDAP SASL auth needs libxml and Kerberos |
|||
AF_CHECK_LIBXML() |
|||
AF_CHECK_KRB5() |
@ -1,121 +0,0 @@ |
|||
autofs-5.1.4 - add error handling for ext_mount_add() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Add error handling (memory allocation failures) for ext_mount_add(). |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/mounts.c | 5 +---- |
|||
modules/parse_amd.c | 42 ++++++++++++++++++++++++++++++------------ |
|||
3 files changed, 32 insertions(+), 16 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index d0cfa19b..9d19c0a7 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -7,6 +7,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix prefix option handling in expand_entry(). |
|||
- fix sublink option not set from defaults. |
|||
- fix error return in do_nfs_mount(). |
|||
+- add error handling for ext_mount_add().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/lib/mounts.c b/lib/mounts.c
|
|||
index 6fa304aa..f46fab2b 100644
|
|||
--- a/lib/mounts.c
|
|||
+++ b/lib/mounts.c
|
|||
@@ -715,15 +715,12 @@ int ext_mount_add(struct list_head *entry, const char *path, unsigned int umount
|
|||
} |
|||
|
|||
em = malloc(sizeof(struct ext_mount)); |
|||
- if (!em) {
|
|||
- ret = -1;
|
|||
+ if (!em)
|
|||
goto done; |
|||
- }
|
|||
|
|||
em->mountpoint = strdup(path); |
|||
if (!em->mountpoint) { |
|||
free(em); |
|||
- ret = -1;
|
|||
goto done; |
|||
} |
|||
em->umount = umount; |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index 2a5d9a30..e7debc56 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -1080,7 +1080,14 @@ static int do_generic_mount(struct autofs_point *ap, const char *name,
|
|||
umount = 1; |
|||
} |
|||
/* We have an external mount */ |
|||
- ext_mount_add(&entry->ext_mount, entry->fs, umount);
|
|||
+ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
|
|||
+ umount_ent(ap, entry->fs);
|
|||
+ error(ap->logopt, MODPREFIX
|
|||
+ "error: could not add external mount %s",
|
|||
+ entry->fs);
|
|||
+ ret = 1;
|
|||
+ goto out;
|
|||
+ }
|
|||
ret = do_link_mount(ap, name, entry, flags); |
|||
} |
|||
out: |
|||
@@ -1124,7 +1131,13 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name,
|
|||
umount = 1; |
|||
} |
|||
/* We might be using an external mount */ |
|||
- ext_mount_add(&entry->ext_mount, entry->fs, umount);
|
|||
+ if (!ext_mount_add(&entry->ext_mount, entry->fs, umount)) {
|
|||
+ umount_ent(ap, entry->fs);
|
|||
+ error(ap->logopt, MODPREFIX
|
|||
+ "error: could not add external mount %s", entry->fs);
|
|||
+ ret = 1;
|
|||
+ goto out;
|
|||
+ }
|
|||
ret = do_link_mount(ap, name, entry, flags); |
|||
} |
|||
out: |
|||
@@ -1309,6 +1322,9 @@ static int do_program_mount(struct autofs_point *ap,
|
|||
*/ |
|||
if (ext_mount_inuse(entry->fs)) { |
|||
rv = 0; |
|||
+ /* An external mount with path entry->fs exists
|
|||
+ * so ext_mount_add() won't fail.
|
|||
+ */
|
|||
ext_mount_add(&entry->ext_mount, entry->fs, 1); |
|||
} else { |
|||
rv = mkdir_path(entry->fs, mp_mode); |
|||
@@ -1325,17 +1341,19 @@ static int do_program_mount(struct autofs_point *ap,
|
|||
|
|||
rv = spawnv(ap->logopt, prog, (const char * const *) argv); |
|||
if (WIFEXITED(rv) && !WEXITSTATUS(rv)) { |
|||
- rv = 0;
|
|||
- ext_mount_add(&entry->ext_mount, entry->fs, 1);
|
|||
- debug(ap->logopt, MODPREFIX
|
|||
- "%s: mounted %s", entry->type, entry->fs);
|
|||
- } else {
|
|||
- if (!ext_mount_inuse(entry->fs))
|
|||
- rmdir_path(ap, entry->fs, ap->dev);
|
|||
- error(ap->logopt, MODPREFIX
|
|||
- "%s: failed to mount using: %s",
|
|||
- entry->type, entry->mount);
|
|||
+ if (ext_mount_add(&entry->ext_mount, entry->fs, 1)) {
|
|||
+ rv = 0;
|
|||
+ debug(ap->logopt, MODPREFIX
|
|||
+ "%s: mounted %s", entry->type, entry->fs);
|
|||
+ goto do_free;
|
|||
+ }
|
|||
+ umount_ent(ap, entry->fs);
|
|||
} |
|||
+
|
|||
+ if (!ext_mount_inuse(entry->fs))
|
|||
+ rmdir_path(ap, entry->fs, ap->dev);
|
|||
+ error(ap->logopt, MODPREFIX
|
|||
+ "%s: failed to mount using %s", entry->type, entry->mount);
|
|||
} |
|||
do_free: |
|||
free_argv(argc, (const char **) argv); |
@ -1,402 +0,0 @@ |
|||
autofs-5.1.4 - add fedfs-getsrvinfo.c |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Add the fedfs domain information discovery library functions. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 |
|||
fedfs/fedfs-getsrvinfo.c | 311 ++++++++++++++++++++++++++++++++++++++++++++++ |
|||
fedfs/fedfs-getsrvinfo.h | 52 ++++++++ |
|||
3 files changed, 364 insertions(+) |
|||
create mode 100644 fedfs/fedfs-getsrvinfo.c |
|||
create mode 100644 fedfs/fedfs-getsrvinfo.h |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index dbfb8389..8d6c737c 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -14,6 +14,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- Makefiles.rules: remove 'samples' from SUBDIRS. |
|||
- dont allow trailing slash in master map mount points. |
|||
- fix libresolv configure check. |
|||
+- add fedfs-getsrvinfo.c.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/fedfs/fedfs-getsrvinfo.c b/fedfs/fedfs-getsrvinfo.c
|
|||
new file mode 100644 |
|||
index 00000000..02ad16b5
|
|||
--- /dev/null
|
|||
+++ b/fedfs/fedfs-getsrvinfo.c
|
|||
@@ -0,0 +1,311 @@
|
|||
+/*
|
|||
+ * Copyright 2011 Oracle. All rights reserved.
|
|||
+ *
|
|||
+ * This file is part of fedfs-utils.
|
|||
+ *
|
|||
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
|||
+ * it under the terms of the GNU General Public License version 2.0 as
|
|||
+ * published by the Free Software Foundation.
|
|||
+ *
|
|||
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
|||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
+ * GNU General Public License version 2.0 for more details.
|
|||
+ *
|
|||
+ * You should have received a copy of the GNU General Public License
|
|||
+ * version 2.0 along with fedfs-utils. If not, see:
|
|||
+ *
|
|||
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
|||
+ */
|
|||
+
|
|||
+#ifdef HAVE_CONFIG_H
|
|||
+#include <config.h>
|
|||
+#endif
|
|||
+
|
|||
+#include <sys/types.h>
|
|||
+#include <sys/socket.h>
|
|||
+
|
|||
+#include <stdbool.h>
|
|||
+#include <string.h>
|
|||
+#include <unistd.h>
|
|||
+#include <stdlib.h>
|
|||
+#include <stdint.h>
|
|||
+
|
|||
+#include <stdio.h>
|
|||
+#include <errno.h>
|
|||
+#include <netdb.h>
|
|||
+#include <netinet/in.h>
|
|||
+#include <arpa/inet.h>
|
|||
+#include <arpa/nameser.h>
|
|||
+#include <arpa/nameser_compat.h>
|
|||
+#include <resolv.h>
|
|||
+
|
|||
+#include "fedfs-getsrvinfo.h"
|
|||
+
|
|||
+/**
|
|||
+ * Parsing overlay for DNS query result record header. Fields are
|
|||
+ * in network byte order.
|
|||
+ */
|
|||
+struct rechdr {
|
|||
+ uint16_t type;
|
|||
+ uint16_t class;
|
|||
+ uint32_t ttl;
|
|||
+ uint16_t length;
|
|||
+} __attribute__((__packed__));
|
|||
+
|
|||
+/**
|
|||
+ * Parsing overlay for DNS query result SRV record data. Fields
|
|||
+ * are in network byte order.
|
|||
+ */
|
|||
+struct srv {
|
|||
+ uint16_t priority;
|
|||
+ uint16_t weight;
|
|||
+ uint16_t port;
|
|||
+ unsigned char *target;
|
|||
+} __attribute__((__packed__));
|
|||
+
|
|||
+/**
|
|||
+ * Return C string matching error value of "status"
|
|||
+ *
|
|||
+ * @param status error status returned by getsrvinfo
|
|||
+ * @return pointer to static NUL-terminated C string containing error message
|
|||
+ */
|
|||
+const char *
|
|||
+gsi_strerror(int status)
|
|||
+{
|
|||
+ static char buf[256];
|
|||
+
|
|||
+ switch (status) {
|
|||
+ case ESI_SUCCESS:
|
|||
+ return "Success";
|
|||
+ case ESI_NONAME:
|
|||
+ return "Name not found";
|
|||
+ case ESI_AGAIN:
|
|||
+ return "Temporary failure in name resolution";
|
|||
+ case ESI_FAIL:
|
|||
+ return "Non-recoverable failure in name resolution";
|
|||
+ case ESI_NODATA:
|
|||
+ return "No SRV record returned";
|
|||
+ case ESI_SERVICE:
|
|||
+ return "Service is not available";
|
|||
+ case ESI_MEMORY:
|
|||
+ return "Memory allocation failure";
|
|||
+ case ESI_SYSTEM:
|
|||
+ snprintf(buf, sizeof(buf), "System error (%d): %s",
|
|||
+ status, strerror(errno));
|
|||
+ return buf;
|
|||
+ case ESI_PARSE:
|
|||
+ return "Failed to parse server response";
|
|||
+ }
|
|||
+
|
|||
+ snprintf(buf, sizeof(buf), "Unknown error (%d)", status);
|
|||
+ return buf;
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Release a list of SRV records allocated by getsrvinfo()
|
|||
+ *
|
|||
+ * @param si pointer to first element of a list of struct srvinfo
|
|||
+ *
|
|||
+ */
|
|||
+void freesrvinfo(struct srvinfo *si)
|
|||
+{
|
|||
+ struct srvinfo *tmp;
|
|||
+
|
|||
+ while (si != NULL) {
|
|||
+ tmp = si;
|
|||
+ si = si->si_next;
|
|||
+ free(tmp->si_target);
|
|||
+ free(tmp);
|
|||
+ }
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Ordering predicate for srvinfo lists
|
|||
+ *
|
|||
+ * @param a a srvinfo list element to compare
|
|||
+ * @param b another srvinfo list element to compare
|
|||
+ * @return true if "b" should fall later in the list than "a"
|
|||
+ *
|
|||
+ * See RFC 2782. The list is ordered as follows:
|
|||
+ *
|
|||
+ * o Lowest priority first.
|
|||
+ * o In each priority class, highest weight first.
|
|||
+ */
|
|||
+static _Bool
|
|||
+srvinfo_is_after(const struct srvinfo *a, const struct srvinfo *b)
|
|||
+{
|
|||
+ if (a->si_priority > b->si_priority)
|
|||
+ return true;
|
|||
+ if (a->si_priority < b->si_priority)
|
|||
+ return false;
|
|||
+
|
|||
+ if (a->si_weight < b->si_weight)
|
|||
+ return true;
|
|||
+ return false;
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Insert a srvinfo element into a list
|
|||
+ *
|
|||
+ * @param head pointer to head of list of elements
|
|||
+ * @param entry new list element to insert
|
|||
+ *
|
|||
+ */
|
|||
+static void
|
|||
+insert_srvinfo(struct srvinfo **head, struct srvinfo *entry)
|
|||
+{
|
|||
+ entry->si_next = *head;
|
|||
+ *head = entry;
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Insert a srvinfo element into a list, in order
|
|||
+ *
|
|||
+ * @param head pointer to head of list of elements
|
|||
+ * @param entry new list element to insert
|
|||
+ *
|
|||
+ */
|
|||
+static void
|
|||
+insert_srvinfo_sorted(struct srvinfo **head, struct srvinfo *entry)
|
|||
+{
|
|||
+ struct srvinfo *spot, *back;
|
|||
+
|
|||
+ spot = *head;
|
|||
+ back = NULL;
|
|||
+ while (spot && srvinfo_is_after(spot, entry)) {
|
|||
+ back = spot;
|
|||
+ spot = spot->si_next;
|
|||
+ }
|
|||
+
|
|||
+ if (spot == (*head))
|
|||
+ insert_srvinfo(head, entry);
|
|||
+ else {
|
|||
+ insert_srvinfo(&spot, entry);
|
|||
+ /* off the end of the list? */
|
|||
+ if (spot == entry)
|
|||
+ back->si_next = entry;
|
|||
+ }
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Retrieve list of SRV records from DNS service
|
|||
+ *
|
|||
+ * @param srvname NUL-terminated C string containing record type to look up
|
|||
+ * @param domainname NUL-terminated C string containing domain name to look up
|
|||
+ * @param si OUT: list of SRV record information retrieved
|
|||
+ * @return zero on success, or an ESI_ status code describing the error
|
|||
+ *
|
|||
+ * Caller must free list of records using freesrvinfo().
|
|||
+ */
|
|||
+int
|
|||
+getsrvinfo(const char *srvname, const char *domainname, struct srvinfo **si)
|
|||
+{
|
|||
+ unsigned char *msg, *eom, *comp_dn;
|
|||
+ struct srvinfo *results;
|
|||
+ unsigned short count, i;
|
|||
+ int status, len;
|
|||
+ char *exp_dn;
|
|||
+ HEADER *hdr;
|
|||
+
|
|||
+ msg = calloc(1, NS_MAXMSG);
|
|||
+ exp_dn = calloc(1, NS_MAXDNAME);
|
|||
+ if (msg == NULL || exp_dn == NULL) {
|
|||
+ status = ESI_MEMORY;
|
|||
+ goto out;
|
|||
+ }
|
|||
+
|
|||
+ _res.options |= RES_AAONLY;
|
|||
+ len = res_querydomain(srvname, domainname, C_IN, T_SRV, msg, NS_MAXMSG);
|
|||
+ if (len == -1) {
|
|||
+ switch (h_errno) {
|
|||
+ case HOST_NOT_FOUND:
|
|||
+ status = ESI_NONAME;
|
|||
+ break;
|
|||
+ case TRY_AGAIN:
|
|||
+ status = ESI_AGAIN;
|
|||
+ break;
|
|||
+ case NO_RECOVERY:
|
|||
+ status = ESI_FAIL;
|
|||
+ break;
|
|||
+ case NO_DATA:
|
|||
+ status = ESI_NODATA;
|
|||
+ break;
|
|||
+ default:
|
|||
+ fprintf(stderr, "SRV query failed for %s.%s: %s\n",
|
|||
+ srvname, domainname, hstrerror(h_errno));
|
|||
+ status = ESI_FAIL;
|
|||
+ }
|
|||
+ goto out;
|
|||
+ }
|
|||
+
|
|||
+ hdr = (HEADER *)msg;
|
|||
+ count = ntohs(hdr->ancount);
|
|||
+ if (count == 0) {
|
|||
+ status = ESI_NODATA;
|
|||
+ goto out;
|
|||
+ }
|
|||
+ eom = msg + len;
|
|||
+
|
|||
+ comp_dn = &msg[HFIXEDSZ];
|
|||
+ comp_dn += dn_skipname(comp_dn, eom) + QFIXEDSZ;
|
|||
+
|
|||
+ results = NULL;
|
|||
+ for (i = 0; i < count; i++) {
|
|||
+ struct srvinfo *new;
|
|||
+ struct srv *record;
|
|||
+ int l;
|
|||
+
|
|||
+ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME);
|
|||
+ if (l == -1) {
|
|||
+ status = ESI_PARSE;
|
|||
+ goto out_free;
|
|||
+ }
|
|||
+ comp_dn += l;
|
|||
+
|
|||
+ record = (struct srv *)&comp_dn[10];
|
|||
+ comp_dn += 16;
|
|||
+
|
|||
+ l = dn_expand(msg, eom, comp_dn, exp_dn, NS_MAXDNAME);
|
|||
+ if (l == -1) {
|
|||
+ status = ESI_PARSE;
|
|||
+ goto out_free;
|
|||
+ }
|
|||
+ comp_dn += l;
|
|||
+
|
|||
+ if (count == 1 && strcmp(exp_dn, ".") == 0) {
|
|||
+ status = ESI_SERVICE;
|
|||
+ goto out_free;
|
|||
+ }
|
|||
+
|
|||
+ new = calloc(1, sizeof(*new));
|
|||
+ if (new == NULL) {
|
|||
+ status = ESI_MEMORY;
|
|||
+ goto out;
|
|||
+ }
|
|||
+
|
|||
+ new->si_target = strdup(exp_dn);
|
|||
+ if (new->si_target == NULL) {
|
|||
+ free(new);
|
|||
+ status = ESI_MEMORY;
|
|||
+ goto out;
|
|||
+ }
|
|||
+ new->si_priority = ntohs(record->priority);
|
|||
+ new->si_weight = ntohs(record->weight);
|
|||
+ new->si_port = ntohs(record->port);
|
|||
+
|
|||
+ insert_srvinfo_sorted(&results, new);
|
|||
+ }
|
|||
+
|
|||
+ status = ESI_SUCCESS;
|
|||
+ *si = results;
|
|||
+
|
|||
+out:
|
|||
+ free(exp_dn);
|
|||
+ free(msg);
|
|||
+ return status;
|
|||
+
|
|||
+out_free:
|
|||
+ freesrvinfo(results);
|
|||
+ goto out;
|
|||
+}
|
|||
diff --git a/fedfs/fedfs-getsrvinfo.h b/fedfs/fedfs-getsrvinfo.h
|
|||
new file mode 100644 |
|||
index 00000000..13170359
|
|||
--- /dev/null
|
|||
+++ b/fedfs/fedfs-getsrvinfo.h
|
|||
@@ -0,0 +1,52 @@
|
|||
+/*
|
|||
+ * Copyright 2011 Oracle. All rights reserved.
|
|||
+ *
|
|||
+ * This file is part of fedfs-utils.
|
|||
+ *
|
|||
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
|||
+ * it under the terms of the GNU General Public License version 2.0 as
|
|||
+ * published by the Free Software Foundation.
|
|||
+ *
|
|||
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
|||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
+ * GNU General Public License version 2.0 for more details.
|
|||
+ *
|
|||
+ * You should have received a copy of the GNU General Public License
|
|||
+ * version 2.0 along with fedfs-utils. If not, see:
|
|||
+ *
|
|||
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
|||
+ */
|
|||
+
|
|||
+#ifndef _FEDFS_GETSRVINFO_H_
|
|||
+#define _FEDFS_GETSRVINFO_H_
|
|||
+
|
|||
+/**
|
|||
+ * Single list element containing SRV record data
|
|||
+ */
|
|||
+struct srvinfo {
|
|||
+ struct srvinfo *si_next;
|
|||
+ char *si_target;
|
|||
+ unsigned short si_priority;
|
|||
+ unsigned short si_weight;
|
|||
+ unsigned short si_port;
|
|||
+};
|
|||
+
|
|||
+enum {
|
|||
+ ESI_SUCCESS = 0,
|
|||
+ ESI_NONAME = -2,
|
|||
+ ESI_AGAIN = -3,
|
|||
+ ESI_FAIL = -4,
|
|||
+ ESI_NODATA = -5,
|
|||
+ ESI_SERVICE = -8,
|
|||
+ ESI_MEMORY = -10,
|
|||
+ ESI_SYSTEM = -11,
|
|||
+ ESI_PARSE = -1000,
|
|||
+};
|
|||
+
|
|||
+int getsrvinfo(const char *srvname, const char *domainname,
|
|||
+ struct srvinfo **si);
|
|||
+void freesrvinfo(struct srvinfo *si);
|
|||
+const char *gsi_strerror(int status);
|
|||
+
|
|||
+#endif /* !_FEDFS_GETSRVINFO_H_ */
|
@ -1,342 +0,0 @@ |
|||
autofs-5.1.4 - add fedfs-map-nfs4.c |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Add build (and install) of the fedfs program map, fedfs-map-nfs4. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 |
|||
autofs.spec | 1 |
|||
fedfs/Makefile | 12 ++- |
|||
fedfs/fedfs-map-nfs4.c | 204 ++++++++++++++++++++++++++++++++++++++++++++++++ |
|||
fedfs/fedfs-token.h | 40 +++++++++ |
|||
5 files changed, 256 insertions(+), 2 deletions(-) |
|||
create mode 100644 fedfs/fedfs-map-nfs4.c |
|||
create mode 100644 fedfs/fedfs-token.h |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 88992147..412e3382 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -16,6 +16,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix libresolv configure check. |
|||
- add fedfs-getsrvinfo.c. |
|||
- add mount.fedfs.c. |
|||
+- add fedfs-map-nfs4.c.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/autofs.spec b/autofs.spec
|
|||
index 2cc0e38f..157c09b4 100644
|
|||
--- a/autofs.spec
|
|||
+++ b/autofs.spec
|
|||
@@ -192,6 +192,7 @@ fi
|
|||
%config(noreplace) /etc/autofs_ldap_auth.conf |
|||
%{_sbindir}/automount |
|||
%{_sbindir}/mount.fedfs |
|||
+%{_sbindir}/fedfs-map-nfs4
|
|||
%dir %{_libdir}/autofs |
|||
%{_libdir}/autofs/* |
|||
%{_mandir}/*/* |
|||
diff --git a/fedfs/Makefile b/fedfs/Makefile
|
|||
index cb325bed..dff749e4 100644
|
|||
--- a/fedfs/Makefile
|
|||
+++ b/fedfs/Makefile
|
|||
@@ -6,11 +6,13 @@
|
|||
include ../Makefile.rules |
|||
|
|||
SRCS = mount.fedfs.c |
|||
-HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h
|
|||
+HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h \
|
|||
+ fedfs-token.h
|
|||
|
|||
fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o |
|||
|
|||
mount_fedfs_OBJ = mount.fedfs.o |
|||
+fedfs-map-nfs4_OBJ = fedfs-map-nfs4.o
|
|||
|
|||
version := $(shell cat ../.version) |
|||
|
|||
@@ -18,18 +20,24 @@ CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include
|
|||
CFLAGS += -DVERSION_STRING=\"$(version)\" |
|||
LDFLAGS += -rdynamic |
|||
|
|||
-all: mount.fedfs
|
|||
+all: mount.fedfs fedfs-map-nfs4
|
|||
|
|||
mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS) |
|||
$(CC) -o mount.fedfs \ |
|||
$(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \ |
|||
$(LDFLAGS) $(LIBRESOLV) $(LIBS) |
|||
|
|||
+fedfs-map-nfs4: $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
|
|||
+ $(CC) -o fedfs-map-nfs4 \
|
|||
+ $(fedfs-map-nfs4_OBJ) $(fedfs-getsrvinfo_OBJ) \
|
|||
+ $(LDFLAGS) $(LIBRESOLV) $(LIBS)
|
|||
+
|
|||
clean: |
|||
rm -f *.o *.s *~ mount.fedfs |
|||
|
|||
install: all |
|||
install -d -m 755 $(INSTALLROOT)$(sbindir) |
|||
+ install -c fedfs-map-nfs4 -m 755 $(INSTALLROOT)$(sbindir); \
|
|||
if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \ |
|||
then \ |
|||
install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \ |
|||
diff --git a/fedfs/fedfs-map-nfs4.c b/fedfs/fedfs-map-nfs4.c
|
|||
new file mode 100644 |
|||
index 00000000..9f831cd7
|
|||
--- /dev/null
|
|||
+++ b/fedfs/fedfs-map-nfs4.c
|
|||
@@ -0,0 +1,204 @@
|
|||
+/*
|
|||
+ * Copyright 2011 Oracle. All rights reserved.
|
|||
+ *
|
|||
+ * This file is part of fedfs-utils.
|
|||
+ *
|
|||
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
|||
+ * it under the terms of the GNU General Public License version 2.0 as
|
|||
+ * published by the Free Software Foundation.
|
|||
+ *
|
|||
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
|||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
+ * GNU General Public License version 2.0 for more details.
|
|||
+ *
|
|||
+ * You should have received a copy of the GNU General Public License
|
|||
+ * version 2.0 along with fedfs-utils. If not, see:
|
|||
+ *
|
|||
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
|||
+ */
|
|||
+
|
|||
+#ifdef HAVE_CONFIG_H
|
|||
+#include <config.h>
|
|||
+#endif
|
|||
+
|
|||
+#include <sys/types.h>
|
|||
+#include <sys/stat.h>
|
|||
+#include <sys/socket.h>
|
|||
+#include <sys/mount.h>
|
|||
+#include <sys/wait.h>
|
|||
+
|
|||
+#include <stdbool.h>
|
|||
+#include <string.h>
|
|||
+#include <stdlib.h>
|
|||
+#include <unistd.h>
|
|||
+#include <stdio.h>
|
|||
+#include <libgen.h>
|
|||
+#include <errno.h>
|
|||
+#include <getopt.h>
|
|||
+#include <locale.h>
|
|||
+#include <netdb.h>
|
|||
+#include <langinfo.h>
|
|||
+
|
|||
+#include "fedfs-nls.h"
|
|||
+#include "fedfs-token.h"
|
|||
+#include "fedfs-getsrvinfo.h"
|
|||
+#include "fedfs-gpl-boiler.h"
|
|||
+
|
|||
+/**
|
|||
+ * Name of SRV record containing NFSv4 FedFS root
|
|||
+ */
|
|||
+#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp"
|
|||
+
|
|||
+/**
|
|||
+ * Export pathname of NFSv4 FedFS root
|
|||
+ */
|
|||
+#define FEDFS_NFS_EXPORTPATH "/.domainroot"
|
|||
+
|
|||
+static char *progname;
|
|||
+
|
|||
+/**
|
|||
+ * Display usage message
|
|||
+ */
|
|||
+static void
|
|||
+fedfs_map_usage(void)
|
|||
+{
|
|||
+ printf(_("\nUsage: %s [domain]\n\n"), progname);
|
|||
+
|
|||
+ printf("%s", fedfs_gpl_boilerplate);
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Construct an NFSv4 map entry for "domainname" with one server
|
|||
+ *
|
|||
+ * @param si single-entry list of SRV records
|
|||
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
|
|||
+ * @return command exit status
|
|||
+ */
|
|||
+static int fedfs_map_nfs4_oneserver(struct srvinfo *si, const char *domainname)
|
|||
+{
|
|||
+ printf("-fstype=nfs,vers=4,fg");
|
|||
+ if (si->si_port != 2049)
|
|||
+ printf(",port=%u", si->si_port);
|
|||
+ printf(" %s:%s/%s\n", si->si_target, FEDFS_NFS_EXPORTPATH, domainname);
|
|||
+ return 0;
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Construct an NFSv4 map entry for "domainname" with multiple servers
|
|||
+ *
|
|||
+ * @param si list of SRV records for requested FedFS domain
|
|||
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
|
|||
+ * @return command exit status
|
|||
+ */
|
|||
+static int fedfs_map_nfs4_replicas(struct srvinfo *si, const char *domainname)
|
|||
+{
|
|||
+ struct srvinfo *cur;
|
|||
+ unsigned short port;
|
|||
+ _Bool comma;
|
|||
+
|
|||
+ /*
|
|||
+ * Unfortunately our automounter can't handle a list of
|
|||
+ * replicas where the various servers live on different
|
|||
+ * ports from one another.
|
|||
+ */
|
|||
+ port = si->si_port;
|
|||
+ for (cur = si; cur != NULL; cur = cur->si_next)
|
|||
+ if (cur->si_port != port) {
|
|||
+ fprintf(stderr, _("%s: Replicas on different ports not supported\n"),
|
|||
+ progname);
|
|||
+ return 1;
|
|||
+ }
|
|||
+
|
|||
+ if (port != 2049)
|
|||
+ printf("-fstype=nfs,vers=4,fg,port=%u ", port);
|
|||
+ else
|
|||
+ printf("-fstype=nfs,vers=4,fg ");
|
|||
+
|
|||
+ /*
|
|||
+ * Note that the export path is required to be indentical
|
|||
+ * for all domain root servers for this domain.
|
|||
+ */
|
|||
+ for (comma = false, cur = si; cur != NULL; cur = cur->si_next) {
|
|||
+ if (comma)
|
|||
+ printf(",");
|
|||
+ printf("%s(%u)", cur->si_target, cur->si_weight);
|
|||
+ comma = true;
|
|||
+ }
|
|||
+ printf(":%s/%s\n", FEDFS_NFS_EXPORTPATH, domainname);
|
|||
+
|
|||
+ return 0;
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Construct an NFSv4 map entry for "domainname"
|
|||
+ *
|
|||
+ * @param domainname NUL-terminated UTF-8 string containing name of FedFS domain
|
|||
+ * @return command exit status
|
|||
+ */
|
|||
+static int fedfs_map_nfs4(const char *domainname)
|
|||
+{
|
|||
+ struct srvinfo *cur, *si = NULL;
|
|||
+ unsigned int count;
|
|||
+ int error, result;
|
|||
+
|
|||
+ result = 1;
|
|||
+ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si);
|
|||
+ switch (error) {
|
|||
+ case ESI_SUCCESS:
|
|||
+ break;
|
|||
+ case ESI_NONAME:
|
|||
+ fprintf(stderr, _("%s: Domain name %s not found\n"),
|
|||
+ progname, domainname);
|
|||
+ goto out;
|
|||
+ case ESI_SERVICE:
|
|||
+ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"),
|
|||
+ progname, domainname);
|
|||
+ goto out;
|
|||
+ default:
|
|||
+ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"),
|
|||
+ progname, domainname, gsi_strerror(error));
|
|||
+ goto out;
|
|||
+ }
|
|||
+
|
|||
+ for (count = 0, cur = si; cur != NULL; cur = cur->si_next)
|
|||
+ count++;
|
|||
+ if (count == 1)
|
|||
+ result = fedfs_map_nfs4_oneserver(si, domainname);
|
|||
+ else
|
|||
+ result = fedfs_map_nfs4_replicas(si, domainname);
|
|||
+
|
|||
+out:
|
|||
+ freesrvinfo(si);
|
|||
+ return result;
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Program entry point
|
|||
+ *
|
|||
+ * @param argc count of command line arguments
|
|||
+ * @param argv array of NUL-terminated C strings containing command line arguments
|
|||
+ * @return program exit status
|
|||
+ */
|
|||
+int main(int argc, char *argv[])
|
|||
+{
|
|||
+ (void)setlocale(LC_ALL, "");
|
|||
+
|
|||
+ progname = basename(argv[0]);
|
|||
+
|
|||
+ if (argc != 2) {
|
|||
+ fedfs_map_usage();
|
|||
+ return 1;
|
|||
+ }
|
|||
+
|
|||
+ if (strcmp(progname, "fedfs-map-nfs4") == 0)
|
|||
+ return fedfs_map_nfs4(argv[1]);
|
|||
+#ifdef EXAMPLE
|
|||
+ /* CIFS support might plug in here */
|
|||
+ else if (strcmp(progname, "fedfs-map-cifs") == 0)
|
|||
+ return fedfs_map_cifs(argv[1]);
|
|||
+#endif
|
|||
+
|
|||
+ fprintf(stderr, _("%s: Unsupported file system type\n"), progname);
|
|||
+ return 1;
|
|||
+}
|
|||
diff --git a/fedfs/fedfs-token.h b/fedfs/fedfs-token.h
|
|||
new file mode 100644 |
|||
index 00000000..5651409d
|
|||
--- /dev/null
|
|||
+++ b/fedfs/fedfs-token.h
|
|||
@@ -0,0 +1,40 @@
|
|||
+/*
|
|||
+ * Copyright (C) 2007 Oracle. All rights reserved.
|
|||
+ * Copyright (C) 2007 Chuck Lever <chuck.lever@oracle.com>
|
|||
+ *
|
|||
+ * This file is part of fedfs-utils.
|
|||
+ *
|
|||
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
|||
+ * it under the terms of the GNU General Public License version 2.0 as
|
|||
+ * published by the Free Software Foundation.
|
|||
+ *
|
|||
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
|||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
+ * GNU General Public License version 2.0 for more details.
|
|||
+ *
|
|||
+ * You should have received a copy of the GNU General Public License
|
|||
+ * version 2.0 along with fedfs-utils. If not, see:
|
|||
+ *
|
|||
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
|||
+ */
|
|||
+
|
|||
+#ifndef _FEDFS_UTILS_TOKEN_H
|
|||
+#define _FEDFS_UTILS_TOKEN_H
|
|||
+
|
|||
+#include <sys/cdefs.h>
|
|||
+
|
|||
+/**
|
|||
+ * Private tokenizer state object
|
|||
+ */
|
|||
+struct tokenizer;
|
|||
+
|
|||
+__attribute_malloc__
|
|||
+struct tokenizer *tk_new_tokenizer(const char *string,
|
|||
+ const char delimiter);
|
|||
+__attribute_malloc__
|
|||
+char *tk_next_token(struct tokenizer *state);
|
|||
+void tk_free_tokenizer(struct tokenizer *state);
|
|||
+int tk_tokenizer_error(const struct tokenizer *state);
|
|||
+
|
|||
+#endif /* !_FEDFS_UTILS_TOKEN_H */
|
@ -1,44 +0,0 @@ |
|||
autofs-5.1.4 - add-man page note about extra slashes in paths |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Make note of the effect unnecessary multiple slashes can have in map |
|||
paths in auto.master(5). |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
man/auto.master.5.in | 8 ++++++++ |
|||
2 files changed, 9 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 92e60df9..14eb1de8 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -26,6 +26,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- use systemd sd_notify() at startup. |
|||
- fix NFS version mask usage. |
|||
- fix fd leak in rpc_do_create_client(). |
|||
+- add-man page note about extra slashes in paths.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/man/auto.master.5.in b/man/auto.master.5.in
|
|||
index 55a6acd0..e9afb97f 100644
|
|||
--- a/man/auto.master.5.in
|
|||
+++ b/man/auto.master.5.in
|
|||
@@ -66,6 +66,14 @@ will process the map according to the specification described below for
|
|||
map entries. Indirect map entries must be unique in the master map so |
|||
second and subsequent entries for an indirect mount point are ignored by |
|||
.BR automount (8). |
|||
+.TP
|
|||
+.B NOTE:
|
|||
+autofs currently does not collapse multiple slashes in paths, so it is
|
|||
+important to ensure paths used in maps are correct. If unnecessary multiple
|
|||
+slashes are present in a path it can lead to unexpected failures such as
|
|||
+an inability to expire automounts. An exception to this is a trailing slash
|
|||
+at the end of the automount point path in the master map which will be
|
|||
+removed if present.
|
|||
.SH "FORMAT" |
|||
Master map entries have three fields separated by an arbitrary number |
|||
of spaces or tabs. Lines beginning with # are comments. The first field |
@ -1,191 +0,0 @@ |
|||
autofs-5.1.4 - add master map pseudo options for mount propagation |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Add master map entry pseudo mount option of "slave" or "private" to |
|||
allow mount propagation of bind mounts to be set to either "slave" or |
|||
"private". |
|||
|
|||
This option may be needed when using multi-mounts that have bind mounts |
|||
that bind to a file system that is propagation shared. This is becuase |
|||
the bind mount will have the same properties as its target which causes |
|||
problems for offset mounts. When this happens an unwanted offset mount |
|||
is propagated back to the target file system resulting in a deadlock |
|||
when attempting to access the offset. |
|||
|
|||
By default bind mounts will inherit the mount propagation of the target |
|||
file system. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
include/automount.h | 4 ++++ |
|||
lib/master_parse.y | 13 +++++++++++++ |
|||
lib/master_tok.l | 2 ++ |
|||
man/auto.master.5.in | 12 ++++++++++++ |
|||
modules/mount_bind.c | 30 +++++++++++++++++++----------- |
|||
6 files changed, 51 insertions(+), 11 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 88829564..4765a66e 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -35,6 +35,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix program usage message. |
|||
- mark removed cache entry negative. |
|||
- set bind mount as propagation slave. |
|||
+- add master map pseudo options for mount propagation.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/include/automount.h b/include/automount.h
|
|||
index e5c19d23..417dacbb 100644
|
|||
--- a/include/automount.h
|
|||
+++ b/include/automount.h
|
|||
@@ -549,6 +549,10 @@ struct kernel_mod_version {
|
|||
/* Read amd map even if it's not to be ghosted (browsable) */ |
|||
#define MOUNT_FLAG_AMD_CACHE_ALL 0x0080 |
|||
|
|||
+/* Set mount propagation for bind mounts */
|
|||
+#define MOUNT_FLAG_SLAVE 0x0100
|
|||
+#define MOUNT_FLAG_PRIVATE 0x0200
|
|||
+
|
|||
struct autofs_point { |
|||
pthread_t thid; |
|||
char *path; /* Mount point name */ |
|||
diff --git a/lib/master_parse.y b/lib/master_parse.y
|
|||
index 5d687a70..84ca5ca1 100644
|
|||
--- a/lib/master_parse.y
|
|||
+++ b/lib/master_parse.y
|
|||
@@ -58,6 +58,8 @@ static char *format;
|
|||
static long timeout; |
|||
static long negative_timeout; |
|||
static unsigned symlnk; |
|||
+static unsigned slave;
|
|||
+static unsigned private;
|
|||
static unsigned nobind; |
|||
static unsigned ghost; |
|||
extern unsigned global_selection_options; |
|||
@@ -103,6 +105,7 @@ static int master_fprintf(FILE *, char *, ...);
|
|||
%token MAP |
|||
%token OPT_TIMEOUT OPT_NTIMEOUT OPT_NOBIND OPT_NOGHOST OPT_GHOST OPT_VERBOSE |
|||
%token OPT_DEBUG OPT_RANDOM OPT_USE_WEIGHT OPT_SYMLINK OPT_MODE |
|||
+%token OPT_SLAVE OPT_PRIVATE
|
|||
%token COLON COMMA NL DDASH |
|||
%type <strtype> map |
|||
%type <strtype> options |
|||
@@ -196,6 +199,8 @@ line:
|
|||
| PATH OPT_DEBUG { master_notify($1); YYABORT; } |
|||
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; } |
|||
| PATH OPT_SYMLINK { master_notify($1); YYABORT; } |
|||
+ | PATH OPT_SLAVE { master_notify($1); YYABORT; }
|
|||
+ | PATH OPT_PRIVATE { master_notify($1); YYABORT; }
|
|||
| PATH OPT_NOBIND { master_notify($1); YYABORT; } |
|||
| PATH OPT_GHOST { master_notify($1); YYABORT; } |
|||
| PATH OPT_NOGHOST { master_notify($1); YYABORT; } |
|||
@@ -600,6 +605,8 @@ option: daemon_option
|
|||
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; } |
|||
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; } |
|||
| OPT_SYMLINK { symlnk = 1; } |
|||
+ | OPT_SLAVE { slave = 1; }
|
|||
+ | OPT_PRIVATE { private = 1; }
|
|||
| OPT_NOBIND { nobind = 1; } |
|||
| OPT_NOGHOST { ghost = 0; } |
|||
| OPT_GHOST { ghost = 1; } |
|||
@@ -672,6 +679,8 @@ static void local_init_vars(void)
|
|||
timeout = -1; |
|||
negative_timeout = 0; |
|||
symlnk = 0; |
|||
+ slave = 0;
|
|||
+ private = 0;
|
|||
nobind = 0; |
|||
ghost = defaults_get_browse_mode(); |
|||
random_selection = global_selection_options & MOUNT_FLAG_RANDOM_SELECT; |
|||
@@ -878,6 +887,10 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
|
|||
entry->ap->flags |= MOUNT_FLAG_USE_WEIGHT_ONLY; |
|||
if (symlnk) |
|||
entry->ap->flags |= MOUNT_FLAG_SYMLINK; |
|||
+ if (slave)
|
|||
+ entry->ap->flags |= MOUNT_FLAG_SLAVE;
|
|||
+ if (private)
|
|||
+ entry->ap->flags |= MOUNT_FLAG_PRIVATE;
|
|||
if (negative_timeout) |
|||
entry->ap->negative_timeout = negative_timeout; |
|||
if (mode && mode < LONG_MAX) |
|||
diff --git a/lib/master_tok.l b/lib/master_tok.l
|
|||
index 41ac4995..f4e940ce 100644
|
|||
--- a/lib/master_tok.l
|
|||
+++ b/lib/master_tok.l
|
|||
@@ -389,6 +389,8 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTWS})
|
|||
-?symlink { return(OPT_SYMLINK); } |
|||
-?nobind { return(OPT_NOBIND); } |
|||
-?nobrowse { return(OPT_NOGHOST); } |
|||
+ -?slave { return(OPT_SLAVE); }
|
|||
+ -?private { return(OPT_PRIVATE); }
|
|||
-g|--ghost|-?browse { return(OPT_GHOST); } |
|||
-v|--verbose { return(OPT_VERBOSE); } |
|||
-d|--debug { return(OPT_DEBUG); } |
|||
diff --git a/man/auto.master.5.in b/man/auto.master.5.in
|
|||
index e9afb97f..68242d45 100644
|
|||
--- a/man/auto.master.5.in
|
|||
+++ b/man/auto.master.5.in
|
|||
@@ -199,6 +199,18 @@ entries only, either in the master map (so it effects all map entries)
|
|||
or with individual map entries. The option is ignored for direct mounts |
|||
and non-root offest mount entries. |
|||
.TP |
|||
+.I slave \fPor\fI private
|
|||
+This option allows mount propagation of bind mounts to be set to
|
|||
+either \fIslave\fP or \fIprivate\fP. This option may be needed when using
|
|||
+multi-mounts that have bind mounts that bind to a file system that is
|
|||
+propagation shared. This is becuase the bind mount will have the same
|
|||
+properties as its target which causes problems for offset mounts. When
|
|||
+this happens an unwanted offset mount is propagated back to the target
|
|||
+file system resulting in a deadlock when attempting to access the offset.
|
|||
+This option is a an autofs pseudo mount option that can be used in the
|
|||
+master map only. By default bind mounts will inherit the mount propagation
|
|||
+of the target file system.
|
|||
+.TP
|
|||
.I "\-r, \-\-random-multimount-selection" |
|||
Enables the use of random selection when choosing a host from a |
|||
list of replicated servers. This option is applied to this mount |
|||
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
|
|||
index fe1ad9b6..b64cdccc 100644
|
|||
--- a/modules/mount_bind.c
|
|||
+++ b/modules/mount_bind.c
|
|||
@@ -186,17 +186,25 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
what, fstype, fullpath); |
|||
} |
|||
|
|||
- /* The bind mount has succeeded but if the target
|
|||
- * mount is propagation shared propagation of child
|
|||
- * mounts (autofs offset mounts for example) back to
|
|||
- * the target of the bind mount must be avoided or
|
|||
- * autofs trigger mounts will deadlock.
|
|||
- */
|
|||
- err = mount(NULL, fullpath, NULL, MS_SLAVE, NULL);
|
|||
- if (err)
|
|||
- warn(ap->logopt,
|
|||
- "failed to set propagation type for %s",
|
|||
- fullpath);
|
|||
+ if (ap->flags & (MOUNT_FLAG_SLAVE | MOUNT_FLAG_PRIVATE)) {
|
|||
+ int flags = MS_SLAVE;
|
|||
+
|
|||
+ if (ap->flags & MOUNT_FLAG_PRIVATE)
|
|||
+ flags = MS_PRIVATE;
|
|||
+
|
|||
+ /* The bind mount has succeeded but if the target
|
|||
+ * mount is propagation shared propagation of child
|
|||
+ * mounts (autofs offset mounts for example) back to
|
|||
+ * the target of the bind mount must be avoided or
|
|||
+ * autofs trigger mounts will deadlock.
|
|||
+ */
|
|||
+ err = mount(NULL, fullpath, NULL, flags, NULL);
|
|||
+ if (err) {
|
|||
+ warn(ap->logopt,
|
|||
+ "failed to set propagation for %s",
|
|||
+ fullpath, root);
|
|||
+ }
|
|||
+ }
|
|||
|
|||
return 0; |
|||
} else { |
@ -1,696 +0,0 @@ |
|||
autofs-5.1.4 - add mount.fedfs.c |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Add build and install of the mount.fedfs binary. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 |
|||
Makefile | 3 |
|||
Makefile.rules | 2 |
|||
autofs.spec | 1 |
|||
fedfs/Makefile | 36 +++ |
|||
fedfs/fedfs-gpl-boiler.h | 40 ++++ |
|||
fedfs/fedfs-nls.h | 38 ++++ |
|||
fedfs/mount.fedfs.c | 485 ++++++++++++++++++++++++++++++++++++++++++++++ |
|||
8 files changed, 605 insertions(+), 1 deletion(-) |
|||
create mode 100644 fedfs/Makefile |
|||
create mode 100644 fedfs/fedfs-gpl-boiler.h |
|||
create mode 100644 fedfs/fedfs-nls.h |
|||
create mode 100644 fedfs/mount.fedfs.c |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 8d6c737c..88992147 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -15,6 +15,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- dont allow trailing slash in master map mount points. |
|||
- fix libresolv configure check. |
|||
- add fedfs-getsrvinfo.c. |
|||
+- add mount.fedfs.c.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/Makefile b/Makefile
|
|||
index e560a7cb..99db2c75 100644
|
|||
--- a/Makefile
|
|||
+++ b/Makefile
|
|||
@@ -19,6 +19,9 @@ kernel:
|
|||
samples: |
|||
set -e; if [ -d samples ]; then $(MAKE) -C samples all; fi |
|||
|
|||
+fedfs:
|
|||
+ set -e; if [ -d fedfs ]; then $(MAKE) -C fedfs all; fi
|
|||
+
|
|||
clean: |
|||
for i in $(SUBDIRS) samples; do \ |
|||
if [ -d $$i ]; then $(MAKE) -C $$i clean; fi; done |
|||
diff --git a/Makefile.rules b/Makefile.rules
|
|||
index 4deab3b9..fc9f6019 100644
|
|||
--- a/Makefile.rules
|
|||
+++ b/Makefile.rules
|
|||
@@ -3,7 +3,7 @@
|
|||
# |
|||
|
|||
# Root directory contents |
|||
-SUBDIRS = lib daemon modules man
|
|||
+SUBDIRS = lib daemon fedfs modules man
|
|||
INCDIRS = include |
|||
INCFILES = COPYING COPYRIGHT NEWS README* TODO Makefile Makefile.rules \ |
|||
Makefile.conf.in .version .autofs-* configure.in aclocal.m4 \ |
|||
diff --git a/autofs.spec b/autofs.spec
|
|||
index 2464e741..2cc0e38f 100644
|
|||
--- a/autofs.spec
|
|||
+++ b/autofs.spec
|
|||
@@ -191,6 +191,7 @@ fi
|
|||
%config(noreplace) /etc/sysconfig/autofs |
|||
%config(noreplace) /etc/autofs_ldap_auth.conf |
|||
%{_sbindir}/automount |
|||
+%{_sbindir}/mount.fedfs
|
|||
%dir %{_libdir}/autofs |
|||
%{_libdir}/autofs/* |
|||
%{_mandir}/*/* |
|||
diff --git a/fedfs/Makefile b/fedfs/Makefile
|
|||
new file mode 100644 |
|||
index 00000000..cb325bed
|
|||
--- /dev/null
|
|||
+++ b/fedfs/Makefile
|
|||
@@ -0,0 +1,36 @@
|
|||
+#
|
|||
+# Makefile for mount.fedfs
|
|||
+#
|
|||
+
|
|||
+-include ../Makefile.conf
|
|||
+include ../Makefile.rules
|
|||
+
|
|||
+SRCS = mount.fedfs.c
|
|||
+HDRS = fedfs-getsrvinfo.h fedfs-gpl-boiler.h fedfs-nls.h
|
|||
+
|
|||
+fedfs-getsrvinfo_OBJ = fedfs-getsrvinfo.o
|
|||
+
|
|||
+mount_fedfs_OBJ = mount.fedfs.o
|
|||
+
|
|||
+version := $(shell cat ../.version)
|
|||
+
|
|||
+CFLAGS += -rdynamic $(DAEMON_CFLAGS) -D_GNU_SOURCE -I../include
|
|||
+CFLAGS += -DVERSION_STRING=\"$(version)\"
|
|||
+LDFLAGS += -rdynamic
|
|||
+
|
|||
+all: mount.fedfs
|
|||
+
|
|||
+mount.fedfs: $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) $(HDRS)
|
|||
+ $(CC) -o mount.fedfs \
|
|||
+ $(mount_fedfs_OBJ) $(fedfs-getsrvinfo_OBJ) \
|
|||
+ $(LDFLAGS) $(LIBRESOLV) $(LIBS)
|
|||
+
|
|||
+clean:
|
|||
+ rm -f *.o *.s *~ mount.fedfs
|
|||
+
|
|||
+install: all
|
|||
+ install -d -m 755 $(INSTALLROOT)$(sbindir)
|
|||
+ if ! test -x $(INSTALLROOT)$(sbindir)/mount.fedfs; \
|
|||
+ then \
|
|||
+ install -c mount.fedfs -m 755 $(INSTALLROOT)$(sbindir); \
|
|||
+ fi
|
|||
diff --git a/fedfs/fedfs-gpl-boiler.h b/fedfs/fedfs-gpl-boiler.h
|
|||
new file mode 100644 |
|||
index 00000000..1353e736
|
|||
--- /dev/null
|
|||
+++ b/fedfs/fedfs-gpl-boiler.h
|
|||
@@ -0,0 +1,40 @@
|
|||
+/*
|
|||
+ * Copyright 2011 Oracle. All rights reserved.
|
|||
+ *
|
|||
+ * This file is part of fedfs-utils.
|
|||
+ *
|
|||
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
|||
+ * it under the terms of the GNU General Public License version 2.0 as
|
|||
+ * published by the Free Software Foundation.
|
|||
+ *
|
|||
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
|||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
+ * GNU General Public License version 2.0 for more details.
|
|||
+ *
|
|||
+ * You should have received a copy of the GNU General Public License
|
|||
+ * version 2.0 along with fedfs-utils. If not, see:
|
|||
+ *
|
|||
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
|||
+ */
|
|||
+
|
|||
+#ifndef _GPL_BOILER_H_
|
|||
+#define _GPL_BOILER_H_
|
|||
+
|
|||
+#ifdef HAVE_CONFIG_H
|
|||
+#include <config.h>
|
|||
+#endif
|
|||
+
|
|||
+/**
|
|||
+ * GPLv2 boilerplate for usage messages
|
|||
+ */
|
|||
+static const char *fedfs_gpl_boilerplate =
|
|||
+ "\nCopyright 2010, 2011, 2012, 2013 Oracle. "
|
|||
+ "All rights reserved.\n\n"
|
|||
+ "License GPLv2: "
|
|||
+ "<http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>\n"
|
|||
+ "This is free software. "
|
|||
+ "You are free to change and redistribute it.\n"
|
|||
+ "There is NO WARRANTY, to the extent permitted by law.\n";
|
|||
+
|
|||
+#endif /* !_GPL_BOILER_H_ */
|
|||
diff --git a/fedfs/fedfs-nls.h b/fedfs/fedfs-nls.h
|
|||
new file mode 100644 |
|||
index 00000000..92f968d3
|
|||
--- /dev/null
|
|||
+++ b/fedfs/fedfs-nls.h
|
|||
@@ -0,0 +1,38 @@
|
|||
+/*
|
|||
+ * From util-linux/include/nls.h (GPLv2)
|
|||
+ */
|
|||
+
|
|||
+#ifndef UTIL_LINUX_NLS_H
|
|||
+#define UTIL_LINUX_NLS_H
|
|||
+
|
|||
+int main(int argc, char *argv[]);
|
|||
+
|
|||
+#ifndef LOCALEDIR
|
|||
+#define LOCALEDIR "/usr/share/locale"
|
|||
+#endif
|
|||
+
|
|||
+#ifdef HAVE_LOCALE_H
|
|||
+# include <locale.h>
|
|||
+#else
|
|||
+# undef setlocale
|
|||
+# define setlocale(Category, Locale) ({}) /* empty */
|
|||
+#endif
|
|||
+
|
|||
+#ifdef ENABLE_NLS
|
|||
+# include <libintl.h>
|
|||
+# define _(Text) gettext (Text)
|
|||
+# ifdef gettext_noop
|
|||
+# define N_(String) gettext_noop (String)
|
|||
+# else
|
|||
+# define N_(String) (String)
|
|||
+# endif
|
|||
+#else
|
|||
+# undef bindtextdomain
|
|||
+# define bindtextdomain(Domain, Directory) /* empty */
|
|||
+# undef textdomain
|
|||
+# define textdomain(Domain) /* empty */
|
|||
+# define _(Text) (Text)
|
|||
+# define N_(Text) (Text)
|
|||
+#endif
|
|||
+
|
|||
+#endif /* UTIL_LINUX_NLS_H */
|
|||
diff --git a/fedfs/mount.fedfs.c b/fedfs/mount.fedfs.c
|
|||
new file mode 100644 |
|||
index 00000000..bd434395
|
|||
--- /dev/null
|
|||
+++ b/fedfs/mount.fedfs.c
|
|||
@@ -0,0 +1,485 @@
|
|||
+/*
|
|||
+ * Copyright 2011 Oracle. All rights reserved.
|
|||
+ *
|
|||
+ * This file is part of fedfs-utils.
|
|||
+ *
|
|||
+ * fedfs-utils is free software; you can redistribute it and/or modify
|
|||
+ * it under the terms of the GNU General Public License version 2.0 as
|
|||
+ * published by the Free Software Foundation.
|
|||
+ *
|
|||
+ * fedfs-utils is distributed in the hope that it will be useful, but
|
|||
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
+ * GNU General Public License version 2.0 for more details.
|
|||
+ *
|
|||
+ * You should have received a copy of the GNU General Public License
|
|||
+ * version 2.0 along with fedfs-utils. If not, see:
|
|||
+ *
|
|||
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
|||
+ */
|
|||
+
|
|||
+#include <sys/types.h>
|
|||
+#include <sys/stat.h>
|
|||
+#include <sys/socket.h>
|
|||
+#include <sys/mount.h>
|
|||
+#include <sys/wait.h>
|
|||
+
|
|||
+#include <stdbool.h>
|
|||
+#include <string.h>
|
|||
+#include <stdlib.h>
|
|||
+#include <unistd.h>
|
|||
+#include <stdio.h>
|
|||
+#include <libgen.h>
|
|||
+#include <errno.h>
|
|||
+#include <getopt.h>
|
|||
+#include <locale.h>
|
|||
+#include <netdb.h>
|
|||
+#include <langinfo.h>
|
|||
+
|
|||
+#include "fedfs-nls.h"
|
|||
+#include "fedfs-getsrvinfo.h"
|
|||
+#include "fedfs-gpl-boiler.h"
|
|||
+
|
|||
+/**
|
|||
+ * Top-level directory on client under which we mount NFSv4 domain roots
|
|||
+ */
|
|||
+#define FEDFS_NFS4_TLDIR "nfs4"
|
|||
+
|
|||
+/**
|
|||
+ * Name of SRV record containing NFSv4 FedFS root
|
|||
+ */
|
|||
+#define FEDFS_NFS_DOMAINROOT "_nfs-domainroot._tcp"
|
|||
+
|
|||
+/**
|
|||
+ * Export path of NFSv4 FedFS root
|
|||
+ */
|
|||
+#define FEDFS_NFS_EXPORTPATH "/.domainroot"
|
|||
+
|
|||
+/**
|
|||
+ * Pathname to mount.nfs
|
|||
+ */
|
|||
+#define MOUNT_NFS_EXECUTABLE "/sbin/mount.nfs"
|
|||
+
|
|||
+/**
|
|||
+ * Mount status values, lifted from util-linux
|
|||
+ */
|
|||
+enum {
|
|||
+ EX_SUCCESS = 0,
|
|||
+ EX_USAGE = 1,
|
|||
+ EX_FAIL = 32,
|
|||
+};
|
|||
+
|
|||
+static char *progname;
|
|||
+static int nomtab;
|
|||
+static int verbose;
|
|||
+static _Bool readonly;
|
|||
+static _Bool sloppy;
|
|||
+static _Bool fake;
|
|||
+
|
|||
+/**
|
|||
+ * Short form command line options
|
|||
+ */
|
|||
+static const char fedfs_opts[] = "fhno:rsvVw";
|
|||
+
|
|||
+/**
|
|||
+ * Long form command line options
|
|||
+ */
|
|||
+static const struct option fedfs_longopts[] =
|
|||
+{
|
|||
+ { "fake", 0, NULL, 'f' },
|
|||
+ { "help", 0, NULL, 'h' },
|
|||
+ { "no-mtab", 0, NULL, 'n' },
|
|||
+ { "options", 1, NULL, 'o' },
|
|||
+ { "read-only", 0, NULL, 'r' },
|
|||
+ { "read-write", 0, NULL, 'w' },
|
|||
+ { "ro", 0, NULL, 'r' },
|
|||
+ { "rw", 0, NULL, 'w' },
|
|||
+ { "sloppy", 0, NULL, 's' },
|
|||
+ { "verbose", 0, NULL, 'v' },
|
|||
+ { "version", 0, NULL, 'V' },
|
|||
+ { NULL, 0, NULL, 0 }
|
|||
+};
|
|||
+
|
|||
+/**
|
|||
+ * Display mount.fedfs usage message
|
|||
+ */
|
|||
+static void
|
|||
+mount_usage(void)
|
|||
+{
|
|||
+ printf(_("\nUsage: %s remotedir localdir [-fhnrsvVw]\n\n"), progname);
|
|||
+ printf(_("options:\n"));
|
|||
+ printf(_("\t-f\t\tFake mount, do not actually mount\n"));
|
|||
+ printf(_("\t-h\t\tPrint this help\n"));
|
|||
+ printf(_("\t-n\t\tDo not update /etc/mtab\n"));
|
|||
+ printf(_("\t-r\t\tMount file system readonly\n"));
|
|||
+ printf(_("\t-s\t\tTolerate sloppy mount options\n"));
|
|||
+ printf(_("\t-v\t\tVerbose\n"));
|
|||
+ printf(_("\t-V\t\tPrint version\n"));
|
|||
+ printf(_("\t-w\t\tMount file system read-write\n"));
|
|||
+
|
|||
+ printf("%s", fedfs_gpl_boilerplate);
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Concatenate three strings
|
|||
+ *
|
|||
+ * @param s NUL-terminated C string
|
|||
+ * @param t NUL-terminated C string
|
|||
+ * @param u NUL-terminated C string
|
|||
+ * @return pointer to NUL-terminated C string or NULL
|
|||
+ *
|
|||
+ * Caller must free the returned string with free(3). Always frees
|
|||
+ * its first arg - typical use: s = xstrconcat3(s,t,u);
|
|||
+ *
|
|||
+ * Lifted from util-linux.
|
|||
+ */
|
|||
+static char *
|
|||
+xstrconcat3(char *s, const char *t, const char *u)
|
|||
+{
|
|||
+ _Bool free_s = true;
|
|||
+ char *result;
|
|||
+
|
|||
+ if (s == NULL) {
|
|||
+ s = "";
|
|||
+ free_s = false;
|
|||
+ }
|
|||
+ if (t == NULL)
|
|||
+ t = "";
|
|||
+ if (u == NULL)
|
|||
+ u = "";
|
|||
+ result = malloc(strlen(s) + strlen(t) + strlen(u) + 1);
|
|||
+ if (result == NULL)
|
|||
+ goto out;
|
|||
+
|
|||
+ strcpy(result, s);
|
|||
+ strcat(result, t);
|
|||
+ strcat(result, u);
|
|||
+
|
|||
+out:
|
|||
+ if (free_s)
|
|||
+ free(s);
|
|||
+ return result;
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Exec mount.nfs
|
|||
+ *
|
|||
+ * @param server NUL-terminated C string containing name of NFS server
|
|||
+ * @param port server port to use when mounting
|
|||
+ * @param domainname NUL-terminated C string containing FedFS domain name
|
|||
+ * @param export_path NUL-terminated C string containing server export path
|
|||
+ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory
|
|||
+ * @param text_options NUL-terminated C string containing user's mount options
|
|||
+ *
|
|||
+ */
|
|||
+static void
|
|||
+exec_mount_nfs4(const char *server, unsigned short port,
|
|||
+ const char *domainname, const char *export_path,
|
|||
+ const char *mounted_on_dir, const char *text_options)
|
|||
+{
|
|||
+ static char special[2048];
|
|||
+ static char options[2048];
|
|||
+ char *args[16];
|
|||
+ int count = 0;
|
|||
+
|
|||
+ snprintf(special, sizeof(special), "%s:%s/%s%s", server,
|
|||
+ FEDFS_NFS_EXPORTPATH, domainname, export_path);
|
|||
+
|
|||
+ if (text_options != NULL && strcmp(text_options, "") != 0)
|
|||
+ snprintf(options, sizeof(options), "%s,vers=4,fg,port=%u",
|
|||
+ text_options, port);
|
|||
+ else
|
|||
+ snprintf(options, sizeof(options), "vers=4,fg,port=%u", port);
|
|||
+
|
|||
+ if (verbose) {
|
|||
+ printf(_("%s: Special device: %s\n"),
|
|||
+ progname, special);
|
|||
+ printf(_("%s: Mounted-on directory: %s\n"),
|
|||
+ progname, mounted_on_dir);
|
|||
+ printf(_("%s: Mount options: %s\n"),
|
|||
+ progname, options);
|
|||
+ }
|
|||
+
|
|||
+ args[count++] = MOUNT_NFS_EXECUTABLE;
|
|||
+ args[count++] = special;
|
|||
+ args[count++] = (char *)mounted_on_dir;
|
|||
+ if (verbose)
|
|||
+ args[count++] = "-v";
|
|||
+ if (fake)
|
|||
+ args[count++] = "-f";
|
|||
+ if (nomtab)
|
|||
+ args[count++] = "-n";
|
|||
+ if (readonly)
|
|||
+ args[count++] = "-r";
|
|||
+ if (sloppy)
|
|||
+ args[count++] = "-s";
|
|||
+ args[count++] = "-o";
|
|||
+ args[count++] = options;
|
|||
+
|
|||
+ args[count] = NULL;
|
|||
+ execv(args[0], args);
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Mount a FedFS domain root via NFSv4
|
|||
+ *
|
|||
+ * @param domainname NUL-terminated C string containing FedFS domain name
|
|||
+ * @param export_path NUL-terminated C string containing server export path
|
|||
+ * @param mounted_on_dir NUL-terminated C string containing local mounted-on directory
|
|||
+ * @param text_options NUL-terminated C string containing user's mount options
|
|||
+ * @return exit status code from the mount.nfs command
|
|||
+ *
|
|||
+ * Construct the server:/export string and the mounted-on directory string
|
|||
+ * based on the DNS SRV query results, then fork and exec mount.nfs to do
|
|||
+ * the actual mount request.
|
|||
+ */
|
|||
+static int
|
|||
+nfs4_mount(const char *domainname, const char *export_path,
|
|||
+ const char *mounted_on_dir, const char *text_options)
|
|||
+{
|
|||
+ struct srvinfo *tmp, *si = NULL;
|
|||
+ int error, status;
|
|||
+
|
|||
+ status = EX_FAIL;
|
|||
+
|
|||
+ error = getsrvinfo(FEDFS_NFS_DOMAINROOT, domainname, &si);
|
|||
+ switch (error) {
|
|||
+ case ESI_SUCCESS:
|
|||
+ break;
|
|||
+ case ESI_NONAME:
|
|||
+ fprintf(stderr, _("%s: Domain name %s not found\n"),
|
|||
+ progname, domainname);
|
|||
+ goto out;
|
|||
+ case ESI_SERVICE:
|
|||
+ fprintf(stderr, _("%s: No FedFS domain root available for %s\n"),
|
|||
+ progname, domainname);
|
|||
+ goto out;
|
|||
+ default:
|
|||
+ fprintf(stderr, _("%s: Failed to resolve %s: %s\n"),
|
|||
+ progname, domainname, gsi_strerror(error));
|
|||
+ goto out;
|
|||
+ }
|
|||
+
|
|||
+ /*
|
|||
+ * The srvinfo list is already in RFC 2782 sorted order. Try each
|
|||
+ * SRV record once, in the foreground. Go with the first one that
|
|||
+ * works.
|
|||
+ */
|
|||
+ for (tmp = si; tmp != NULL; tmp = tmp->si_next) {
|
|||
+ pid_t pid;
|
|||
+
|
|||
+ pid = fork();
|
|||
+ switch (pid) {
|
|||
+ case 0:
|
|||
+ exec_mount_nfs4(tmp->si_target, tmp->si_port,
|
|||
+ domainname, export_path, mounted_on_dir,
|
|||
+ text_options);
|
|||
+ /*NOTREACHED*/
|
|||
+ fprintf(stderr, _("%s: Failed to exec: %s\n"),
|
|||
+ progname, strerror(errno));
|
|||
+ exit(EX_FAIL);
|
|||
+ case -1:
|
|||
+ fprintf(stderr, _("%s: Failed to fork: %s\n"),
|
|||
+ progname, strerror(errno));
|
|||
+ goto out;
|
|||
+ default:
|
|||
+ waitpid(pid, &status, 0);
|
|||
+ if (status == EX_SUCCESS)
|
|||
+ goto out;
|
|||
+ }
|
|||
+ }
|
|||
+
|
|||
+out:
|
|||
+ freesrvinfo(si);
|
|||
+ return status;
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Try one mount request
|
|||
+ *
|
|||
+ * @param source NUL-terminated C string containing name of "special device"
|
|||
+ * @param target NUL-terminated C string containing local mounted-on directory
|
|||
+ * @param text_options NUL-terminated C string containing user's mount options
|
|||
+ * @return an exit status code
|
|||
+ *
|
|||
+ * Parse the pathname in "source." It contains the file system protocol
|
|||
+ * and FedFS domain name. Then pass these arguments to the appropriate
|
|||
+ * mount helper subcommand.
|
|||
+ */
|
|||
+static int
|
|||
+try_mount(const char *source, const char *target, const char *text_options)
|
|||
+{
|
|||
+ char *global_name, *topdir, *domainname, *remaining;
|
|||
+ int result;
|
|||
+
|
|||
+ remaining = NULL;
|
|||
+ result = EX_FAIL;
|
|||
+
|
|||
+ global_name = strdup(source);
|
|||
+ if (global_name == NULL) {
|
|||
+ fprintf(stderr, _("%s: Unable to parse globally useful name\n"),
|
|||
+ progname);
|
|||
+ goto out;
|
|||
+ }
|
|||
+
|
|||
+ topdir = strtok(global_name, "/");
|
|||
+ if (topdir == NULL) {
|
|||
+ fprintf(stderr, _("%s: Invalid globally useful name: %s\n"),
|
|||
+ progname, source);
|
|||
+ goto out;
|
|||
+ }
|
|||
+ if (verbose)
|
|||
+ printf(_("%s: Top-level directory: %s\n"),
|
|||
+ progname, topdir);
|
|||
+
|
|||
+ domainname = strtok(NULL, "/");
|
|||
+ if (domainname == NULL) {
|
|||
+ fprintf(stderr, _("%s: Missing domain name in globally "
|
|||
+ "useful name: %s\n"), progname, source);
|
|||
+ goto out;
|
|||
+ }
|
|||
+ if (verbose)
|
|||
+ printf(_("%s: Domain name: %s\n"),
|
|||
+ progname, domainname);
|
|||
+
|
|||
+ remaining = strtok(NULL, "/");
|
|||
+ if (remaining == NULL) {
|
|||
+ remaining = strdup("/");
|
|||
+ if (remaining == NULL) {
|
|||
+ fprintf(stderr, _("%s: No memory\n"), progname);
|
|||
+ goto out;
|
|||
+ }
|
|||
+ } else {
|
|||
+ char *tmp;
|
|||
+
|
|||
+ tmp = malloc(strlen(remaining) + 1);
|
|||
+ if (tmp == NULL) {
|
|||
+ fprintf(stderr, _("%s: No memory\n"), progname);
|
|||
+ remaining = NULL;
|
|||
+ goto out;
|
|||
+ }
|
|||
+ strcpy(tmp, "/");
|
|||
+ strcat(tmp, remaining);
|
|||
+ remaining = tmp;
|
|||
+ }
|
|||
+ if (verbose)
|
|||
+ printf(_("%s: Export path: %s\n"),
|
|||
+ progname, remaining);
|
|||
+
|
|||
+ if (strcmp(topdir, FEDFS_NFS4_TLDIR) == 0)
|
|||
+ result = nfs4_mount(domainname, remaining, target, text_options);
|
|||
+#if 0
|
|||
+ /* example: SMB support plugs in here */
|
|||
+ else if (strcmp(topdir, FEDFS_SMB_TLDIR) == 0)
|
|||
+ result = smb_mount(domainname, remaining, target, text_options);
|
|||
+#endif
|
|||
+ else
|
|||
+ fprintf(stderr, _("%s: Unrecognized file system protocol\n"), progname);
|
|||
+
|
|||
+out:
|
|||
+ free(global_name);
|
|||
+ free(remaining);
|
|||
+
|
|||
+ return result;
|
|||
+}
|
|||
+
|
|||
+/**
|
|||
+ * Program entry point
|
|||
+ *
|
|||
+ * @param argc count of command line arguments
|
|||
+ * @param argv array of NUL-terminated C strings containing command line arguments
|
|||
+ * @return program exit status
|
|||
+ */
|
|||
+int main(int argc, char *argv[])
|
|||
+{
|
|||
+ char *source, *target, *text_options;
|
|||
+ int c, mnt_err;
|
|||
+
|
|||
+ (void)setlocale(LC_ALL, "");
|
|||
+
|
|||
+ progname = basename(argv[0]);
|
|||
+
|
|||
+ if (argv[1] && argv[1][0] == '-') {
|
|||
+ if(argv[1][1] == 'V')
|
|||
+ printf("%s (VERSION_STRING)\n", progname);
|
|||
+ else
|
|||
+ mount_usage();
|
|||
+ exit(EX_SUCCESS);
|
|||
+ }
|
|||
+
|
|||
+ if (argc < 3) {
|
|||
+ mount_usage();
|
|||
+ exit(EX_USAGE);
|
|||
+ }
|
|||
+
|
|||
+ source = argv[1];
|
|||
+ target = argv[2];
|
|||
+
|
|||
+ mnt_err = EX_USAGE;
|
|||
+ text_options = NULL;
|
|||
+ readonly = false;
|
|||
+ sloppy = false;
|
|||
+ fake = false;
|
|||
+ argv[2] = argv[0]; /* so that getopt error messages are correct */
|
|||
+ while ((c = getopt_long(argc - 2, argv + 2, fedfs_opts,
|
|||
+ fedfs_longopts, NULL)) != -1) {
|
|||
+ switch (c) {
|
|||
+ case 'f':
|
|||
+ fake = true;
|
|||
+ break;
|
|||
+ case 'n':
|
|||
+ ++nomtab;
|
|||
+ break;
|
|||
+ case 'o':
|
|||
+ /* Ugh. */
|
|||
+ if (text_options != NULL)
|
|||
+ text_options = xstrconcat3(text_options, ",", optarg);
|
|||
+ else
|
|||
+ text_options = strdup(optarg);
|
|||
+ if (text_options == NULL) {
|
|||
+ fprintf(stderr, _("%s: No memory\n"), progname);
|
|||
+ goto out;
|
|||
+ }
|
|||
+ break;
|
|||
+ case 'r':
|
|||
+ readonly = true;
|
|||
+ break;
|
|||
+ case 's':
|
|||
+ sloppy = true;
|
|||
+ break;
|
|||
+ case 'v':
|
|||
+ ++verbose;
|
|||
+ break;
|
|||
+ case 'V':
|
|||
+ printf("%s: (VERSION_STRING)\n", progname);
|
|||
+ mnt_err = EX_SUCCESS;
|
|||
+ goto out;
|
|||
+ case 'w':
|
|||
+ readonly = false;
|
|||
+ break;
|
|||
+ case 'h':
|
|||
+ default:
|
|||
+ mount_usage();
|
|||
+ goto out;
|
|||
+ }
|
|||
+ }
|
|||
+
|
|||
+ /* Extra non-option words at the end are bogus... */
|
|||
+ if (optind != argc - 2) {
|
|||
+ mount_usage();
|
|||
+ goto out;
|
|||
+ }
|
|||
+
|
|||
+ if (getuid() != 0 && geteuid() != 0) {
|
|||
+ fprintf(stderr, _("%s: Not installed setuid - "
|
|||
+ "\"user\" FedFS mounts are not supported\n"), progname);
|
|||
+ mnt_err = EX_FAIL;
|
|||
+ goto out;
|
|||
+ }
|
|||
+
|
|||
+ mnt_err = try_mount(source, target, text_options);
|
|||
+
|
|||
+out:
|
|||
+ free(text_options);
|
|||
+ exit(mnt_err);
|
|||
+}
|
@ -1,147 +0,0 @@ |
|||
autofs-5.1.4 - add systemd service command line option |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
When run as a systemd service using the systemd notification method to |
|||
synchronise startup, logging should be done to syslog so the log entry |
|||
format is consistent between daemon and systemd usage. |
|||
|
|||
So, rather than run use the forground option, add an option to tell |
|||
the automounter it's being run as a systemd service and use syslog |
|||
for logging when its present on the command line. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/automount.c | 22 +++++++++++++++++++--- |
|||
include/automount.h | 1 + |
|||
man/automount.8 | 4 ++++ |
|||
samples/autofs.service.in | 2 +- |
|||
5 files changed, 26 insertions(+), 4 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 4e1d9c98..21fc9ca7 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -47,6 +47,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- update build info with systemd. |
|||
- use flags for startup boolean options. |
|||
- move close stdio descriptors to become_daemon(). |
|||
+- add systemd service command line option.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/automount.c b/daemon/automount.c
|
|||
index c1360ed6..4628f20c 100644
|
|||
--- a/daemon/automount.c
|
|||
+++ b/daemon/automount.c
|
|||
@@ -1210,13 +1210,21 @@ static void become_daemon(unsigned int flags)
|
|||
} |
|||
|
|||
/* Detach from foreground process */ |
|||
- if (flags & DAEMON_FLAGS_FOREGROUND) {
|
|||
+ if (flags & DAEMON_FLAGS_FOREGROUND &&
|
|||
+ !(flags & DAEMON_FLAGS_SYSTEMD_SERVICE)) {
|
|||
if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) { |
|||
fprintf(stderr, "%s: program is already running.\n", |
|||
program); |
|||
exit(1); |
|||
} |
|||
log_to_stderr(); |
|||
+ } else if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE) {
|
|||
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
|||
+ fprintf(stderr, "%s: program is already running.\n",
|
|||
+ program);
|
|||
+ exit(1);
|
|||
+ }
|
|||
+ open_log();
|
|||
} else { |
|||
int nullfd; |
|||
|
|||
@@ -1925,6 +1933,8 @@ static void usage(void)
|
|||
" -d --debug log debuging info\n" |
|||
" -Dvariable=value, --define variable=value\n" |
|||
" define global macro variable\n" |
|||
+ " -S --systemd-service\n"
|
|||
+ " run automounter as a systemd service\n"
|
|||
" -f --foreground do not fork into background\n" |
|||
" -r --random-multimount-selection\n" |
|||
" use ramdom replicated server selection\n" |
|||
@@ -2190,7 +2200,7 @@ int main(int argc, char *argv[])
|
|||
time_t timeout; |
|||
time_t age = monotonic_time(NULL); |
|||
struct rlimit rlim; |
|||
- const char *options = "+hp:t:vmdD:fVrO:l:n:CFM";
|
|||
+ const char *options = "+hp:t:vmdD:SfVrO:l:n:CFM";
|
|||
static const struct option long_options[] = { |
|||
{"help", 0, 0, 'h'}, |
|||
{"pid-file", 1, 0, 'p'}, |
|||
@@ -2198,6 +2208,7 @@ int main(int argc, char *argv[])
|
|||
{"verbose", 0, 0, 'v'}, |
|||
{"debug", 0, 0, 'd'}, |
|||
{"define", 1, 0, 'D'}, |
|||
+ {"systemd-service", 0, 0, 'S'},
|
|||
{"foreground", 0, 0, 'f'}, |
|||
{"random-multimount-selection", 0, 0, 'r'}, |
|||
{"negative-timeout", 1, 0, 'n'}, |
|||
@@ -2266,6 +2277,10 @@ int main(int argc, char *argv[])
|
|||
macro_parse_globalvar(optarg); |
|||
break; |
|||
|
|||
+ case 'S':
|
|||
+ flags |= DAEMON_FLAGS_SYSTEMD_SERVICE;
|
|||
+ break;
|
|||
+
|
|||
case 'f': |
|||
flags |= DAEMON_FLAGS_FOREGROUND; |
|||
break; |
|||
@@ -2653,7 +2668,8 @@ int main(int argc, char *argv[])
|
|||
} |
|||
|
|||
#ifdef WITH_SYSTEMD |
|||
- sd_notify(1, "READY=1");
|
|||
+ if (flags & DAEMON_FLAGS_SYSTEMD_SERVICE)
|
|||
+ sd_notify(1, "READY=1");
|
|||
#endif |
|||
|
|||
state_mach_thid = pthread_self(); |
|||
diff --git a/include/automount.h b/include/automount.h
|
|||
index 848fd0be..45fde53e 100644
|
|||
--- a/include/automount.h
|
|||
+++ b/include/automount.h
|
|||
@@ -67,6 +67,7 @@
|
|||
#endif |
|||
|
|||
#define DAEMON_FLAGS_FOREGROUND 0x0001 |
|||
+#define DAEMON_FLAGS_SYSTEMD_SERVICE 0x0002
|
|||
#define DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS 0x0004 |
|||
#define DAEMON_FLAGS_GHOST 0x0008 |
|||
#define DAEMON_FLAGS_CHECK_DAEMON 0x0010 |
|||
diff --git a/man/automount.8 b/man/automount.8
|
|||
index 68d2aaa3..9f92288e 100644
|
|||
--- a/man/automount.8
|
|||
+++ b/man/automount.8
|
|||
@@ -57,6 +57,10 @@ Define a global macro substitution variable. Global definitions
|
|||
are over-ridden macro definitions of the same name specified in |
|||
mount entries. |
|||
.TP |
|||
+.I \-S, \-\-systemd-service
|
|||
+Used when running the automounter as a systemd service to ensure log entry
|
|||
+format is consistent with the log entry format when running as a daemon.
|
|||
+.TP
|
|||
.I "\-f, \-\-foreground" |
|||
Run the daemon in the foreground and log to stderr instead of syslog." |
|||
.TP |
|||
diff --git a/samples/autofs.service.in b/samples/autofs.service.in
|
|||
index 281d31ef..175a806d 100644
|
|||
--- a/samples/autofs.service.in
|
|||
+++ b/samples/autofs.service.in
|
|||
@@ -6,7 +6,7 @@ Wants=network-online.target rpc-statd.service rpcbind.service
|
|||
[Service] |
|||
Type=notify |
|||
EnvironmentFile=-@@autofsconfdir@@/autofs |
|||
-ExecStart=@@sbindir@@/automount $OPTIONS --foreground --dont-check-daemon
|
|||
+ExecStart=@@sbindir@@/automount $OPTIONS --systemd-service --dont-check-daemon
|
|||
ExecReload=/usr/bin/kill -HUP $MAINPID |
|||
KillMode=process |
|||
TimeoutSec=180 |
@ -1,43 +0,0 @@ |
|||
autofs-5.1.4 - add units After line to include statd service |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
autofs needs to ensure statd is started before any NFS mounts |
|||
are attempted. This is because if the first NFS mount starts |
|||
the service and the mount is an automounted directory that is |
|||
included in the PATH used by systemctl (eg. /usr/local/bin) |
|||
the mount cannot complete. |
|||
|
|||
Add rpc-statd.service to the unit "After=" line to try and |
|||
ensure it is started before automount. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
samples/autofs.service.in | 2 +- |
|||
2 files changed, 2 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 1e11c3d5..b9925cf7 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -22,6 +22,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- improve hostname lookup error logging. |
|||
- fix rpm spec install premissions on auto.net and auto.smb. |
|||
- tiny patch for autofs typo and possible bug. |
|||
+- add units After line to include statd service.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/samples/autofs.service.in b/samples/autofs.service.in
|
|||
index 918fc93c..766fc5a5 100644
|
|||
--- a/samples/autofs.service.in
|
|||
+++ b/samples/autofs.service.in
|
|||
@@ -1,6 +1,6 @@
|
|||
[Unit] |
|||
Description=Automounts filesystems on demand |
|||
-After=network.target ypbind.service sssd.service network-online.target remote-fs.target
|
|||
+After=network.target ypbind.service sssd.service network-online.target remote-fs.target rpc-statd.service rpcbind.service
|
|||
Wants=network-online.target rpc-statd.service rpcbind.service |
|||
|
|||
[Service] |
@ -1,138 +0,0 @@ |
|||
autofs-5.1.4 - better handle hesiod support not built in |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The configure option --without-hesiod is not handled well. |
|||
|
|||
If this option is given and hesiod is seen in the master |
|||
map parser or the amd map parser issue a message telling |
|||
the user hesiod support isn't built in. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/master_parse.y | 18 ++++++++++++++++-- |
|||
modules/amd_parse.y | 7 +++++++ |
|||
modules/parse_amd.c | 28 +++++++++++++++++++++++++--- |
|||
4 files changed, 49 insertions(+), 5 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 5a317f12..8e9bd665 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -40,6 +40,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix incorrect locking in sss lookup. |
|||
- fix amd parser opts option handling. |
|||
- fix possible NULL pointer dereference in get_defaults_entry(). |
|||
+- better handle hesiod support not built in.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/lib/master_parse.y b/lib/master_parse.y
|
|||
index 84ca5ca1..9aa57327 100644
|
|||
--- a/lib/master_parse.y
|
|||
+++ b/lib/master_parse.y
|
|||
@@ -171,7 +171,14 @@ line:
|
|||
|
|||
if ((tmp = strchr($2, ','))) |
|||
*tmp++ = '\0'; |
|||
-
|
|||
+#ifndef WITH_HESIOD
|
|||
+ /* Map type or or map type parser is hesiod */
|
|||
+ if (!strcmp($2, "hesiod") || !strcmp(tmp, "hesiod")) {
|
|||
+ master_error("hesiod support not built in");
|
|||
+ local_free_vars();
|
|||
+ YYABORT;
|
|||
+ }
|
|||
+#endif
|
|||
if (type) |
|||
free(type); |
|||
type = master_strdup($2); |
|||
@@ -352,7 +359,14 @@ map: PATH
|
|||
|
|||
if ((tmp = strchr($1, ','))) |
|||
*tmp++ = '\0'; |
|||
-
|
|||
+#ifndef WITH_HESIOD
|
|||
+ /* Map type or or map type parser is hesiod */
|
|||
+ if (!strcmp($1, "hesiod") || !strcmp(tmp, "hesiod")) {
|
|||
+ master_error("hesiod support not built in");
|
|||
+ local_free_vars();
|
|||
+ YYABORT;
|
|||
+ }
|
|||
+#endif
|
|||
if (type) |
|||
free(type); |
|||
if (strcmp($1, "exec")) |
|||
diff --git a/modules/amd_parse.y b/modules/amd_parse.y
|
|||
index be923c2f..17fd9b20 100644
|
|||
--- a/modules/amd_parse.y
|
|||
+++ b/modules/amd_parse.y
|
|||
@@ -574,6 +574,13 @@ static int match_map_option_map_type(char *map_option, char *type)
|
|||
!strcmp(map_type, "nisplus") || |
|||
!strcmp(map_type, "ldap") || |
|||
!strcmp(map_type, "hesiod")) { |
|||
+#ifndef WITH_HESIOD
|
|||
+ if (!strcmp(map_type, "hesiod")) {
|
|||
+ amd_msg("hesiod support not built in");
|
|||
+ free(map_type);
|
|||
+ return 0;
|
|||
+ }
|
|||
+#endif
|
|||
amd_set_value(&entry.map_type, map_type); |
|||
} else if (!strcmp(map_type, "exec")) { |
|||
/* autofs uses "program" for "exec" map type */ |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index 7399d19e..0e48e5ce 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -1871,15 +1871,25 @@ struct amd_entry *make_default_entry(struct autofs_point *ap,
|
|||
if (amd_parse_list(ap, defaults, &dflts, &sv)) |
|||
return NULL; |
|||
defaults_entry = list_entry(dflts.next, struct amd_entry, list); |
|||
- list_del_init(&defaults_entry->list);
|
|||
/* |
|||
* If map type isn't given try to inherit from |
|||
* parent. A NULL map type is valid and means |
|||
* use configured nss sources. |
|||
*/ |
|||
map_type = conf_amd_get_map_type(ap->path); |
|||
- if (map_type)
|
|||
+ if (map_type) {
|
|||
defaults_entry->map_type = map_type; |
|||
+#ifndef HAVE_HESIOD
|
|||
+ if (!strcmp(map_type, "hesiod")) {
|
|||
+ warn(ap->logopt, MODPREFIX
|
|||
+ "hesiod support not built in, "
|
|||
+ "defaults map entry not set");
|
|||
+ defaults_entry = NULL;
|
|||
+ }
|
|||
+#endif
|
|||
+ }
|
|||
+ if (defaults_entry)
|
|||
+ list_del_init(&defaults_entry->list);
|
|||
/* The list should now be empty .... */ |
|||
free_amd_entry_list(&dflts); |
|||
return defaults_entry; |
|||
@@ -2005,8 +2015,20 @@ static struct amd_entry *get_defaults_entry(struct autofs_point *ap,
|
|||
* use configured nss sources. |
|||
*/ |
|||
char *map_type = conf_amd_get_map_type(ap->path); |
|||
- if (map_type)
|
|||
+ if (map_type) {
|
|||
entry->map_type = map_type; |
|||
+#ifndef HAVE_HESIOD
|
|||
+ if (!strcmp(map_type, "hesiod")) {
|
|||
+ warn(ap->logopt, MODPREFIX
|
|||
+ "hesiod support not built in, "
|
|||
+ "attempting to use internal "
|
|||
+ "default");
|
|||
+ free_amd_entry(entry);
|
|||
+ free(expand);
|
|||
+ goto out;
|
|||
+ }
|
|||
+#endif
|
|||
+ }
|
|||
} |
|||
free(expand); |
|||
} |
@ -1,146 +0,0 @@ |
|||
autofs-5.1.4 - change expire type naming to better reflect usage |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Expires can request different types of expire, currently normal or |
|||
immediate (and later force). |
|||
|
|||
Change the naming used in the expire functions to better indicate |
|||
usage. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/direct.c | 8 ++++---- |
|||
daemon/indirect.c | 8 ++++---- |
|||
daemon/state.c | 4 ++-- |
|||
include/state.h | 2 +- |
|||
5 files changed, 12 insertions(+), 11 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 14eb1de8..c5ebb7e0 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -27,6 +27,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix NFS version mask usage. |
|||
- fix fd leak in rpc_do_create_client(). |
|||
- add-man page note about extra slashes in paths. |
|||
+- change expire type naming to better reflect usage.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/direct.c b/daemon/direct.c
|
|||
index 3fdecdb8..b885d12f 100644
|
|||
--- a/daemon/direct.c
|
|||
+++ b/daemon/direct.c
|
|||
@@ -841,7 +841,7 @@ void *expire_proc_direct(void *arg)
|
|||
struct expire_args ec; |
|||
struct autofs_point *ap; |
|||
struct mapent *me = NULL; |
|||
- unsigned int now;
|
|||
+ unsigned int how;
|
|||
int ioctlfd, cur_state; |
|||
int status, ret, left; |
|||
|
|||
@@ -852,7 +852,7 @@ void *expire_proc_direct(void *arg)
|
|||
fatal(status); |
|||
|
|||
ap = ec.ap = ea->ap; |
|||
- now = ea->when;
|
|||
+ how = ea->how;
|
|||
ec.status = -1; |
|||
|
|||
ea->signaled = 1; |
|||
@@ -946,7 +946,7 @@ void *expire_proc_direct(void *arg)
|
|||
|
|||
ioctlfd = me->ioctlfd; |
|||
|
|||
- ret = ops->expire(ap->logopt, ioctlfd, next->path, now);
|
|||
+ ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
|
|||
if (ret) { |
|||
left++; |
|||
pthread_setcancelstate(cur_state, NULL); |
|||
@@ -972,7 +972,7 @@ void *expire_proc_direct(void *arg)
|
|||
debug(ap->logopt, "send expire to trigger %s", next->path); |
|||
|
|||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); |
|||
- ret = ops->expire(ap->logopt, ioctlfd, next->path, now);
|
|||
+ ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
|
|||
if (ret) |
|||
left++; |
|||
pthread_setcancelstate(cur_state, NULL); |
|||
diff --git a/daemon/indirect.c b/daemon/indirect.c
|
|||
index 03c081ed..438a0a21 100644
|
|||
--- a/daemon/indirect.c
|
|||
+++ b/daemon/indirect.c
|
|||
@@ -392,7 +392,7 @@ void *expire_proc_indirect(void *arg)
|
|||
struct mnt_list *mnts = NULL, *next; |
|||
struct expire_args *ea; |
|||
struct expire_args ec; |
|||
- unsigned int now;
|
|||
+ unsigned int how;
|
|||
int offsets, submnts, count; |
|||
int retries; |
|||
int ioctlfd, cur_state; |
|||
@@ -405,7 +405,7 @@ void *expire_proc_indirect(void *arg)
|
|||
fatal(status); |
|||
|
|||
ap = ec.ap = ea->ap; |
|||
- now = ea->when;
|
|||
+ how = ea->how;
|
|||
ec.status = -1; |
|||
|
|||
ea->signaled = 1; |
|||
@@ -530,7 +530,7 @@ void *expire_proc_indirect(void *arg)
|
|||
debug(ap->logopt, "expire %s", next->path); |
|||
|
|||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); |
|||
- ret = ops->expire(ap->logopt, ioctlfd, next->path, now);
|
|||
+ ret = ops->expire(ap->logopt, ioctlfd, next->path, how);
|
|||
if (ret) |
|||
left++; |
|||
pthread_setcancelstate(cur_state, NULL); |
|||
@@ -544,7 +544,7 @@ void *expire_proc_indirect(void *arg)
|
|||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); |
|||
retries = (count_mounts(ap, ap->path, ap->dev) + 1); |
|||
while (retries--) { |
|||
- ret = ops->expire(ap->logopt, ap->ioctlfd, ap->path, now);
|
|||
+ ret = ops->expire(ap->logopt, ap->ioctlfd, ap->path, how);
|
|||
if (ret) |
|||
left++; |
|||
} |
|||
diff --git a/daemon/state.c b/daemon/state.c
|
|||
index cf835e05..ab235455 100644
|
|||
--- a/daemon/state.c
|
|||
+++ b/daemon/state.c
|
|||
@@ -267,7 +267,7 @@ void expire_proc_cleanup(void *arg)
|
|||
return; |
|||
} |
|||
|
|||
-static enum expire expire_proc(struct autofs_point *ap, int now)
|
|||
+static enum expire expire_proc(struct autofs_point *ap, int how)
|
|||
{ |
|||
pthread_t thid; |
|||
struct expire_args *ea; |
|||
@@ -295,7 +295,7 @@ static enum expire expire_proc(struct autofs_point *ap, int now)
|
|||
fatal(status); |
|||
|
|||
ea->ap = ap; |
|||
- ea->when = now;
|
|||
+ ea->how = how;
|
|||
ea->status = 1; |
|||
|
|||
if (ap->type == LKP_INDIRECT) |
|||
diff --git a/include/state.h b/include/state.h
|
|||
index b44a353c..e3079c20 100644
|
|||
--- a/include/state.h
|
|||
+++ b/include/state.h
|
|||
@@ -55,7 +55,7 @@ struct expire_args {
|
|||
unsigned int signaled; |
|||
struct autofs_point *ap; /* autofs mount we are working on */ |
|||
enum states state; /* State prune or expire */ |
|||
- unsigned int when; /* Immediate expire ? */
|
|||
+ unsigned int how; /* Normal, immediate expire ? */
|
|||
int status; /* Return status */ |
|||
}; |
|||
|
@ -1,434 +0,0 @@ |
|||
autofs-5.1.4 - covarity fixes 1 |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
* remove conditional close of nullfd. |
|||
* fix memory leak of local_domain in lib/macros.c:macro_init(). |
|||
* check for NULL prior to several assignments in lib/master_parse.y. |
|||
* fix memory leak in lib/mounts.c:add_std_amd_vars(). |
|||
* add missing break in lib/rpc_subs.c:rpc_get_netid(). |
|||
* fix variable scope problem in modules/amd_parse.c:make_selector(). |
|||
* fix selector itself not freed in lib/parse_subs.c:free_selector(). |
|||
* fix possible memory leak in modules/lookup_ldap.c:parse_ldap_config(). |
|||
* fix possible memory leak in modules/lookup_ldap.c:decode_percent_hack(). |
|||
* fix usage of decode_percent_hack() in modules/lookup_ldap.c. |
|||
* initialize enc_key1 and enc_key2 in modules/lookup_ldap.c:lookup_one(). |
|||
* fix double alloc of map_type in modules/parse_amd.c:make_default_entry(). |
|||
* fix double alloc of map_type in modules/parse_amd.c:get_defaults_entry(). |
|||
* fix possible memory leak in modules/parse_sun.c:parse_reinit(). |
|||
* initialize myoptions and ro_loc in modules/parse_sun.c:mount_subtree(). |
|||
* initialize myoptions and loc in modules/parse_sun.c:parse_mount(). |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
lib/log.c | 3 +-- |
|||
lib/macros.c | 1 + |
|||
lib/master_parse.y | 28 ++++++++++++++++++++++++++++ |
|||
lib/mounts.c | 4 +++- |
|||
lib/parse_subs.c | 1 + |
|||
lib/rpc_subs.c | 1 + |
|||
modules/amd_parse.y | 4 ++-- |
|||
modules/lookup_ldap.c | 27 ++++++++++++++++++++++----- |
|||
modules/parse_amd.c | 4 ++-- |
|||
modules/parse_sun.c | 10 +++++++++- |
|||
10 files changed, 70 insertions(+), 13 deletions(-) |
|||
|
|||
diff --git a/lib/log.c b/lib/log.c
|
|||
index 1a0bc3fa..f6ab77c1 100644
|
|||
--- a/lib/log.c
|
|||
+++ b/lib/log.c
|
|||
@@ -336,8 +336,7 @@ void log_to_syslog(void)
|
|||
exit(1); |
|||
} |
|||
|
|||
- if (nullfd > 2)
|
|||
- close(nullfd);
|
|||
+ close(nullfd);
|
|||
|
|||
return; |
|||
} |
|||
diff --git a/lib/macros.c b/lib/macros.c
|
|||
index dfdca857..5def26da 100644
|
|||
--- a/lib/macros.c
|
|||
+++ b/lib/macros.c
|
|||
@@ -137,6 +137,7 @@ void macro_init(void)
|
|||
|
|||
macro_init_done = 1; |
|||
macro_unlock(); |
|||
+ free(local_domain);
|
|||
return; |
|||
} |
|||
|
|||
diff --git a/lib/master_parse.y b/lib/master_parse.y
|
|||
index 761ade9b..5d687a70 100644
|
|||
--- a/lib/master_parse.y
|
|||
+++ b/lib/master_parse.y
|
|||
@@ -157,6 +157,8 @@ line:
|
|||
|
|||
trim_maptype($2); |
|||
|
|||
+ if (path)
|
|||
+ free(path);
|
|||
path = master_strdup($1); |
|||
if (!path) { |
|||
master_error("memory allocation error"); |
|||
@@ -167,6 +169,8 @@ line:
|
|||
if ((tmp = strchr($2, ','))) |
|||
*tmp++ = '\0'; |
|||
|
|||
+ if (type)
|
|||
+ free(type);
|
|||
type = master_strdup($2); |
|||
if (!type) { |
|||
master_error("memory allocation error"); |
|||
@@ -174,6 +178,8 @@ line:
|
|||
YYABORT; |
|||
} |
|||
if (tmp) { |
|||
+ if (format)
|
|||
+ free(format);
|
|||
format = master_strdup(tmp); |
|||
if (!format) { |
|||
master_error("memory allocation error"); |
|||
@@ -204,6 +210,8 @@ line:
|
|||
|
|||
mapspec: map |
|||
{ |
|||
+ if (local_argv)
|
|||
+ free_argv(local_argc, (const char **) local_argv);
|
|||
local_argc = tmp_argc; |
|||
local_argv = tmp_argv; |
|||
tmp_argc = 0; |
|||
@@ -211,6 +219,8 @@ mapspec: map
|
|||
} |
|||
| map options |
|||
{ |
|||
+ if (local_argv)
|
|||
+ free_argv(local_argc, (const char **) local_argv);
|
|||
local_argc = tmp_argc; |
|||
local_argv = tmp_argv; |
|||
tmp_argc = 0; |
|||
@@ -288,6 +298,8 @@ map: PATH
|
|||
} |
|||
| MAPHOSTS |
|||
{ |
|||
+ if (type)
|
|||
+ free(type);
|
|||
type = master_strdup($1 + 1); |
|||
if (!type) { |
|||
local_free_vars(); |
|||
@@ -302,6 +314,8 @@ map: PATH
|
|||
} |
|||
| MAPNULL |
|||
{ |
|||
+ if (type)
|
|||
+ free(type);
|
|||
type = master_strdup($1 + 1); |
|||
if (!type) { |
|||
local_free_vars(); |
|||
@@ -310,6 +324,8 @@ map: PATH
|
|||
} |
|||
| dnattrs |
|||
{ |
|||
+ if (type)
|
|||
+ free(type);
|
|||
type = master_strdup("ldap"); |
|||
if (!type) { |
|||
local_free_vars(); |
|||
@@ -332,6 +348,8 @@ map: PATH
|
|||
if ((tmp = strchr($1, ','))) |
|||
*tmp++ = '\0'; |
|||
|
|||
+ if (type)
|
|||
+ free(type);
|
|||
if (strcmp($1, "exec")) |
|||
type = master_strdup($1); |
|||
else |
|||
@@ -342,6 +360,8 @@ map: PATH
|
|||
YYABORT; |
|||
} |
|||
if (tmp) { |
|||
+ if (format)
|
|||
+ free(format);
|
|||
format = master_strdup(tmp); |
|||
if (!format) { |
|||
master_error("memory allocation error"); |
|||
@@ -366,6 +386,8 @@ map: PATH
|
|||
if ((tmp = strchr($1, ','))) |
|||
*tmp++ = '\0'; |
|||
|
|||
+ if (type)
|
|||
+ free(type);
|
|||
if (strcmp($1, "exec")) |
|||
type = master_strdup($1); |
|||
else |
|||
@@ -376,6 +398,8 @@ map: PATH
|
|||
YYABORT; |
|||
} |
|||
if (tmp) { |
|||
+ if (format)
|
|||
+ free(format);
|
|||
format = master_strdup(tmp); |
|||
if (!format) { |
|||
master_error("memory allocation error"); |
|||
@@ -400,6 +424,8 @@ map: PATH
|
|||
if ((tmp = strchr($1, ','))) |
|||
*tmp++ = '\0'; |
|||
|
|||
+ if (type)
|
|||
+ free(type);
|
|||
if (strcmp($1, "exec")) |
|||
type = master_strdup($1); |
|||
else |
|||
@@ -410,6 +436,8 @@ map: PATH
|
|||
YYABORT; |
|||
} |
|||
if (tmp) { |
|||
+ if (format)
|
|||
+ free(format);
|
|||
format = master_strdup(tmp); |
|||
if (!format) { |
|||
master_error("memory allocation error"); |
|||
diff --git a/lib/mounts.c b/lib/mounts.c
|
|||
index f46fab2b..a35503bf 100644
|
|||
--- a/lib/mounts.c
|
|||
+++ b/lib/mounts.c
|
|||
@@ -489,8 +489,10 @@ void add_std_amd_vars(struct substvar *sv)
|
|||
const struct substvar *v = macro_findvar(sv, "domain", 4); |
|||
if (v && *v->val) { |
|||
tmp = strdup(v->val); |
|||
- if (tmp)
|
|||
+ if (tmp) {
|
|||
macro_global_addvar("cluster", 7, tmp); |
|||
+ free(tmp);
|
|||
+ }
|
|||
} |
|||
} |
|||
|
|||
diff --git a/lib/parse_subs.c b/lib/parse_subs.c
|
|||
index 841e81fd..cdda2e1a 100644
|
|||
--- a/lib/parse_subs.c
|
|||
+++ b/lib/parse_subs.c
|
|||
@@ -189,6 +189,7 @@ void free_selector(struct selector *selector)
|
|||
free(s->func.arg2); |
|||
s = next; |
|||
} |
|||
+ free(selector);
|
|||
return; |
|||
} |
|||
|
|||
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
|
|||
index 9451c455..8b23627a 100644
|
|||
--- a/lib/rpc_subs.c
|
|||
+++ b/lib/rpc_subs.c
|
|||
@@ -389,6 +389,7 @@ static enum clnt_stat rpc_get_netid(const sa_family_t family,
|
|||
} |
|||
|
|||
*netid = nc_netid; |
|||
+ break;
|
|||
} |
|||
endnetconfig(handle); |
|||
free(nc_proto); |
|||
diff --git a/modules/amd_parse.y b/modules/amd_parse.y
|
|||
index 1d72f190..5bd688d9 100644
|
|||
--- a/modules/amd_parse.y
|
|||
+++ b/modules/amd_parse.y
|
|||
@@ -822,13 +822,13 @@ static int make_selector(char *name,
|
|||
if (!value1) |
|||
tmp = NULL; |
|||
else { |
|||
- char *tmp = amd_strdup(value1);
|
|||
+ tmp = amd_strdup(value1);
|
|||
if (!tmp) |
|||
goto error; |
|||
} |
|||
s->func.arg1 = tmp; |
|||
} else if (s->sel->flags & SEL_FLAG_FUNC2) { |
|||
- char *tmp = amd_strdup(value1);
|
|||
+ tmp = amd_strdup(value1);
|
|||
if (!tmp) |
|||
goto error; |
|||
s->func.arg1 = tmp; |
|||
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
|
|||
index 37810e1c..06c96973 100644
|
|||
--- a/modules/lookup_ldap.c
|
|||
+++ b/modules/lookup_ldap.c
|
|||
@@ -1137,6 +1137,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt)
|
|||
error(logopt, |
|||
MODPREFIX "stat(2) failed with error %s.", |
|||
strerror(errno)); |
|||
+ free(auth_conf);
|
|||
return 0; |
|||
} |
|||
|
|||
@@ -1148,6 +1149,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt)
|
|||
"Please make sure that it is owned by root, group " |
|||
"is root, and the mode is 0600.", |
|||
auth_conf); |
|||
+ free(auth_conf);
|
|||
return -1; |
|||
} |
|||
|
|||
@@ -1182,9 +1184,11 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt)
|
|||
goto out; |
|||
} |
|||
|
|||
- if (!usetls || ctxt->port == LDAPS_PORT)
|
|||
+ if (!usetls || ctxt->port == LDAPS_PORT) {
|
|||
use_tls = LDAP_TLS_DONT_USE; |
|||
- else {
|
|||
+ if (usetls)
|
|||
+ free(usetls);
|
|||
+ } else {
|
|||
if (!strcasecmp(usetls, "yes")) |
|||
use_tls = LDAP_TLS_INIT; |
|||
else if (!strcasecmp(usetls, "no")) |
|||
@@ -1194,6 +1198,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt)
|
|||
MODPREFIX |
|||
"The usetls property must have value " |
|||
"\"yes\" or \"no\"."); |
|||
+ free(usetls);
|
|||
ret = -1; |
|||
goto out; |
|||
} |
|||
@@ -1221,6 +1226,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt)
|
|||
MODPREFIX |
|||
"The tlsrequired property must have value " |
|||
"\"yes\" or \"no\"."); |
|||
+ free(tlsrequired);
|
|||
ret = -1; |
|||
goto out; |
|||
} |
|||
@@ -1252,6 +1258,7 @@ int parse_ldap_config(unsigned logopt, struct lookup_context *ctxt)
|
|||
MODPREFIX |
|||
"The authrequired property must have value " |
|||
"\"yes\", \"no\", \"autodetect\", or \"simple\"."); |
|||
+ free(authrequired);
|
|||
ret = -1; |
|||
goto out; |
|||
} |
|||
@@ -1338,6 +1345,7 @@ auth_fail:
|
|||
(void)get_property(logopt, root, "credentialcache", &client_cc); |
|||
|
|||
ctxt->auth_conf = auth_conf; |
|||
+ auth_conf = NULL;
|
|||
ctxt->use_tls = use_tls; |
|||
ctxt->tls_required = tls_required; |
|||
ctxt->auth_required = auth_required; |
|||
@@ -1375,8 +1383,12 @@ auth_fail:
|
|||
user, secret ? "specified" : "unspecified", |
|||
client_princ, client_cc); |
|||
} |
|||
+ if (authtype)
|
|||
+ free(authtype);
|
|||
out: |
|||
xmlFreeDoc(doc); |
|||
+ if (auth_conf)
|
|||
+ free(auth_conf);
|
|||
|
|||
if (fallback) |
|||
return 0; |
|||
@@ -1986,7 +1998,7 @@ int lookup_read_master(struct master *master, time_t age, void *context)
|
|||
} |
|||
} else if (count == 1) { |
|||
dec_len = decode_percent_hack(keyValue[0], &key); |
|||
- if (dec_len < 0) {
|
|||
+ if (dec_len <= 0) {
|
|||
error(logopt, MODPREFIX |
|||
"invalid map key %s - ignoring", |
|||
*keyValue); |
|||
@@ -1994,7 +2006,7 @@ int lookup_read_master(struct master *master, time_t age, void *context)
|
|||
} |
|||
} else { |
|||
dec_len = decode_percent_hack(keyValue[0], &key); |
|||
- if (dec_len < 0) {
|
|||
+ if (dec_len <= 0) {
|
|||
error(logopt, MODPREFIX |
|||
"invalid map key %s - ignoring", |
|||
*keyValue); |
|||
@@ -2004,7 +2016,7 @@ int lookup_read_master(struct master *master, time_t age, void *context)
|
|||
for (i = 1; i < count; i++) { |
|||
char *k; |
|||
dec_len = decode_percent_hack(keyValue[i], &k); |
|||
- if (dec_len < 0) {
|
|||
+ if (dec_len <= 0) {
|
|||
error(logopt, MODPREFIX |
|||
"invalid map key %s - ignoring", |
|||
*keyValue); |
|||
@@ -2159,6 +2171,8 @@ static int decode_percent_hack(const char *name, char **key)
|
|||
*key = NULL; |
|||
|
|||
len = get_percent_decoded_len(name); |
|||
+ if (!len)
|
|||
+ return 0;
|
|||
new = malloc(len + 1); |
|||
if (!new) |
|||
return -1; |
|||
@@ -2998,6 +3012,9 @@ static int lookup_one(struct autofs_point *ap, struct map_source *source,
|
|||
attrs[1] = info; |
|||
attrs[2] = NULL; |
|||
|
|||
+ enc_key1 = NULL;
|
|||
+ enc_key2 = NULL;
|
|||
+
|
|||
if (*qKey == '*' && qKey_len == 1) |
|||
*qKey = '/'; |
|||
else if (!strcasecmp(class, "nisObject")) { |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index 9543ced3..ea57270a 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -1879,7 +1879,7 @@ struct amd_entry *make_default_entry(struct autofs_point *ap,
|
|||
*/ |
|||
map_type = conf_amd_get_map_type(ap->path); |
|||
if (map_type) |
|||
- defaults_entry->map_type = strdup(map_type);
|
|||
+ defaults_entry->map_type = map_type;
|
|||
/* The list should now be empty .... */ |
|||
free_amd_entry_list(&dflts); |
|||
return defaults_entry; |
|||
@@ -2006,7 +2006,7 @@ static struct amd_entry *get_defaults_entry(struct autofs_point *ap,
|
|||
*/ |
|||
char *map_type = conf_amd_get_map_type(ap->path); |
|||
if (map_type) |
|||
- entry->map_type = strdup(map_type);
|
|||
+ entry->map_type = map_type;
|
|||
} |
|||
free(expand); |
|||
} |
|||
diff --git a/modules/parse_sun.c b/modules/parse_sun.c
|
|||
index 536a9bc1..88dde0b2 100644
|
|||
--- a/modules/parse_sun.c
|
|||
+++ b/modules/parse_sun.c
|
|||
@@ -443,8 +443,10 @@ int parse_reinit(int argc, const char *const *argv, void **context)
|
|||
|
|||
*new = default_context; |
|||
|
|||
- if (do_init(argc, argv, new))
|
|||
+ if (do_init(argc, argv, new)) {
|
|||
+ free(new);
|
|||
return 1; |
|||
+ }
|
|||
|
|||
kill_context(ctxt); |
|||
|
|||
@@ -1143,6 +1145,9 @@ static int mount_subtree(struct autofs_point *ap, struct mapent *me,
|
|||
const char *root; |
|||
int ro_len; |
|||
|
|||
+ myoptions = NULL;
|
|||
+ ro_loc = NULL;
|
|||
+
|
|||
rv = parse_mapent(ro->mapent, |
|||
options, &myoptions, &ro_loc, ap->logopt); |
|||
if (!rv) { |
|||
@@ -1524,6 +1529,9 @@ dont_expand:
|
|||
p += l; |
|||
p = skipspace(p); |
|||
|
|||
+ myoptions = NULL;
|
|||
+ loc = NULL;
|
|||
+
|
|||
l = parse_mapent(p, options, &myoptions, &loc, ap->logopt); |
|||
if (!l) { |
|||
cache_delete_offset_list(mc, name); |
@ -1,48 +0,0 @@ |
|||
autofs-5.1.4 - dont allow trailing slash in master map mount points |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
If a master map mount point path has a trailing '/' this can cause |
|||
problems so remove them at parse time. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/master_parse.y | 5 +++++ |
|||
2 files changed, 6 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 1e5ec15b..a7bb89dc 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -12,6 +12,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- use_hostname_for_mounts shouldn't prevent selection among replicas. |
|||
- fix monotonic_elapsed. |
|||
- Makefiles.rules: remove 'samples' from SUBDIRS. |
|||
+- dont allow trailing slash in master map mount points.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/lib/master_parse.y b/lib/master_parse.y
|
|||
index 42e03c2d..761ade9b 100644
|
|||
--- a/lib/master_parse.y
|
|||
+++ b/lib/master_parse.y
|
|||
@@ -749,6 +749,7 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
|
|||
struct map_source *source; |
|||
unsigned int logopt = logging; |
|||
unsigned int m_logopt = master->logopt; |
|||
+ size_t mp_len;
|
|||
int ret; |
|||
|
|||
local_init_vars(); |
|||
@@ -763,6 +764,10 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
|
|||
return 0; |
|||
} |
|||
|
|||
+ mp_len = strlen(path);
|
|||
+ while (mp_len && path[--mp_len] == '/')
|
|||
+ path[mp_len] = 0;
|
|||
+
|
|||
nc = master->nc; |
|||
|
|||
/* Add null map entries to the null map cache */ |
@ -1,56 +0,0 @@ |
|||
autofs-5.1.4 - dont use array for path when not necessary |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
In parse_amd.c:do_link_mount() a character array is used to construct |
|||
a path when a pointer to the relevant amd entry field is sufficient. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/parse_amd.c | 6 +++--- |
|||
2 files changed, 4 insertions(+), 3 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 0f30596f..13f01397 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -3,6 +3,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix directory create permission. |
|||
- fix use after free in do_master_list_reset(). |
|||
- fix deadlock in dumpmaps. |
|||
+- dont use array for path when not necessary.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index c4b3ef0b..2cce5417 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -967,8 +967,8 @@ static int do_auto_mount(struct autofs_point *ap, const char *name,
|
|||
static int do_link_mount(struct autofs_point *ap, const char *name, |
|||
struct amd_entry *entry, unsigned int flags) |
|||
{ |
|||
- char target[PATH_MAX + 1];
|
|||
const char *opts = (entry->opts && *entry->opts) ? entry->opts : NULL; |
|||
+ char *target;
|
|||
int ret; |
|||
|
|||
if (entry->sublink) { |
|||
@@ -977,14 +977,14 @@ static int do_link_mount(struct autofs_point *ap, const char *name,
|
|||
"error: sublink option length is too long"); |
|||
return 0; |
|||
} |
|||
- strcpy(target, entry->sublink);
|
|||
+ target = entry->sublink;
|
|||
} else { |
|||
if (strlen(entry->fs) > PATH_MAX) { |
|||
error(ap->logopt, MODPREFIX |
|||
"error: fs option length is too long"); |
|||
return 0; |
|||
} |
|||
- strcpy(target, entry->fs);
|
|||
+ target = entry->fs;
|
|||
} |
|||
|
|||
if (!(flags & CONF_AUTOFS_USE_LOFS)) |
@ -1,49 +0,0 @@ |
|||
autofs-5.1.4 - enable SIGUSR2 handling in rpm spec file |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Because the preferred usage is to leave busy mounts in place and |
|||
re-connect to them on start up the SIGUSR2 logic hasn't been used |
|||
or tested for a long time. |
|||
|
|||
But it can be useful so enable it so any problems with it can be |
|||
identified and resolved. |
|||
|
|||
It turns out that the SIGUSR2 forced shutdown behaves like a SIGUSR1 |
|||
prune expire excpet that autofs will shutdown if all current mounts |
|||
are expired. But the kernel currently won't trigger expires for |
|||
mounts that are in use so it doesn't function quite as intended. |
|||
|
|||
Enable the forced shutdown anyway so it will function if the kernel |
|||
supports it. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
autofs.spec | 1 + |
|||
2 files changed, 2 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 0b7983ea..740f804f 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -29,6 +29,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add-man page note about extra slashes in paths. |
|||
- change expire type naming to better reflect usage. |
|||
- use defines for expire type. |
|||
+- enable SIGUSR2 handling in rpm spec file.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/autofs.spec b/autofs.spec
|
|||
index f857d9da..6419e3e3 100644
|
|||
--- a/autofs.spec
|
|||
+++ b/autofs.spec
|
|||
@@ -97,6 +97,7 @@ LDFLAGS="-Wl,-z,now" \
|
|||
./configure --libdir=%{_libdir} \ |
|||
--disable-mount-locking \ |
|||
--enable-ignore-busy \ |
|||
+ --enable-forced-shutdown \
|
|||
%{?systemd_configure_arg:} \ |
|||
%{?libtirpc_configure_arg:} \ |
|||
%{?fedfs_configure_arg:} |
@ -1,75 +0,0 @@ |
|||
autofs-5.1.4 - fix NFS version mask usage |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Upstream commit a8af65195 changed NFS_VERS_MASK to exclude NFSv2 |
|||
so NFSv2 would be excluded in the default availability probe. |
|||
|
|||
But NFS_VERS_MASK is used like a mask elsewhere and causes NFSv2 |
|||
to be cleared for the availability probe even when it is requested. |
|||
|
|||
So add a macro to NFS_VERS_DEFAULT (and accompanying macros) to be |
|||
used to set initial defaults and restore NFS_VERS_MASK to what it |
|||
should be when used as a mask. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
include/replicated.h | 5 ++++- |
|||
modules/mount_nfs.c | 6 +++--- |
|||
3 files changed, 8 insertions(+), 4 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index e3ada7e7..dd48bf71 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -24,6 +24,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- tiny patch for autofs typo and possible bug. |
|||
- add units After line to include statd service. |
|||
- use systemd sd_notify() at startup. |
|||
+- fix NFS version mask usage.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/include/replicated.h b/include/replicated.h
|
|||
index 0f482d21..95ff1f0d 100644
|
|||
--- a/include/replicated.h
|
|||
+++ b/include/replicated.h
|
|||
@@ -26,7 +26,9 @@
|
|||
#define NFS2_SUPPORTED 0x0010 |
|||
#define NFS3_SUPPORTED 0x0020 |
|||
#define NFS4_SUPPORTED 0x0040 |
|||
-#define NFS_VERS_MASK (NFS3_SUPPORTED)
|
|||
+#define NFS_VERS_DEFAULT (NFS3_SUPPORTED)
|
|||
+#define NFS_VERS_MASK (NFS2_SUPPORTED|NFS3_SUPPORTED)
|
|||
+#define NFS4_VERS_DEFAULT (NFS4_SUPPORTED)
|
|||
#define NFS4_VERS_MASK (NFS4_SUPPORTED) |
|||
|
|||
#define NFS2_REQUESTED NFS2_SUPPORTED |
|||
@@ -39,6 +41,7 @@
|
|||
#define UDP_REQUESTED UDP_SUPPORTED |
|||
#define TCP6_REQUESTED 0x0100 |
|||
#define UDP6_REQUESTED 0x0200 |
|||
+#define NFS_PROTO_DEFAULT (TCP_SUPPORTED|UDP_SUPPORTED)
|
|||
#define NFS_PROTO_MASK (TCP_SUPPORTED|UDP_SUPPORTED) |
|||
|
|||
#define NFS2_TCP_SUPPORTED NFS2_SUPPORTED |
|||
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
|
|||
index 4cf0cd27..426c27bd 100644
|
|||
--- a/modules/mount_nfs.c
|
|||
+++ b/modules/mount_nfs.c
|
|||
@@ -86,11 +86,11 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
root, name, what, fstype, options); |
|||
|
|||
mount_default_proto = defaults_get_mount_nfs_default_proto(); |
|||
- vers = NFS_VERS_MASK | NFS_PROTO_MASK;
|
|||
+ vers = NFS_VERS_DEFAULT | NFS_PROTO_DEFAULT;
|
|||
if (strcmp(fstype, "nfs4") == 0) |
|||
- vers = NFS4_VERS_MASK | TCP_SUPPORTED;
|
|||
+ vers = NFS4_VERS_DEFAULT | TCP_SUPPORTED;
|
|||
else if (mount_default_proto == 4) |
|||
- vers = vers | NFS4_VERS_MASK;
|
|||
+ vers = vers | NFS4_VERS_DEFAULT;
|
|||
|
|||
/* Extract "nosymlink" pseudo-option which stops local filesystems |
|||
* from being symlinked. |
@ -1,46 +0,0 @@ |
|||
autofs-5.1.4 - fix age setting at startup |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Commit 2b567ace7d, which resets the master map list on startup |
|||
before retrying a read, incorrectly sets age using time() when |
|||
it should use monotonic_time(). |
|||
|
|||
This causes lookup failures for submounts in cases where a master |
|||
map read retry was needed. |
|||
|
|||
The failure happens because the mount entry age is greater than |
|||
the map entry age which is meant to indicate the map is no longer |
|||
valid which is not the case. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/automount.c | 2 +- |
|||
2 files changed, 2 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 740f804f..c39aa0e5 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -30,6 +30,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- change expire type naming to better reflect usage. |
|||
- use defines for expire type. |
|||
- enable SIGUSR2 handling in rpm spec file. |
|||
+- fix age setting at startup.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/automount.c b/daemon/automount.c
|
|||
index 3fbfb9aa..99534295 100644
|
|||
--- a/daemon/automount.c
|
|||
+++ b/daemon/automount.c
|
|||
@@ -2606,7 +2606,7 @@ int main(int argc, char *argv[])
|
|||
* we have anyway. |
|||
*/ |
|||
do_master_list_reset(master_list); |
|||
- age = time(NULL);
|
|||
+ age = monotonic_time(NULL);
|
|||
master_read_master(master_list, age, 1); |
|||
} |
|||
} |
@ -1,72 +0,0 @@ |
|||
autofs-5.1.4 - fix amd parser opts option handling |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The recent implementation of the amd map program mount feature |
|||
introduced a regression in the amd parser where only the first |
|||
option of a comma separated list of is applied to a mount entry. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/amd_parse.y | 4 ++-- |
|||
modules/parse_amd.c | 4 +++- |
|||
3 files changed, 6 insertions(+), 3 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index aa485e8f..0365a161 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -38,6 +38,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add master map pseudo options for mount propagation. |
|||
- fix use after free in parse_ldap_config(). |
|||
- fix incorrect locking in sss lookup. |
|||
+- fix amd parser opts option handling.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/modules/amd_parse.y b/modules/amd_parse.y
|
|||
index 5bd688d9..be923c2f 100644
|
|||
--- a/modules/amd_parse.y
|
|||
+++ b/modules/amd_parse.y
|
|||
@@ -401,7 +401,7 @@ option_assignment: MAP_OPTION OPTION_ASSIGN FS_TYPE
|
|||
} |
|||
| MNT_OPTION OPTION_ASSIGN options |
|||
{ |
|||
- if (!match_mnt_option_options($1, $3)) {
|
|||
+ if (!match_mnt_option_options($1, opts)) {
|
|||
amd_notify($1); |
|||
YYABORT; |
|||
} |
|||
@@ -409,7 +409,7 @@ option_assignment: MAP_OPTION OPTION_ASSIGN FS_TYPE
|
|||
} |
|||
| MNT_OPTION OPTION_ASSIGN QUOTE options QUOTE |
|||
{ |
|||
- if (!match_mnt_option_options($1, $4)) {
|
|||
+ if (!match_mnt_option_options($1, opts)) {
|
|||
amd_notify($1); |
|||
YYABORT; |
|||
} |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index ea57270a..627c3c00 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -2136,6 +2136,7 @@ int parse_mount(struct autofs_point *ap, const char *name,
|
|||
list_del_init(&this->list); |
|||
cur_defaults = this; |
|||
update_with_defaults(defaults_entry, cur_defaults, sv); |
|||
+ debug(ap->logopt, "merged /defaults entry with defaults");
|
|||
continue; |
|||
} else if (this->flags & AMD_DEFAULTS_RESET) { |
|||
struct amd_entry *nd, *new; |
|||
@@ -2174,8 +2175,9 @@ int parse_mount(struct autofs_point *ap, const char *name,
|
|||
|
|||
at_least_one = 1; |
|||
|
|||
- debug(ap->logopt, "expand mount entry");
|
|||
+ debug(ap->logopt, "update mount entry with defaults");
|
|||
update_with_defaults(cur_defaults, this, sv); |
|||
+ debug(ap->logopt, "expand mount entry");
|
|||
sv = expand_entry(ap, this, flags, sv); |
|||
sv = merge_entry_options(ap, this, sv); |
|||
normalize_sublink(ap->logopt, this, sv); |
@ -1,40 +0,0 @@ |
|||
autofs-5.1.4 - fix deadlock in dumpmaps |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Commit a223d11fa8e (autofs-5.1.3 - serialize calls to open_xxxx() |
|||
functions) introduces a deadlock when using the dumpmaps function. |
|||
|
|||
In this case the open fd mutex needs to be unlocked in the forked |
|||
child process of the do_spawn() function. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/spawn.c | 1 + |
|||
2 files changed, 2 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 2747327b..0f30596f 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -2,6 +2,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix flag file permission. |
|||
- fix directory create permission. |
|||
- fix use after free in do_master_list_reset(). |
|||
+- fix deadlock in dumpmaps.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/spawn.c b/daemon/spawn.c
|
|||
index fabe577e..dbbca7fa 100644
|
|||
--- a/daemon/spawn.c
|
|||
+++ b/daemon/spawn.c
|
|||
@@ -338,6 +338,7 @@ static int do_spawn(unsigned logopt, unsigned int wait,
|
|||
dup2(pipefd[1], STDOUT_FILENO); |
|||
dup2(pipefd[1], STDERR_FILENO); |
|||
close(pipefd[1]); |
|||
+ open_mutex_unlock();
|
|||
|
|||
/* what to mount must always be second last */ |
|||
while (*pargv++) |
@ -1,207 +0,0 @@ |
|||
autofs-5.1.4 - fix directory create permission |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
autofs mount point directory creation is done using a permission of |
|||
0555. |
|||
|
|||
But it is necessary to create directories within autofs mount points |
|||
for some map entry types so write access should be set for the owner |
|||
on mount point directories. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/automount.c | 2 ++ |
|||
daemon/direct.c | 4 ++-- |
|||
daemon/indirect.c | 2 +- |
|||
daemon/lookup.c | 2 +- |
|||
include/automount.h | 1 + |
|||
modules/mount_bind.c | 6 +++--- |
|||
modules/mount_changer.c | 2 +- |
|||
modules/mount_ext2.c | 2 +- |
|||
modules/mount_generic.c | 2 +- |
|||
modules/mount_nfs.c | 2 +- |
|||
modules/parse_amd.c | 2 +- |
|||
12 files changed, 16 insertions(+), 12 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index d07d88ce..4faab510 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -1,5 +1,6 @@
|
|||
xx/xx/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
+- fix directory create permission.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/automount.c b/daemon/automount.c
|
|||
index 5c739617..dcdc19fb 100644
|
|||
--- a/daemon/automount.c
|
|||
+++ b/daemon/automount.c
|
|||
@@ -51,6 +51,8 @@ const char *libdir = AUTOFS_LIB_DIR; /* Location of library modules */
|
|||
const char *mapdir = AUTOFS_MAP_DIR; /* Location of mount maps */ |
|||
const char *confdir = AUTOFS_CONF_DIR; /* Location of autofs config file */ |
|||
|
|||
+unsigned int mp_mode = 0755;
|
|||
+
|
|||
unsigned int nfs_mount_uses_string_options = 0; |
|||
static struct nfs_mount_vers vers, check = {1, 1, 1}; |
|||
|
|||
diff --git a/daemon/direct.c b/daemon/direct.c
|
|||
index 9a134351..3fdecdb8 100644
|
|||
--- a/daemon/direct.c
|
|||
+++ b/daemon/direct.c
|
|||
@@ -424,7 +424,7 @@ int do_mount_autofs_direct(struct autofs_point *ap,
|
|||
} |
|||
|
|||
/* In case the directory doesn't exist, try to mkdir it */ |
|||
- if (mkdir_path(me->key, 0555) < 0) {
|
|||
+ if (mkdir_path(me->key, mp_mode) < 0) {
|
|||
if (errno != EEXIST && errno != EROFS) { |
|||
crit(ap->logopt, |
|||
"failed to create mount directory %s", me->key); |
|||
@@ -739,7 +739,7 @@ int mount_autofs_offset(struct autofs_point *ap, struct mapent *me, const char *
|
|||
strcat(mountpoint, offset); |
|||
|
|||
/* In case the directory doesn't exist, try to mkdir it */ |
|||
- if (mkdir_path(mountpoint, 0555) < 0) {
|
|||
+ if (mkdir_path(mountpoint, mp_mode) < 0) {
|
|||
if (errno == EEXIST) { |
|||
/* |
|||
* If the mount point directory is a real mount |
|||
diff --git a/daemon/indirect.c b/daemon/indirect.c
|
|||
index ffb11b8c..03c081ed 100644
|
|||
--- a/daemon/indirect.c
|
|||
+++ b/daemon/indirect.c
|
|||
@@ -133,7 +133,7 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
|
|||
} |
|||
|
|||
/* In case the directory doesn't exist, try to mkdir it */ |
|||
- if (mkdir_path(root, 0555) < 0) {
|
|||
+ if (mkdir_path(root, mp_mode) < 0) {
|
|||
if (errno != EEXIST && errno != EROFS) { |
|||
crit(ap->logopt, |
|||
"failed to create autofs directory %s", |
|||
diff --git a/daemon/lookup.c b/daemon/lookup.c
|
|||
index cb67e7d9..6a722b3b 100644
|
|||
--- a/daemon/lookup.c
|
|||
+++ b/daemon/lookup.c
|
|||
@@ -802,7 +802,7 @@ int lookup_ghost(struct autofs_point *ap, const char *root)
|
|||
goto next; |
|||
} |
|||
|
|||
- ret = mkdir_path(fullpath, 0555);
|
|||
+ ret = mkdir_path(fullpath, mp_mode);
|
|||
if (ret < 0 && errno != EEXIST) { |
|||
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
|||
warn(ap->logopt, |
|||
diff --git a/include/automount.h b/include/automount.h
|
|||
index 2e2c2b02..e5c19d23 100644
|
|||
--- a/include/automount.h
|
|||
+++ b/include/automount.h
|
|||
@@ -269,6 +269,7 @@ void reset_signals(void);
|
|||
int do_mount(struct autofs_point *ap, const char *root, const char *name, |
|||
int name_len, const char *what, const char *fstype, |
|||
const char *options); |
|||
+extern unsigned int mp_mode;
|
|||
int mkdir_path(const char *path, mode_t mode); |
|||
int rmdir_path(struct autofs_point *ap, const char *path, dev_t dev); |
|||
|
|||
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
|
|||
index 4864ea51..5effa880 100644
|
|||
--- a/modules/mount_bind.c
|
|||
+++ b/modules/mount_bind.c
|
|||
@@ -151,7 +151,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
|
|||
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); |
|||
|
|||
- status = mkdir_path(fullpath, 0555);
|
|||
+ status = mkdir_path(fullpath, mp_mode);
|
|||
if (status && errno != EEXIST) { |
|||
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
|||
error(ap->logopt, |
|||
@@ -203,7 +203,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
} else { |
|||
debug(ap->logopt, |
|||
MODPREFIX "calling mkdir_path %s", basepath); |
|||
- if (mkdir_path(basepath, 0555) && errno != EEXIST) {
|
|||
+ if (mkdir_path(basepath, mp_mode) && errno != EEXIST) {
|
|||
char *estr; |
|||
estr = strerror_r(errno, buf, MAX_ERR_BUF); |
|||
error(ap->logopt, |
|||
@@ -219,7 +219,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
"failed to create symlink %s -> %s", |
|||
fullpath, what); |
|||
if ((ap->flags & MOUNT_FLAG_GHOST) && !status) { |
|||
- if (mkdir_path(fullpath, 0555) && errno != EEXIST) {
|
|||
+ if (mkdir_path(fullpath, mp_mode) && errno != EEXIST) {
|
|||
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
|||
error(ap->logopt, |
|||
MODPREFIX "mkdir_path %s failed: %s", |
|||
diff --git a/modules/mount_changer.c b/modules/mount_changer.c
|
|||
index 798f23b2..7d44a720 100644
|
|||
--- a/modules/mount_changer.c
|
|||
+++ b/modules/mount_changer.c
|
|||
@@ -87,7 +87,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
|
|||
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); |
|||
|
|||
- status = mkdir_path(fullpath, 0555);
|
|||
+ status = mkdir_path(fullpath, mp_mode);
|
|||
if (status && errno != EEXIST) { |
|||
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
|||
error(ap->logopt, |
|||
diff --git a/modules/mount_ext2.c b/modules/mount_ext2.c
|
|||
index 90fc0876..3bbea95a 100644
|
|||
--- a/modules/mount_ext2.c
|
|||
+++ b/modules/mount_ext2.c
|
|||
@@ -69,7 +69,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
|
|||
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); |
|||
|
|||
- status = mkdir_path(fullpath, 0555);
|
|||
+ status = mkdir_path(fullpath, mp_mode);
|
|||
if (status && errno != EEXIST) { |
|||
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
|||
error(ap->logopt, |
|||
diff --git a/modules/mount_generic.c b/modules/mount_generic.c
|
|||
index ae637875..b1a3adbf 100644
|
|||
--- a/modules/mount_generic.c
|
|||
+++ b/modules/mount_generic.c
|
|||
@@ -68,7 +68,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
|
|||
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); |
|||
|
|||
- status = mkdir_path(fullpath, 0555);
|
|||
+ status = mkdir_path(fullpath, mp_mode);
|
|||
if (status && errno != EEXIST) { |
|||
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
|||
error(ap->logopt, |
|||
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
|
|||
index bf712a93..77166544 100644
|
|||
--- a/modules/mount_nfs.c
|
|||
+++ b/modules/mount_nfs.c
|
|||
@@ -277,7 +277,7 @@ dont_probe:
|
|||
|
|||
debug(ap->logopt, MODPREFIX "calling mkdir_path %s", fullpath); |
|||
|
|||
- status = mkdir_path(fullpath, 0555);
|
|||
+ status = mkdir_path(fullpath, mp_mode);
|
|||
if (status && errno != EEXIST) { |
|||
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
|||
error(ap->logopt, |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index b40c1ad1..c4b3ef0b 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -1288,7 +1288,7 @@ static int do_program_mount(struct autofs_point *ap,
|
|||
rv = 0; |
|||
ext_mount_add(&entry->ext_mount, entry->fs, 1); |
|||
} else { |
|||
- rv = mkdir_path(entry->fs, 0555);
|
|||
+ rv = mkdir_path(entry->fs, mp_mode);
|
|||
if (rv && errno != EEXIST) { |
|||
char buf[MAX_ERR_BUF]; |
|||
char *estr; |
@ -1,35 +0,0 @@ |
|||
autofs-5.1.4 - fix error return in do_nfs_mount() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Fix incorrect error return in modules/parse_amd.c:do_nfs_mount(). |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/parse_amd.c | 2 +- |
|||
2 files changed, 2 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 756ef927..d0cfa19b 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -6,6 +6,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- dont use array for path when not necessary. |
|||
- fix prefix option handling in expand_entry(). |
|||
- fix sublink option not set from defaults. |
|||
+- fix error return in do_nfs_mount().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index 1c962fff..2a5d9a30 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -1099,7 +1099,7 @@ static int do_nfs_mount(struct autofs_point *ap, const char *name,
|
|||
if (strlen(entry->rhost) + strlen(entry->rfs) + 1 > PATH_MAX) { |
|||
error(ap->logopt, MODPREFIX |
|||
"error: rhost + rfs options length is too long"); |
|||
- return 0;
|
|||
+ return 1;
|
|||
} |
|||
|
|||
strcpy(target, entry->rhost); |
@ -1,50 +0,0 @@ |
|||
autofs-5.1.4 - fix fd leak in rpc_do_create_client() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Commit 94f87e203a (fix create_client() RPC client handling) fixed |
|||
possible use of an invalid RPC client handle but the change neglected |
|||
to account for a check in rpc_do_create_client() that would open a new |
|||
file descriptor without checking if the passed in descriptor was |
|||
already opened. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/rpc_subs.c | 4 ++-- |
|||
2 files changed, 3 insertions(+), 2 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index dd48bf71..92e60df9 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -25,6 +25,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add units After line to include statd service. |
|||
- use systemd sd_notify() at startup. |
|||
- fix NFS version mask usage. |
|||
+- fix fd leak in rpc_do_create_client().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
|
|||
index cc83e84d..9451c455 100644
|
|||
--- a/lib/rpc_subs.c
|
|||
+++ b/lib/rpc_subs.c
|
|||
@@ -183,7 +183,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i
|
|||
in4_laddr.sin_addr.s_addr = htonl(INADDR_ANY); |
|||
slen = sizeof(struct sockaddr_in); |
|||
|
|||
- if (!info->client) {
|
|||
+ if (!info->client && *fd == RPC_ANYSOCK) {
|
|||
struct sockaddr *laddr; |
|||
|
|||
*fd = open_sock(addr->sa_family, type, proto); |
|||
@@ -296,7 +296,7 @@ static int rpc_do_create_client(struct sockaddr *addr, struct conn_info *info, i
|
|||
* it would bind to a reserved port, which has been shown to |
|||
* exhaust the reserved port range in some situations. |
|||
*/ |
|||
- if (!info->client) {
|
|||
+ if (!info->client && *fd == RPC_ANYSOCK) {
|
|||
*fd = open_sock(addr->sa_family, type, proto); |
|||
if (*fd < 0) { |
|||
ret = -errno; |
@ -1,41 +0,0 @@ |
|||
autofs-5.1.4 - fix flag file permission |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The flag file used to check if automount(8) is running was being |
|||
created with mode 0 which caused unnecessary dac_override AVC |
|||
failures. |
|||
|
|||
There's no reason to protect this file so just use 0644 as the |
|||
file permission. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 3 +++ |
|||
daemon/flag.c | 2 +- |
|||
2 files changed, 4 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 246279ae..d07d88ce 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -1,3 +1,6 @@
|
|||
+xx/xx/2018 autofs-5.1.5
|
|||
+- fix flag file permission.
|
|||
+
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
- fix unset tsd group name handling. |
|||
diff --git a/daemon/flag.c b/daemon/flag.c
|
|||
index 99f26847..ff9858c8 100644
|
|||
--- a/daemon/flag.c
|
|||
+++ b/daemon/flag.c
|
|||
@@ -164,7 +164,7 @@ int aquire_flag_file(void)
|
|||
while (!we_created_flagfile) { |
|||
int errsv, i, j; |
|||
|
|||
- i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0);
|
|||
+ i = open_fd_mode(linkf, O_WRONLY|O_CREAT, 0644);
|
|||
if (i < 0) { |
|||
release_flag_file(); |
|||
return 0; |
@ -1,44 +0,0 @@ |
|||
autofs-5.1.4 - fix incorrect locking in sss lookup |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Commit 766e0f6c4, autofs-5.0.7 - fix fix wildcard multi map regression, |
|||
introduced a deadlock during restart when the sss modules is used. |
|||
|
|||
Looking at the comment above the code which takes the lock it clearly |
|||
does this incorrectly. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/lookup_sss.c | 4 ++-- |
|||
2 files changed, 3 insertions(+), 2 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 3bf86e84..aa485e8f 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -37,6 +37,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- set bind mount as propagation slave. |
|||
- add master map pseudo options for mount propagation. |
|||
- fix use after free in parse_ldap_config(). |
|||
+- fix incorrect locking in sss lookup.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
|
|||
index 88ec1693..78598300 100644
|
|||
--- a/modules/lookup_sss.c
|
|||
+++ b/modules/lookup_sss.c
|
|||
@@ -786,9 +786,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
|||
* when we're starting up so just take the readlock in that |
|||
*/ |
|||
if (ap->flags & MOUNT_FLAG_REMOUNT) |
|||
- cache_writelock(mc);
|
|||
- else
|
|||
cache_readlock(mc); |
|||
+ else
|
|||
+ cache_writelock(mc);
|
|||
me = cache_lookup(mc, key); |
|||
/* Stale mapent => check for entry in alternate source or wildcard */ |
|||
if (me && !me->mapent) { |
@ -1,39 +0,0 @@ |
|||
autofs-5.1.4 - fix indent in automount(8) man page |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The .P paragraph directive resets paragraph indentation but |
|||
the following sentence belongs to the comand line option |
|||
above. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
man/automount.8 | 2 +- |
|||
2 files changed, 2 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 8e9bd665..1a9296f5 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -41,6 +41,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix amd parser opts option handling. |
|||
- fix possible NULL pointer dereference in get_defaults_entry(). |
|||
- better handle hesiod support not built in. |
|||
+- fix indent in automount(8) man page.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/man/automount.8 b/man/automount.8
|
|||
index 1e15ecd2..68d2aaa3 100644
|
|||
--- a/man/automount.8
|
|||
+++ b/man/automount.8
|
|||
@@ -106,7 +106,7 @@ will lead to everything (debug logging) being logged witch can then also
|
|||
be disabled, returning the daemon to verbose logging. This option can be |
|||
specified to change the logging priority of an already running automount |
|||
process. |
|||
-.P
|
|||
+
|
|||
The \fIpath\fP argument corresponds to the automounted |
|||
path name as specified in the master map. |
|||
.TP |
@ -1,94 +0,0 @@ |
|||
autofs-5.1.4 - fix libresolv configure check |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The libresolv functions are not found by AC_CHECK_LIB() unless |
|||
they are prefixed with "__". |
|||
|
|||
So change the library check to also look for __<function> during |
|||
the check. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
configure | 41 +++++++++++++++++++++++++++++++++++++++++ |
|||
configure.in | 2 +- |
|||
3 files changed, 43 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index a7bb89dc..dbfb8389 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -13,6 +13,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix monotonic_elapsed. |
|||
- Makefiles.rules: remove 'samples' from SUBDIRS. |
|||
- dont allow trailing slash in master map mount points. |
|||
+- fix libresolv configure check.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/configure b/configure
|
|||
index 2d517aac..5c8aae30 100755
|
|||
--- a/configure
|
|||
+++ b/configure
|
|||
@@ -4821,6 +4821,47 @@ fi
|
|||
$as_echo "$ac_cv_lib_resolv_res_query" >&6; } |
|||
if test "x$ac_cv_lib_resolv_res_query" = xyes; then : |
|||
LIBRESOLV="-lresolv" |
|||
+else
|
|||
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __res_query in -lresolv" >&5
|
|||
+$as_echo_n "checking for __res_query in -lresolv... " >&6; }
|
|||
+if ${ac_cv_lib_resolv___res_query+:} false; then :
|
|||
+ $as_echo_n "(cached) " >&6
|
|||
+else
|
|||
+ ac_check_lib_save_LIBS=$LIBS
|
|||
+LIBS="-lresolv $LIBS"
|
|||
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|||
+/* end confdefs.h. */
|
|||
+
|
|||
+/* Override any GCC internal prototype to avoid an error.
|
|||
+ Use char because int might match the return type of a GCC
|
|||
+ builtin and then its argument prototype would still apply. */
|
|||
+#ifdef __cplusplus
|
|||
+extern "C"
|
|||
+#endif
|
|||
+char __res_query ();
|
|||
+int
|
|||
+main ()
|
|||
+{
|
|||
+return __res_query ();
|
|||
+ ;
|
|||
+ return 0;
|
|||
+}
|
|||
+_ACEOF
|
|||
+if ac_fn_c_try_link "$LINENO"; then :
|
|||
+ ac_cv_lib_resolv___res_query=yes
|
|||
+else
|
|||
+ ac_cv_lib_resolv___res_query=no
|
|||
+fi
|
|||
+rm -f core conftest.err conftest.$ac_objext \
|
|||
+ conftest$ac_exeext conftest.$ac_ext
|
|||
+LIBS=$ac_check_lib_save_LIBS
|
|||
+fi
|
|||
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv___res_query" >&5
|
|||
+$as_echo "$ac_cv_lib_resolv___res_query" >&6; }
|
|||
+if test "x$ac_cv_lib_resolv___res_query" = xyes; then :
|
|||
+ LIBRESOLV="-lresolv"
|
|||
+fi
|
|||
+
|
|||
fi |
|||
|
|||
|
|||
diff --git a/configure.in b/configure.in
|
|||
index d74775cc..4d1208f5 100644
|
|||
--- a/configure.in
|
|||
+++ b/configure.in
|
|||
@@ -217,7 +217,7 @@ AC_SUBST(NSL_LIBS)
|
|||
NSL_CFLAGS="" |
|||
]) |
|||
|
|||
-AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv")
|
|||
+AC_CHECK_LIB(resolv, res_query, LIBRESOLV="-lresolv", AC_CHECK_LIB(resolv, __res_query, LIBRESOLV="-lresolv"))
|
|||
AC_SUBST(LIBRESOLV) |
|||
|
|||
# |
@ -1,49 +0,0 @@ |
|||
autofs-5.1.4 - fix monotonic_elapsed |
|||
|
|||
From: NeilBrown <neilb@suse.com> |
|||
|
|||
When automount probes multiple hosts to find the one which |
|||
responds most quickly, it currently ignores the nanoseconds. |
|||
This often makes the cost "0", which makes weights ineffective. |
|||
|
|||
The cause is that monotonic_elapsed() casts tv_nsec to a |
|||
double *after* dividing by 1 billion, rather than before. |
|||
|
|||
With this change, weights become effective for choosing |
|||
between hosts which respond in under one second. |
|||
|
|||
Signed-off-by: NeilBrown <neilb@suse.com> |
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/rpc_subs.c | 4 ++-- |
|||
2 files changed, 3 insertions(+), 2 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 104fca90..313730b1 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -10,6 +10,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add error handling for ext_mount_add(). |
|||
- account for recent libnsl changes. |
|||
- use_hostname_for_mounts shouldn't prevent selection among replicas. |
|||
+- fix monotonic_elapsed.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
|
|||
index 73097c9d..60ede9f8 100644
|
|||
--- a/lib/rpc_subs.c
|
|||
+++ b/lib/rpc_subs.c
|
|||
@@ -1093,9 +1093,9 @@ double monotonic_elapsed(struct timespec start, struct timespec end)
|
|||
double t1, t2; |
|||
|
|||
t1 = (double) start.tv_sec + |
|||
- (double) (start.tv_nsec/(1000*1000*1000));
|
|||
+ ((double) start.tv_nsec/(1000*1000*1000));
|
|||
t2 = (double) end.tv_sec + |
|||
- (double) (end.tv_nsec/(1000*1000*1000));
|
|||
+ ((double) end.tv_nsec/(1000*1000*1000));
|
|||
return t2 - t1; |
|||
} |
|||
|
@ -1,38 +0,0 @@ |
|||
autofs-5.1.4 - fix possible NULL pointer dereference in get_defaults_entry() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Function select_default_entry() can call make_default_entry() so a NULL |
|||
return is possible. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/parse_amd.c | 2 +- |
|||
2 files changed, 2 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 0365a161..5a317f12 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -39,6 +39,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix use after free in parse_ldap_config(). |
|||
- fix incorrect locking in sss lookup. |
|||
- fix amd parser opts option handling. |
|||
+- fix possible NULL pointer dereference in get_defaults_entry().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index 627c3c00..7399d19e 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -1998,7 +1998,7 @@ static struct amd_entry *get_defaults_entry(struct autofs_point *ap,
|
|||
goto out; |
|||
} |
|||
entry = select_default_entry(ap, &dflts, sv); |
|||
- if (!entry->map_type) {
|
|||
+ if (entry && !entry->map_type) {
|
|||
/* |
|||
* If map type isn't given try to inherit from |
|||
* parent. A NULL map type is valid and means |
@ -1,55 +0,0 @@ |
|||
autofs-5.1.4 - fix prefix option handling in expand_entry() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The changes to fix the defaults handling in the amd map parser caused |
|||
the prefix option to not be expanded and also to not be propagated to |
|||
submounts in some cases. |
|||
|
|||
But the prefix should be expanded in modules/parse_amd.c:expand_entry() |
|||
along with the reset of the amd map entry fields. |
|||
|
|||
Just adding this to modules/parse_amd.c:expand_entry() (where it should |
|||
be) fixes the amd map entry expansion and also fixes the propagation |
|||
of the prefix to submounts. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/parse_amd.c | 11 +++++++++++ |
|||
2 files changed, 12 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 13f01397..19aec2ae 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -4,6 +4,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix use after free in do_master_list_reset(). |
|||
- fix deadlock in dumpmaps. |
|||
- dont use array for path when not necessary. |
|||
+- fix prefix option handling in expand_entry().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index 2cce5417..1a5a2960 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -725,6 +725,17 @@ static struct substvar *expand_entry(struct autofs_point *ap,
|
|||
entry->rhost = host; |
|||
} |
|||
next: |
|||
+ if (entry->pref) {
|
|||
+ if (expand_selectors(ap, entry->pref, &expand, sv)) {
|
|||
+ debug(logopt, MODPREFIX
|
|||
+ "pref expand(\"%s\") -> %s",
|
|||
+ entry->pref, expand);
|
|||
+ free(entry->pref);
|
|||
+ entry->pref = expand;
|
|||
+ }
|
|||
+ sv = macro_addvar(sv, "pref", 4, entry->pref);
|
|||
+ }
|
|||
+
|
|||
if (entry->sublink) { |
|||
if (expand_selectors(ap, entry->sublink, &expand, sv)) { |
|||
debug(logopt, MODPREFIX |
@ -1,44 +0,0 @@ |
|||
autofs-5.1.4 - fix program usage message |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
There is a discrepancy between the list of options in the usage |
|||
message of automount(8) and the options listed in the man page. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/automount.c | 6 +++++- |
|||
2 files changed, 6 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 70e043ee..f126de66 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -32,6 +32,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- enable SIGUSR2 handling in rpm spec file. |
|||
- fix age setting at startup. |
|||
- fix update_negative_cache() map source usage. |
|||
+- fix program usage message.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/automount.c b/daemon/automount.c
|
|||
index 99534295..05ec8a62 100644
|
|||
--- a/daemon/automount.c
|
|||
+++ b/daemon/automount.c
|
|||
@@ -1893,9 +1893,13 @@ static void usage(void)
|
|||
" -h --help this text\n" |
|||
" -p --pid-file f write process id to file f\n" |
|||
" -t --timeout n auto-unmount in n seconds (0-disable)\n" |
|||
+ " -M --master-wait n\n"
|
|||
+ " maximum wait time (seconds) for master\n"
|
|||
+ " map to become available\n"
|
|||
" -v --verbose be verbose\n" |
|||
" -d --debug log debuging info\n" |
|||
- " -D --define define global macro variable\n"
|
|||
+ " -Dvariable=value, --define variable=value\n"
|
|||
+ " define global macro variable\n"
|
|||
" -f --foreground do not fork into background\n" |
|||
" -r --random-multimount-selection\n" |
|||
" use ramdom replicated server selection\n" |
@ -1,40 +0,0 @@ |
|||
autofs-5.1.4 - fix rpm spec install permissions on auto.net and auto.smb |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Commit 0da3f5695d removes execute permissions from the install of |
|||
auto.net and auto.smb. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
autofs.spec | 4 ++-- |
|||
2 files changed, 3 insertions(+), 2 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 596590a8..a5b79dd6 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -20,6 +20,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add conditional inclusion of fedfs binaries. |
|||
- add an example fedfs master map entry to the installed master map. |
|||
- improve hostname lookup error logging. |
|||
+- fix rpm spec install premissions on auto.net and auto.smb.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/autofs.spec b/autofs.spec
|
|||
index 2cb09ef0..ac3b0a3f 100644
|
|||
--- a/autofs.spec
|
|||
+++ b/autofs.spec
|
|||
@@ -131,8 +131,8 @@ install -m 644 redhat/autofs.sysconfig $RPM_BUILD_ROOT/etc/sysconfig/autofs
|
|||
|
|||
install -m 644 samples/auto.master $RPM_BUILD_ROOT/etc/auto.master |
|||
install -m 644 samples/auto.misc $RPM_BUILD_ROOT/etc/auto.misc |
|||
-install -m 644 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net
|
|||
-install -m 644 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb
|
|||
+install -m 755 samples/auto.net $RPM_BUILD_ROOT/etc/auto.net
|
|||
+install -m 755 samples/auto.smb $RPM_BUILD_ROOT/etc/auto.smb
|
|||
install -m 600 samples/autofs_ldap_auth.conf $RPM_BUILD_ROOT/etc/autofs_ldap_auth.conf |
|||
|
|||
%clean |
@ -1,48 +0,0 @@ |
|||
autofs-5.1.4 - fix sublink option not set from defaults |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
If the amd entry sublink option is given in a defaults entry |
|||
it isn't merged into the current entry during parsing. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/parse_amd.c | 12 ++++++++++++ |
|||
2 files changed, 13 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 19aec2ae..756ef927 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -5,6 +5,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix deadlock in dumpmaps. |
|||
- dont use array for path when not necessary. |
|||
- fix prefix option handling in expand_entry(). |
|||
+- fix sublink option not set from defaults.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index 1a5a2960..1c962fff 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -645,6 +645,18 @@ static void update_with_defaults(struct amd_entry *defaults,
|
|||
} |
|||
} |
|||
|
|||
+ if (!entry->sublink) {
|
|||
+ if (defaults->sublink) {
|
|||
+ tmp = strdup(defaults->sublink);
|
|||
+ if (tmp)
|
|||
+ entry->sublink = tmp;
|
|||
+ } else {
|
|||
+ v = macro_findvar(sv, "sublink", 2);
|
|||
+ if (v)
|
|||
+ entry->sublink = strdup(v->val);
|
|||
+ }
|
|||
+ }
|
|||
+
|
|||
return; |
|||
} |
|||
|
@ -1,102 +0,0 @@ |
|||
autofs-5.1.4 - fix update_negative_cache() map source usage |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
File map sources can be either plain text or executable. |
|||
|
|||
When the map path is specified without a type (eg. when a |
|||
full path is used) an instance map source is used and the |
|||
original map is left unchanged. |
|||
|
|||
But update_negative_cache() fails to take this into account |
|||
causing it to update the wrong map cache. |
|||
|
|||
When a map reload is done the map entry appears to not exist |
|||
so the new map entry is added. |
|||
|
|||
This could go unnoticed except that, after a map read, the |
|||
map entry cache cleans stale map entries and the existence |
|||
of this negative entry causes the new map entry to be deleted |
|||
and map lookups continue to fail. |
|||
|
|||
In hindsite the use of an instance map source for this is |
|||
probably uneccessary but changing it will be risky so, for |
|||
now, just make update_negative_cache() use the correct map. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/lookup.c | 38 ++++++++++++++++++++++++++++++++++++-- |
|||
2 files changed, 37 insertions(+), 2 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index c39aa0e5..70e043ee 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -31,6 +31,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- use defines for expire type. |
|||
- enable SIGUSR2 handling in rpm spec file. |
|||
- fix age setting at startup. |
|||
+- fix update_negative_cache() map source usage.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/lookup.c b/daemon/lookup.c
|
|||
index 6a722b3b..418f01cb 100644
|
|||
--- a/daemon/lookup.c
|
|||
+++ b/daemon/lookup.c
|
|||
@@ -1100,6 +1100,37 @@ static enum nsswitch_status lookup_map_name(struct nss_source *this,
|
|||
return result; |
|||
} |
|||
|
|||
+static struct map_source *lookup_get_map_source(struct master_mapent *entry)
|
|||
+{
|
|||
+ struct map_source *map = entry->maps;
|
|||
+ struct stat st;
|
|||
+ char *type;
|
|||
+
|
|||
+ if (map->type || *map->argv[0] != '/')
|
|||
+ return map;
|
|||
+
|
|||
+ if (*(map->argv[0] + 1) == '/')
|
|||
+ return map;
|
|||
+
|
|||
+ if (stat(map->argv[0], &st) == -1)
|
|||
+ return NULL;
|
|||
+
|
|||
+ if (!S_ISREG(st.st_mode))
|
|||
+ return NULL;
|
|||
+
|
|||
+ if (st.st_mode & __S_IEXEC)
|
|||
+ type = "program";
|
|||
+ else
|
|||
+ type = "file";
|
|||
+
|
|||
+ /* This is a file source with a path starting with "/".
|
|||
+ * But file maps can be either plain text or executable
|
|||
+ * so they use a map instance and the actual map source
|
|||
+ * remains untouched.
|
|||
+ */
|
|||
+ return master_find_source_instance(map, type, map->format, 0, NULL);
|
|||
+}
|
|||
+
|
|||
static void update_negative_cache(struct autofs_point *ap, struct map_source *source, const char *name) |
|||
{ |
|||
struct master_mapent *entry = ap->entry; |
|||
@@ -1133,11 +1164,14 @@ static void update_negative_cache(struct autofs_point *ap, struct map_source *so
|
|||
logmsg("key \"%s\" not found in map source(s).", name); |
|||
} |
|||
|
|||
- /* Doesn't exist in any source, just add it somewhere */
|
|||
+ /* Doesn't exist in any source, just add it somewhere.
|
|||
+ * Also take care to use the same map source used by
|
|||
+ * map reads and key lookups for the update.
|
|||
+ */
|
|||
if (source) |
|||
map = source; |
|||
else |
|||
- map = entry->maps;
|
|||
+ map = lookup_get_map_source(entry);
|
|||
if (map) { |
|||
time_t now = monotonic_time(NULL); |
|||
int rv = CHE_FAIL; |
@ -1,55 +0,0 @@ |
|||
autofs-5.1.4 - fix use after free in do_master_list_reset() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Umm ... list_for_each() can't be used in do_master_list_reset() because |
|||
the subject entry of the loop is removed for the list within the loop |
|||
body. Therefore it can't be used to calculate the next pointer within a |
|||
for (...) loop. |
|||
|
|||
There is no list_for_each_safe() macro in the list.h of autofs so it |
|||
needs to be done manually. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/automount.c | 8 ++++++-- |
|||
2 files changed, 7 insertions(+), 2 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 4faab510..2747327b 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -1,6 +1,7 @@
|
|||
xx/xx/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
- fix directory create permission. |
|||
+- fix use after free in do_master_list_reset().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/automount.c b/daemon/automount.c
|
|||
index dcdc19fb..28b3f2f5 100644
|
|||
--- a/daemon/automount.c
|
|||
+++ b/daemon/automount.c
|
|||
@@ -2070,14 +2070,18 @@ static void remove_empty_args(char **argv, int *argc)
|
|||
|
|||
static void do_master_list_reset(struct master *master) |
|||
{ |
|||
- struct list_head *head, *p;
|
|||
+ struct list_head *head, *p, *n;
|
|||
|
|||
master_mutex_lock(); |
|||
|
|||
head = &master->mounts; |
|||
- list_for_each(p, head) {
|
|||
+ n = head->next;
|
|||
+ while (n != head) {
|
|||
struct master_mapent *entry; |
|||
|
|||
+ p = n;
|
|||
+ n = p->next;
|
|||
+
|
|||
entry = list_entry(p, struct master_mapent, list); |
|||
|
|||
if (!list_empty(&entry->list)) |
@ -1,38 +0,0 @@ |
|||
autofs-5.1.4 - fix use after free in parse_ldap_config() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Commit a4a2af5f30 (covarity fixes) incorrecly frees local variable |
|||
authtype after assigning it to a lookup context structure member. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/lookup_ldap.c | 2 -- |
|||
2 files changed, 1 insertion(+), 2 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 4765a66e..3bf86e84 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -36,6 +36,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- mark removed cache entry negative. |
|||
- set bind mount as propagation slave. |
|||
- add master map pseudo options for mount propagation. |
|||
+- fix use after free in parse_ldap_config().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
|
|||
index 06c96973..911a34a5 100644
|
|||
--- a/modules/lookup_ldap.c
|
|||
+++ b/modules/lookup_ldap.c
|
|||
@@ -1383,8 +1383,6 @@ auth_fail:
|
|||
user, secret ? "specified" : "unspecified", |
|||
client_princ, client_cc); |
|||
} |
|||
- if (authtype)
|
|||
- free(authtype);
|
|||
out: |
|||
xmlFreeDoc(doc); |
|||
if (auth_conf) |
@ -1,123 +0,0 @@ |
|||
autofs-5.1.4 - improve hostname lookup error logging |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
There's not enough information in name lookup log messages |
|||
to determine if the failed lookup is in fact a problem or |
|||
is expected. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/parse_subs.c | 3 ++- |
|||
lib/rpc_subs.c | 3 ++- |
|||
modules/dclist.c | 4 +++- |
|||
modules/parse_amd.c | 9 ++++++--- |
|||
modules/replicated.c | 5 +++-- |
|||
6 files changed, 17 insertions(+), 8 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index f771a433..596590a8 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -19,6 +19,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add fedfs-map-nfs4.c. |
|||
- add conditional inclusion of fedfs binaries. |
|||
- add an example fedfs master map entry to the installed master map. |
|||
+- improve hostname lookup error logging.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/lib/parse_subs.c b/lib/parse_subs.c
|
|||
index db784a58..841e81fd 100644
|
|||
--- a/lib/parse_subs.c
|
|||
+++ b/lib/parse_subs.c
|
|||
@@ -476,7 +476,8 @@ unsigned int get_network_proximity(const char *name)
|
|||
|
|||
ret = getaddrinfo(name_or_num, NULL, &hints, &ni); |
|||
if (ret) { |
|||
- logerr("getaddrinfo: %s", gai_strerror(ret));
|
|||
+ logerr("hostname lookup for %s failed: %s",
|
|||
+ name_or_num, gai_strerror(ret));
|
|||
return PROXIMITY_ERROR; |
|||
} |
|||
|
|||
diff --git a/lib/rpc_subs.c b/lib/rpc_subs.c
|
|||
index 60ede9f8..cc83e84d 100644
|
|||
--- a/lib/rpc_subs.c
|
|||
+++ b/lib/rpc_subs.c
|
|||
@@ -693,7 +693,8 @@ static int create_client(struct conn_info *info, CLIENT **client)
|
|||
ret = getaddrinfo(info->host, NULL, &hints, &ai); |
|||
if (ret) { |
|||
error(LOGOPT_ANY, |
|||
- "hostname lookup failed: %s", gai_strerror(ret));
|
|||
+ "hostname lookup for %s failed: %s",
|
|||
+ info->host, gai_strerror(ret));
|
|||
goto out_close; |
|||
} |
|||
|
|||
diff --git a/modules/dclist.c b/modules/dclist.c
|
|||
index 4daa199b..ba32134d 100644
|
|||
--- a/modules/dclist.c
|
|||
+++ b/modules/dclist.c
|
|||
@@ -357,7 +357,9 @@ static char *getdnsdomainname(unsigned int logopt)
|
|||
|
|||
ret = getaddrinfo(name, NULL, &hints, &ni); |
|||
if (ret) { |
|||
- error(logopt, "hostname lookup failed: %s", gai_strerror(ret));
|
|||
+ error(logopt,
|
|||
+ "hostname lookup for %s failed: %s",
|
|||
+ name, gai_strerror(ret));
|
|||
return NULL; |
|||
} |
|||
|
|||
diff --git a/modules/parse_amd.c b/modules/parse_amd.c
|
|||
index e7debc56..9543ced3 100644
|
|||
--- a/modules/parse_amd.c
|
|||
+++ b/modules/parse_amd.c
|
|||
@@ -260,7 +260,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar
|
|||
ret = getaddrinfo(v->val, NULL, &hints, &cni); |
|||
if (ret) { |
|||
error(logopt, MODPREFIX |
|||
- "hostname lookup failed: %s\n", gai_strerror(ret));
|
|||
+ "hostname lookup for %s failed: %s\n",
|
|||
+ v->val, gai_strerror(ret));
|
|||
goto out; |
|||
} |
|||
|
|||
@@ -270,7 +271,8 @@ static int match_my_name(unsigned int logopt, const char *name, struct substvar
|
|||
ret = getaddrinfo(name, NULL, &hints, &ni); |
|||
if (ret) { |
|||
error(logopt, MODPREFIX |
|||
- "hostname lookup failed: %s\n", gai_strerror(ret));
|
|||
+ "hostname lookup for %s failed: %s\n",
|
|||
+ name, gai_strerror(ret));
|
|||
freeaddrinfo(cni); |
|||
goto out; |
|||
} |
|||
@@ -678,7 +680,8 @@ static char *normalize_hostname(unsigned int logopt, const char *host,
|
|||
ret = getaddrinfo(host, NULL, &hints, &ni); |
|||
if (ret) { |
|||
error(logopt, MODPREFIX |
|||
- "hostname lookup failed: %s", gai_strerror(ret));
|
|||
+ "hostname lookup for %s failed: %s",
|
|||
+ host, gai_strerror(ret));
|
|||
return NULL; |
|||
} |
|||
name = strdup(ni->ai_canonname); |
|||
diff --git a/modules/replicated.c b/modules/replicated.c
|
|||
index f7b83236..740270ec 100644
|
|||
--- a/modules/replicated.c
|
|||
+++ b/modules/replicated.c
|
|||
@@ -1007,8 +1007,9 @@ try_name:
|
|||
|
|||
ret = getaddrinfo(name, NULL, &hints, &ni); |
|||
if (ret) { |
|||
- error(LOGOPT_ANY, "hostname lookup failed: %s",
|
|||
- gai_strerror(ret));
|
|||
+ error(LOGOPT_ANY,
|
|||
+ "hostname lookup for %s failed: %s",
|
|||
+ name, gai_strerror(ret));
|
|||
free(name); |
|||
return 0; |
|||
} |
@ -1,43 +0,0 @@ |
|||
autofs-5.1.4 - make umount_ent() recognise forced umount |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
When doing a forced shutdown umount_ent() tries a normal expire |
|||
first resulting in a fair amount of unnecessary log noise. |
|||
|
|||
Change umount_ent() to do a forced expire when a forced shutdown |
|||
has been requested to avoid the log noise. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
lib/mounts.c | 16 +++++++++------- |
|||
1 file changed, 9 insertions(+), 7 deletions(-) |
|||
|
|||
diff --git a/lib/mounts.c b/lib/mounts.c
|
|||
index a35503bf..e4092d2f 100644
|
|||
--- a/lib/mounts.c
|
|||
+++ b/lib/mounts.c
|
|||
@@ -2029,14 +2029,16 @@ int umount_ent(struct autofs_point *ap, const char *path)
|
|||
{ |
|||
int rv; |
|||
|
|||
- rv = spawn_umount(ap->logopt, path, NULL);
|
|||
- /* We are doing a forced shutcwdown down so unlink busy mounts */
|
|||
- if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) {
|
|||
- if (ap->state == ST_SHUTDOWN_FORCE) {
|
|||
- info(ap->logopt, "forcing umount of %s", path);
|
|||
- rv = spawn_umount(ap->logopt, "-l", path, NULL);
|
|||
- }
|
|||
+ if (ap->state != ST_SHUTDOWN_FORCE)
|
|||
+ rv = spawn_umount(ap->logopt, path, NULL);
|
|||
+ else {
|
|||
+ /* We are doing a forced shutdown so unlink busy
|
|||
+ * mounts */
|
|||
+ info(ap->logopt, "forcing umount of %s", path);
|
|||
+ rv = spawn_umount(ap->logopt, "-l", path, NULL);
|
|||
+ }
|
|||
|
|||
+ if (rv && (ap->state == ST_SHUTDOWN_FORCE || ap->state == ST_SHUTDOWN)) {
|
|||
/* |
|||
* Verify that we actually unmounted the thing. This is a |
|||
* belt and suspenders approach to not eating user data. |
@ -1,68 +0,0 @@ |
|||
autofs-5.1.4 - mark removed cache entry negative |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
When re-reading a map, entries that have been removed are detected |
|||
and deleted from the map entry cache by lookup_prune_cache(). |
|||
|
|||
If a removed map entry is mounted at the time lookup_prune_cache() |
|||
is called the map entry is skipped. This is done becuase the next |
|||
lookup (following the mount expire, which needs the cache entry to |
|||
remain) will detect the stale cache entry and a map update done |
|||
resulting in the stale entry being removed. |
|||
|
|||
But if a map re-read is performed while the cache entry is mounted |
|||
the cache will appear to up to date so the removed entry will remain |
|||
valid even after it has expired. |
|||
|
|||
To cover this case it's sufficient to mark the mounted cache entry |
|||
negative during the cache prune which prevents further lookups from |
|||
using the stale entry. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/lookup.c | 12 +++++++++--- |
|||
2 files changed, 10 insertions(+), 3 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index f126de66..42950d51 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -33,6 +33,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix age setting at startup. |
|||
- fix update_negative_cache() map source usage. |
|||
- fix program usage message. |
|||
+- mark removed cache entry negative.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/lookup.c b/daemon/lookup.c
|
|||
index 418f01cb..18df9352 100644
|
|||
--- a/daemon/lookup.c
|
|||
+++ b/daemon/lookup.c
|
|||
@@ -1417,15 +1417,21 @@ void lookup_prune_one_cache(struct autofs_point *ap, struct mapent_cache *mc, ti
|
|||
if (valid && valid->mc == mc) { |
|||
/* |
|||
* We've found a map entry that has been removed from |
|||
- * the current cache so it isn't really valid.
|
|||
+ * the current cache so it isn't really valid. Set the
|
|||
+ * mapent negative to prevent further mount requests
|
|||
+ * using the cache entry.
|
|||
*/ |
|||
+ debug(ap->logopt, "removed map entry detected, mark negative");
|
|||
+ if (valid->mapent) {
|
|||
+ free(valid->mapent);
|
|||
+ valid->mapent = NULL;
|
|||
+ }
|
|||
cache_unlock(valid->mc); |
|||
valid = NULL; |
|||
} |
|||
if (!valid && |
|||
is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) { |
|||
- debug(ap->logopt,
|
|||
- "prune check posponed, %s mounted", path);
|
|||
+ debug(ap->logopt, "prune posponed, %s mounted", path);
|
|||
free(key); |
|||
free(path); |
|||
continue; |
@ -1,125 +0,0 @@ |
|||
autofs-5.1.4 - move close stdio descriptors to become_daemon() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Move the stdio file descriptor close to the become_daemon() function |
|||
as closing these file descriptors, ie. detaching from ttys, is part |
|||
of the preperation for becoming a system daemon. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/automount.c | 27 ++++++++++++++++++++++++++- |
|||
include/log.h | 1 - |
|||
lib/log.c | 29 ----------------------------- |
|||
4 files changed, 27 insertions(+), 31 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 4c5f276e..4e1d9c98 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -46,6 +46,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add NULL check in prepare_attempt_prefix(). |
|||
- update build info with systemd. |
|||
- use flags for startup boolean options. |
|||
+- move close stdio descriptors to become_daemon().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/automount.c b/daemon/automount.c
|
|||
index d891562a..c1360ed6 100644
|
|||
--- a/daemon/automount.c
|
|||
+++ b/daemon/automount.c
|
|||
@@ -1218,6 +1218,8 @@ static void become_daemon(unsigned int flags)
|
|||
} |
|||
log_to_stderr(); |
|||
} else { |
|||
+ int nullfd;
|
|||
+
|
|||
if (open_pipe(start_pipefd) < 0) { |
|||
fprintf(stderr, "%s: failed to create start_pipefd.\n", |
|||
program); |
|||
@@ -1261,7 +1263,30 @@ static void become_daemon(unsigned int flags)
|
|||
close(start_pipefd[1]); |
|||
exit(*pst_stat); |
|||
} |
|||
- log_to_syslog();
|
|||
+
|
|||
+ /* Redirect all our file descriptors to /dev/null */
|
|||
+ nullfd = open("/dev/null", O_RDWR);
|
|||
+ if (nullfd < 0) {
|
|||
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|||
+ fprintf(stderr, "cannot open /dev/null: %s", estr);
|
|||
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
|
|||
+ close(start_pipefd[1]);
|
|||
+ exit(*pst_stat);
|
|||
+ }
|
|||
+
|
|||
+ if (dup2(nullfd, STDIN_FILENO) < 0 ||
|
|||
+ dup2(nullfd, STDOUT_FILENO) < 0 ||
|
|||
+ dup2(nullfd, STDERR_FILENO) < 0) {
|
|||
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|||
+ fprintf(stderr,
|
|||
+ "redirecting file descriptors failed: %s", estr);
|
|||
+ res = write(start_pipefd[1], pst_stat, sizeof(*pst_stat));
|
|||
+ close(start_pipefd[1]);
|
|||
+ exit(*pst_stat);
|
|||
+ }
|
|||
+
|
|||
+ open_log();
|
|||
+ close(nullfd);
|
|||
} |
|||
|
|||
/* Write pid file if requested */ |
|||
diff --git a/include/log.h b/include/log.h
|
|||
index 7a394cbe..c9b17b3c 100644
|
|||
--- a/include/log.h
|
|||
+++ b/include/log.h
|
|||
@@ -36,7 +36,6 @@ extern void set_log_debug_ap(struct autofs_point *ap);
|
|||
extern void set_mnt_logging(unsigned global_logopt); |
|||
|
|||
extern void open_log(void); |
|||
-extern void log_to_syslog(void);
|
|||
extern void log_to_stderr(void); |
|||
|
|||
extern void log_info(unsigned int, const char* msg, ...); |
|||
diff --git a/lib/log.c b/lib/log.c
|
|||
index 41f95fe8..ca771d72 100644
|
|||
--- a/lib/log.c
|
|||
+++ b/lib/log.c
|
|||
@@ -314,35 +314,6 @@ void open_log(void)
|
|||
return; |
|||
} |
|||
|
|||
-void log_to_syslog(void)
|
|||
-{
|
|||
- char buf[MAX_ERR_BUF];
|
|||
- int nullfd;
|
|||
-
|
|||
- open_log();
|
|||
-
|
|||
- /* Redirect all our file descriptors to /dev/null */
|
|||
- nullfd = open("/dev/null", O_RDWR);
|
|||
- if (nullfd < 0) {
|
|||
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|||
- fprintf(stderr, "cannot open /dev/null: %s", estr);
|
|||
- exit(1);
|
|||
- }
|
|||
-
|
|||
- if (dup2(nullfd, STDIN_FILENO) < 0 ||
|
|||
- dup2(nullfd, STDOUT_FILENO) < 0 ||
|
|||
- dup2(nullfd, STDERR_FILENO) < 0) {
|
|||
- char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|||
- fprintf(stderr,
|
|||
- "redirecting file descriptors failed: %s", estr);
|
|||
- exit(1);
|
|||
- }
|
|||
-
|
|||
- close(nullfd);
|
|||
-
|
|||
- return;
|
|||
-}
|
|||
-
|
|||
void log_to_stderr(void) |
|||
{ |
|||
if (syslog_open) { |
@ -1,359 +0,0 @@ |
|||
autofs-5.1.4 - refactor negative map entry check |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Create a function to check for a negative map entry on lookup and use |
|||
it in each of the relevant modules. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
include/automount.h | 1 + |
|||
lib/cache.c | 30 ++++++++++++++++++++++++++++++ |
|||
modules/lookup_file.c | 22 ++-------------------- |
|||
modules/lookup_hesiod.c | 22 ++-------------------- |
|||
modules/lookup_hosts.c | 22 ++-------------------- |
|||
modules/lookup_ldap.c | 22 ++-------------------- |
|||
modules/lookup_nisplus.c | 22 ++-------------------- |
|||
modules/lookup_program.c | 22 ++-------------------- |
|||
modules/lookup_sss.c | 22 ++-------------------- |
|||
modules/lookup_yp.c | 22 ++-------------------- |
|||
11 files changed, 48 insertions(+), 160 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 21fc9ca7..0de3f31b 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -48,6 +48,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- use flags for startup boolean options. |
|||
- move close stdio descriptors to become_daemon(). |
|||
- add systemd service command line option. |
|||
+- refactor negative map entry check.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/include/automount.h b/include/automount.h
|
|||
index 45fde53e..947daa10 100644
|
|||
--- a/include/automount.h
|
|||
+++ b/include/automount.h
|
|||
@@ -223,6 +223,7 @@ struct mapent *cache_partial_match(struct mapent_cache *mc, const char *prefix);
|
|||
struct mapent *cache_partial_match_wild(struct mapent_cache *mc, const char *prefix); |
|||
int cache_add(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age); |
|||
int cache_update_offset(struct mapent_cache *mc, const char *mkey, const char *key, const char *mapent, time_t age); |
|||
+int cache_lookup_negative(struct mapent *me, const char *key);
|
|||
void cache_update_negative(struct mapent_cache *mc, struct map_source *ms, const char *key, time_t timeout); |
|||
int cache_set_parents(struct mapent *mm); |
|||
int cache_update(struct mapent_cache *mc, struct map_source *ms, const char *key, const char *mapent, time_t age); |
|||
diff --git a/lib/cache.c b/lib/cache.c
|
|||
index 44e323dd..d3b6642b 100644
|
|||
--- a/lib/cache.c
|
|||
+++ b/lib/cache.c
|
|||
@@ -771,6 +771,36 @@ done:
|
|||
return ret; |
|||
} |
|||
|
|||
+/* Called with cache_lock held for map entry me and is released
|
|||
+ * on return.
|
|||
+ */
|
|||
+int cache_lookup_negative(struct mapent *me, const char *key)
|
|||
+{
|
|||
+ if (me->status >= monotonic_time(NULL)) {
|
|||
+ cache_unlock(me->mc);
|
|||
+ return CHE_UNAVAIL;
|
|||
+ } else {
|
|||
+ struct mapent_cache *smc = me->mc;
|
|||
+ struct mapent *sme;
|
|||
+
|
|||
+ if (me->mapent)
|
|||
+ cache_unlock(smc);
|
|||
+ else {
|
|||
+ cache_unlock(smc);
|
|||
+ cache_writelock(smc);
|
|||
+ sme = cache_lookup_distinct(smc, key);
|
|||
+ /* Negative timeout expired for non-existent entry. */
|
|||
+ if (sme && !sme->mapent) {
|
|||
+ if (cache_pop_mapent(sme) == CHE_FAIL)
|
|||
+ cache_delete(smc, key);
|
|||
+ }
|
|||
+ cache_unlock(smc);
|
|||
+ }
|
|||
+ }
|
|||
+
|
|||
+ return CHE_OK;
|
|||
+}
|
|||
+
|
|||
void cache_update_negative(struct mapent_cache *mc, |
|||
struct map_source *ms, const char *key, |
|||
time_t timeout) |
|||
diff --git a/modules/lookup_file.c b/modules/lookup_file.c
|
|||
index ed5caa47..6986830b 100644
|
|||
--- a/modules/lookup_file.c
|
|||
+++ b/modules/lookup_file.c
|
|||
@@ -1177,27 +1177,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
|||
/* Check if we recorded a mount fail for this key anywhere */ |
|||
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
|||
if (me) { |
|||
- if (me->status >= monotonic_time(NULL)) {
|
|||
- cache_unlock(me->mc);
|
|||
+ /* negative timeout has not passed, return fail */
|
|||
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
|||
return NSS_STATUS_NOTFOUND; |
|||
- } else {
|
|||
- struct mapent_cache *smc = me->mc;
|
|||
- struct mapent *sme;
|
|||
-
|
|||
- if (me->mapent)
|
|||
- cache_unlock(smc);
|
|||
- else {
|
|||
- cache_unlock(smc);
|
|||
- cache_writelock(smc);
|
|||
- sme = cache_lookup_distinct(smc, key);
|
|||
- /* Negative timeout expired for non-existent entry. */
|
|||
- if (sme && !sme->mapent) {
|
|||
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
|||
- cache_delete(smc, key);
|
|||
- }
|
|||
- cache_unlock(smc);
|
|||
- }
|
|||
- }
|
|||
} |
|||
|
|||
/* |
|||
diff --git a/modules/lookup_hesiod.c b/modules/lookup_hesiod.c
|
|||
index b3278d20..54cf278c 100644
|
|||
--- a/modules/lookup_hesiod.c
|
|||
+++ b/modules/lookup_hesiod.c
|
|||
@@ -397,27 +397,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
|||
/* Check if we recorded a mount fail for this key anywhere */ |
|||
me = lookup_source_mapent(ap, name, LKP_DISTINCT); |
|||
if (me) { |
|||
- if (me->status >= monotonic_time(NULL)) {
|
|||
- cache_unlock(me->mc);
|
|||
+ /* negative timeout has not passed, return fail */
|
|||
+ if (cache_lookup_negative(me, name) == CHE_UNAVAIL)
|
|||
return NSS_STATUS_NOTFOUND; |
|||
- } else {
|
|||
- struct mapent_cache *smc = me->mc;
|
|||
- struct mapent *sme;
|
|||
-
|
|||
- if (me->mapent)
|
|||
- cache_unlock(smc);
|
|||
- else {
|
|||
- cache_unlock(smc);
|
|||
- cache_writelock(smc);
|
|||
- sme = cache_lookup_distinct(smc, name);
|
|||
- /* Negative timeout expired for non-existent entry. */
|
|||
- if (sme && !sme->mapent) {
|
|||
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
|||
- cache_delete(smc, name);
|
|||
- }
|
|||
- cache_unlock(smc);
|
|||
- }
|
|||
- }
|
|||
} |
|||
|
|||
/* If this is not here the filesystem stays busy, for some reason... */ |
|||
diff --git a/modules/lookup_hosts.c b/modules/lookup_hosts.c
|
|||
index 163b02d5..744062e2 100644
|
|||
--- a/modules/lookup_hosts.c
|
|||
+++ b/modules/lookup_hosts.c
|
|||
@@ -314,27 +314,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
|||
/* Check if we recorded a mount fail for this key anywhere */ |
|||
me = lookup_source_mapent(ap, name, LKP_DISTINCT); |
|||
if (me) { |
|||
- if (me->status >= monotonic_time(NULL)) {
|
|||
- cache_unlock(me->mc);
|
|||
+ /* negative timeout has not passed, return fail */
|
|||
+ if (cache_lookup_negative(me, name) == CHE_UNAVAIL)
|
|||
return NSS_STATUS_NOTFOUND; |
|||
- } else {
|
|||
- struct mapent_cache *smc = me->mc;
|
|||
- struct mapent *sme;
|
|||
-
|
|||
- if (me->mapent)
|
|||
- cache_unlock(smc);
|
|||
- else {
|
|||
- cache_unlock(smc);
|
|||
- cache_writelock(smc);
|
|||
- sme = cache_lookup_distinct(smc, name);
|
|||
- /* Negative timeout expired for non-existent entry. */
|
|||
- if (sme && !sme->mapent) {
|
|||
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
|||
- cache_delete(smc, name);
|
|||
- }
|
|||
- cache_unlock(smc);
|
|||
- }
|
|||
- }
|
|||
} |
|||
|
|||
cache_readlock(mc); |
|||
diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
|
|||
index 911a34a5..f7432a2a 100644
|
|||
--- a/modules/lookup_ldap.c
|
|||
+++ b/modules/lookup_ldap.c
|
|||
@@ -3687,27 +3687,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
|||
/* Check if we recorded a mount fail for this key anywhere */ |
|||
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
|||
if (me) { |
|||
- if (me->status >= monotonic_time(NULL)) {
|
|||
- cache_unlock(me->mc);
|
|||
+ /* negative timeout has not passed, return fail */
|
|||
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
|||
return NSS_STATUS_NOTFOUND; |
|||
- } else {
|
|||
- struct mapent_cache *smc = me->mc;
|
|||
- struct mapent *sme;
|
|||
-
|
|||
- if (me->mapent)
|
|||
- cache_unlock(smc);
|
|||
- else {
|
|||
- cache_unlock(smc);
|
|||
- cache_writelock(smc);
|
|||
- sme = cache_lookup_distinct(smc, key);
|
|||
- /* Negative timeout expired for non-existent entry. */
|
|||
- if (sme && !sme->mapent) {
|
|||
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
|||
- cache_delete(smc, key);
|
|||
- }
|
|||
- cache_unlock(smc);
|
|||
- }
|
|||
- }
|
|||
} |
|||
|
|||
/* |
|||
diff --git a/modules/lookup_nisplus.c b/modules/lookup_nisplus.c
|
|||
index 8dee4630..cbd03cdb 100644
|
|||
--- a/modules/lookup_nisplus.c
|
|||
+++ b/modules/lookup_nisplus.c
|
|||
@@ -709,27 +709,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
|||
/* Check if we recorded a mount fail for this key anywhere */ |
|||
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
|||
if (me) { |
|||
- if (me->status >= monotonic_time(NULL)) {
|
|||
- cache_unlock(me->mc);
|
|||
+ /* negative timeout has not passed, return fail */
|
|||
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
|||
return NSS_STATUS_NOTFOUND; |
|||
- } else {
|
|||
- struct mapent_cache *smc = me->mc;
|
|||
- struct mapent *sme;
|
|||
-
|
|||
- if (me->mapent)
|
|||
- cache_unlock(smc);
|
|||
- else {
|
|||
- cache_unlock(smc);
|
|||
- cache_writelock(smc);
|
|||
- sme = cache_lookup_distinct(smc, key);
|
|||
- /* Negative timeout expired for non-existent entry. */
|
|||
- if (sme && !sme->mapent) {
|
|||
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
|||
- cache_delete(smc, key);
|
|||
- }
|
|||
- cache_unlock(smc);
|
|||
- }
|
|||
- }
|
|||
} |
|||
|
|||
/* |
|||
diff --git a/modules/lookup_program.c b/modules/lookup_program.c
|
|||
index 56e19394..fcb1af74 100644
|
|||
--- a/modules/lookup_program.c
|
|||
+++ b/modules/lookup_program.c
|
|||
@@ -601,27 +601,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
|||
/* Check if we recorded a mount fail for this key anywhere */ |
|||
me = lookup_source_mapent(ap, name, LKP_DISTINCT); |
|||
if (me) { |
|||
- if (me->status >= monotonic_time(NULL)) {
|
|||
- cache_unlock(me->mc);
|
|||
+ /* negative timeout has not passed, return fail */
|
|||
+ if (cache_lookup_negative(me, name) == CHE_UNAVAIL)
|
|||
return NSS_STATUS_NOTFOUND; |
|||
- } else {
|
|||
- struct mapent_cache *smc = me->mc;
|
|||
- struct mapent *sme;
|
|||
-
|
|||
- if (me->mapent)
|
|||
- cache_unlock(smc);
|
|||
- else {
|
|||
- cache_unlock(smc);
|
|||
- cache_writelock(smc);
|
|||
- sme = cache_lookup_distinct(smc, name);
|
|||
- /* Negative timeout expired for non-existent entry. */
|
|||
- if (sme && !sme->mapent) {
|
|||
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
|||
- cache_delete(smc, name);
|
|||
- }
|
|||
- cache_unlock(smc);
|
|||
- }
|
|||
- }
|
|||
} |
|||
|
|||
/* Catch installed direct offset triggers */ |
|||
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
|
|||
index 78598300..ce60acd3 100644
|
|||
--- a/modules/lookup_sss.c
|
|||
+++ b/modules/lookup_sss.c
|
|||
@@ -726,27 +726,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
|||
/* Check if we recorded a mount fail for this key anywhere */ |
|||
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
|||
if (me) { |
|||
- if (me->status >= monotonic_time(NULL)) {
|
|||
- cache_unlock(me->mc);
|
|||
+ /* negative timeout has not passed, return fail */
|
|||
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
|||
return NSS_STATUS_NOTFOUND; |
|||
- } else {
|
|||
- struct mapent_cache *smc = me->mc;
|
|||
- struct mapent *sme;
|
|||
-
|
|||
- if (me->mapent)
|
|||
- cache_unlock(smc);
|
|||
- else {
|
|||
- cache_unlock(smc);
|
|||
- cache_writelock(smc);
|
|||
- sme = cache_lookup_distinct(smc, key);
|
|||
- /* Negative timeout expired for non-existent entry. */
|
|||
- if (sme && !sme->mapent) {
|
|||
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
|||
- cache_delete(smc, key);
|
|||
- }
|
|||
- cache_unlock(smc);
|
|||
- }
|
|||
- }
|
|||
} |
|||
|
|||
/* |
|||
diff --git a/modules/lookup_yp.c b/modules/lookup_yp.c
|
|||
index d1ffcae4..38f75497 100644
|
|||
--- a/modules/lookup_yp.c
|
|||
+++ b/modules/lookup_yp.c
|
|||
@@ -813,27 +813,9 @@ int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *
|
|||
/* Check if we recorded a mount fail for this key anywhere */ |
|||
me = lookup_source_mapent(ap, key, LKP_DISTINCT); |
|||
if (me) { |
|||
- if (me->status >= monotonic_time(NULL)) {
|
|||
- cache_unlock(me->mc);
|
|||
+ /* negative timeout has not passed, return fail */
|
|||
+ if (cache_lookup_negative(me, key) == CHE_UNAVAIL)
|
|||
return NSS_STATUS_NOTFOUND; |
|||
- } else {
|
|||
- struct mapent_cache *smc = me->mc;
|
|||
- struct mapent *sme;
|
|||
-
|
|||
- if (me->mapent)
|
|||
- cache_unlock(smc);
|
|||
- else {
|
|||
- cache_unlock(smc);
|
|||
- cache_writelock(smc);
|
|||
- sme = cache_lookup_distinct(smc, key);
|
|||
- /* Negative timeout expired for non-existent entry. */
|
|||
- if (sme && !sme->mapent) {
|
|||
- if (cache_pop_mapent(sme) == CHE_FAIL)
|
|||
- cache_delete(smc, key);
|
|||
- }
|
|||
- cache_unlock(smc);
|
|||
- }
|
|||
- }
|
|||
} |
|||
|
|||
/* |
@ -1,236 +0,0 @@ |
|||
autofs-5.1.4 - remove autofs4 module load code |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The autofs kernel module has finally been renamed from autofs4 to |
|||
autofs so autoloading works so there is no need for manual loading. |
|||
|
|||
The module load function has been commented out in the source for |
|||
a long time so there should not be any adverse affects from removing |
|||
it. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
configure | 61 --------------------------------------------------- |
|||
configure.in | 1 - |
|||
daemon/automount.c | 8 ------- |
|||
daemon/module.c | 35 ----------------------------- |
|||
include/automount.h | 7 ------ |
|||
include/config.h.in | 6 ----- |
|||
7 files changed, 1 insertion(+), 118 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 1a9296f5..0a56df5a 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -42,6 +42,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix possible NULL pointer dereference in get_defaults_entry(). |
|||
- better handle hesiod support not built in. |
|||
- fix indent in automount(8) man page. |
|||
+- remove autofs4 module load code.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/configure b/configure
|
|||
index 827921ba..2116668a 100755
|
|||
--- a/configure
|
|||
+++ b/configure
|
|||
@@ -659,8 +659,6 @@ PATH_YACC
|
|||
YACC |
|||
PATH_LEX |
|||
LEX |
|||
-HAVE_MODPROBE
|
|||
-MODPROBE
|
|||
HAVE_E4FSCK |
|||
E4FSCK |
|||
HAVE_E3FSCK |
|||
@@ -4155,65 +4153,6 @@ else
|
|||
HAVE_E4FSCK=0 |
|||
fi |
|||
|
|||
-for ac_prog in modprobe
|
|||
-do
|
|||
- # Extract the first word of "$ac_prog", so it can be a program name with args.
|
|||
-set dummy $ac_prog; ac_word=$2
|
|||
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
|||
-$as_echo_n "checking for $ac_word... " >&6; }
|
|||
-if ${ac_cv_path_MODPROBE+:} false; then :
|
|||
- $as_echo_n "(cached) " >&6
|
|||
-else
|
|||
- case $MODPROBE in
|
|||
- [\\/]* | ?:[\\/]*)
|
|||
- ac_cv_path_MODPROBE="$MODPROBE" # Let the user override the test with a path.
|
|||
- ;;
|
|||
- *)
|
|||
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
|||
-for as_dir in $searchpath
|
|||
-do
|
|||
- IFS=$as_save_IFS
|
|||
- test -z "$as_dir" && as_dir=.
|
|||
- for ac_exec_ext in '' $ac_executable_extensions; do
|
|||
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
|||
- ac_cv_path_MODPROBE="$as_dir/$ac_word$ac_exec_ext"
|
|||
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
|||
- break 2
|
|||
- fi
|
|||
-done
|
|||
- done
|
|||
-IFS=$as_save_IFS
|
|||
-
|
|||
- ;;
|
|||
-esac
|
|||
-fi
|
|||
-MODPROBE=$ac_cv_path_MODPROBE
|
|||
-if test -n "$MODPROBE"; then
|
|||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MODPROBE" >&5
|
|||
-$as_echo "$MODPROBE" >&6; }
|
|||
-else
|
|||
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|||
-$as_echo "no" >&6; }
|
|||
-fi
|
|||
-
|
|||
-
|
|||
- test -n "$MODPROBE" && break
|
|||
-done
|
|||
-
|
|||
-if test -n "$MODPROBE"; then
|
|||
-
|
|||
-$as_echo "#define HAVE_MODPROBE 1" >>confdefs.h
|
|||
-
|
|||
-
|
|||
-cat >>confdefs.h <<_ACEOF
|
|||
-#define PATH_MODPROBE "$MODPROBE"
|
|||
-_ACEOF
|
|||
-
|
|||
- HAVE_MODPROBE=1
|
|||
-else
|
|||
- HAVE_MODPROBE=0
|
|||
-fi
|
|||
-
|
|||
|
|||
for ac_prog in flex lex |
|||
do |
|||
diff --git a/configure.in b/configure.in
|
|||
index 4b0a81f2..dbee99f4 100644
|
|||
--- a/configure.in
|
|||
+++ b/configure.in
|
|||
@@ -161,7 +161,6 @@ AF_PATH_INCLUDE(UMOUNT, umount, /bin/umount, $searchpath)
|
|||
AF_PATH_INCLUDE(E2FSCK, fsck.ext2 e2fsck, , $searchpath) |
|||
AF_PATH_INCLUDE(E3FSCK, fsck.ext3 e3fsck, , $searchpath) |
|||
AF_PATH_INCLUDE(E4FSCK, fsck.ext4 e4fsck, , $searchpath) |
|||
-AF_PATH_INCLUDE(MODPROBE, modprobe, , $searchpath)
|
|||
|
|||
AF_CHECK_PROG(LEX, flex lex, , $searchpath) |
|||
AF_CHECK_PROG(YACC, bison, , $searchpath) |
|||
diff --git a/daemon/automount.c b/daemon/automount.c
|
|||
index 05ec8a62..2c0def54 100644
|
|||
--- a/daemon/automount.c
|
|||
+++ b/daemon/automount.c
|
|||
@@ -2336,14 +2336,6 @@ int main(int argc, char *argv[])
|
|||
exit(exit_code); |
|||
} |
|||
|
|||
-#if 0
|
|||
- if (!load_autofs4_module()) {
|
|||
- fprintf(stderr, "%s: can't load %s filesystem module.\n",
|
|||
- program, FS_MODULE_NAME);
|
|||
- exit(1);
|
|||
- }
|
|||
-#endif
|
|||
-
|
|||
/* Don't need the kernel module just to look at the configured maps */ |
|||
if (!dumpmaps && (!query_kproto_ver() || get_kver_major() < 5)) { |
|||
fprintf(stderr, |
|||
diff --git a/daemon/module.c b/daemon/module.c
|
|||
index b1a94f56..be96a82b 100644
|
|||
--- a/daemon/module.c
|
|||
+++ b/daemon/module.c
|
|||
@@ -19,41 +19,6 @@
|
|||
#include "automount.h" |
|||
#include "nsswitch.h" |
|||
|
|||
-int load_autofs4_module(void)
|
|||
-{
|
|||
- FILE *fp;
|
|||
- char buf[PATH_MAX];
|
|||
- int ret;
|
|||
-
|
|||
- /*
|
|||
- * Check if module already loaded or compiled in.
|
|||
- * If both autofs v3 and v4 are coplied in and
|
|||
- * the v3 module registers first or the v4 module
|
|||
- * is an older version we will catch it at mount
|
|||
- * time.
|
|||
- */
|
|||
- fp = open_fopen_r("/proc/filesystems");
|
|||
- if (!fp) {
|
|||
- logerr("cannot open /proc/filesystems");
|
|||
- return 0;
|
|||
- }
|
|||
-
|
|||
- while (fgets(buf, sizeof(buf), fp)) {
|
|||
- if (strstr(buf, "autofs")) {
|
|||
- fclose(fp);
|
|||
- return 1;
|
|||
- }
|
|||
- }
|
|||
- fclose(fp);
|
|||
-
|
|||
- ret = spawnl(LOGOPT_NONE, PATH_MODPROBE, PATH_MODPROBE,
|
|||
- "-q", FS_MODULE_NAME, NULL);
|
|||
- if (ret)
|
|||
- return 0;
|
|||
-
|
|||
- return 1;
|
|||
-}
|
|||
-
|
|||
int open_lookup(const char *name, const char *err_prefix, const char *mapfmt, |
|||
int argc, const char *const *argv, struct lookup_mod **lookup) |
|||
{ |
|||
diff --git a/include/automount.h b/include/automount.h
|
|||
index 417dacbb..eccd16aa 100644
|
|||
--- a/include/automount.h
|
|||
+++ b/include/automount.h
|
|||
@@ -52,17 +52,10 @@
|
|||
#error Failed to locate umount(8)! |
|||
#endif |
|||
|
|||
-#ifndef HAVE_MODPROBE
|
|||
-#error Failed to locate modprobe(8)!
|
|||
-#endif
|
|||
-
|
|||
#ifndef HAVE_LINUX_PROCFS |
|||
#error Failed to verify existence of procfs filesystem! |
|||
#endif |
|||
|
|||
-#define FS_MODULE_NAME "autofs4"
|
|||
-int load_autofs4_module(void);
|
|||
-
|
|||
/* The -s (sloppy) option to mount is good, if we have it... */ |
|||
|
|||
#ifdef HAVE_SLOPPY_MOUNT |
|||
diff --git a/include/config.h.in b/include/config.h.in
|
|||
index 991a2bda..a4879494 100644
|
|||
--- a/include/config.h.in
|
|||
+++ b/include/config.h.in
|
|||
@@ -48,9 +48,6 @@
|
|||
/* Define to 1 if you have the <memory.h> header file. */ |
|||
#undef HAVE_MEMORY_H |
|||
|
|||
-/* define if you have MODPROBE */
|
|||
-#undef HAVE_MODPROBE
|
|||
-
|
|||
/* define if you have MOUNT */ |
|||
#undef HAVE_MOUNT |
|||
|
|||
@@ -129,9 +126,6 @@
|
|||
/* define if you have LEX */ |
|||
#undef PATH_LEX |
|||
|
|||
-/* define if you have MODPROBE */
|
|||
-#undef PATH_MODPROBE
|
|||
-
|
|||
/* define if you have MOUNT */ |
|||
#undef PATH_MOUNT |
|||
|
@ -1,38 +0,0 @@ |
|||
autofs-5.1.4 - remove couple of undeeded requires |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Remove a couple of apparently undeeded Requires entries from the tar |
|||
spec file. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
autofs.spec | 2 +- |
|||
2 files changed, 2 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 2a551426..5e1bdf42 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -51,6 +51,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- refactor negative map entry check. |
|||
- remove unused function dump_master(). |
|||
- remove unused function dump_state_queue(). |
|||
+- remove couple of undeeded requires.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/autofs.spec b/autofs.spec
|
|||
index 6419e3e3..53654437 100644
|
|||
--- a/autofs.spec
|
|||
+++ b/autofs.spec
|
|||
@@ -39,7 +39,7 @@ BuildRequires: libtirpc-devel
|
|||
%endif |
|||
BuildRequires: autoconf, hesiod-devel, openldap-devel, bison, flex, cyrus-sasl-devel |
|||
Requires: chkconfig |
|||
-Requires: /bin/bash mktemp sed textutils sh-utils grep /bin/ps
|
|||
+Requires: /bin/bash sed grep /bin/ps
|
|||
%if %{with_systemd} |
|||
Requires(post): systemd-sysv |
|||
Requires(post): systemd-units |
@ -1,41 +0,0 @@ |
|||
autofs-5.1.4 - remove unused function dump_master() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/master.c | 11 ----------- |
|||
2 files changed, 1 insertion(+), 11 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 0de3f31b..32e34e35 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -49,6 +49,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- move close stdio descriptors to become_daemon(). |
|||
- add systemd service command line option. |
|||
- refactor negative map entry check. |
|||
+- remove unused function dump_master().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/lib/master.c b/lib/master.c
|
|||
index ba5272f0..5f3a3d99 100644
|
|||
--- a/lib/master.c
|
|||
+++ b/lib/master.c
|
|||
@@ -1965,14 +1965,3 @@ int master_kill(struct master *master)
|
|||
|
|||
return 1; |
|||
} |
|||
-
|
|||
-void dump_master(struct master *master)
|
|||
-{
|
|||
- struct list_head *p, *head;
|
|||
-
|
|||
- head = &master->mounts;
|
|||
- list_for_each(p, head) {
|
|||
- struct master_mapent *this = list_entry(p, struct master_mapent, list);
|
|||
- logmsg("path %s", this->path);
|
|||
- }
|
|||
-}
|
@ -1,57 +0,0 @@ |
|||
autofs-5.1.4 - remove unused function dump_state_queue() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/state.c | 24 ------------------------ |
|||
2 files changed, 1 insertion(+), 24 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 32e34e35..2a551426 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -50,6 +50,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add systemd service command line option. |
|||
- refactor negative map entry check. |
|||
- remove unused function dump_master(). |
|||
+- remove unused function dump_state_queue().
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/state.c b/daemon/state.c
|
|||
index 3d91f5b1..ca9534c4 100644
|
|||
--- a/daemon/state.c
|
|||
+++ b/daemon/state.c
|
|||
@@ -52,30 +52,6 @@ void st_mutex_unlock(void)
|
|||
fatal(status); |
|||
} |
|||
|
|||
-void dump_state_queue(void)
|
|||
-{
|
|||
- struct list_head *head = &state_queue;
|
|||
- struct list_head *p, *q;
|
|||
-
|
|||
- logmsg("dumping queue");
|
|||
-
|
|||
- list_for_each(p, head) {
|
|||
- struct state_queue *entry;
|
|||
-
|
|||
- entry = list_entry(p, struct state_queue, list);
|
|||
- logmsg("queue list head path %s state %d busy %d",
|
|||
- entry->ap->path, entry->state, entry->busy);
|
|||
-
|
|||
- list_for_each(q, &entry->pending) {
|
|||
- struct state_queue *this;
|
|||
-
|
|||
- this = list_entry(q, struct state_queue, pending);
|
|||
- logmsg("queue list entry path %s state %d busy %d",
|
|||
- this->ap->path, this->state, this->busy);
|
|||
- }
|
|||
- }
|
|||
-}
|
|||
-
|
|||
void nextstate(int statefd, enum states next) |
|||
{ |
|||
char buf[MAX_ERR_BUF]; |
@ -1,73 +0,0 @@ |
|||
autofs-5.1.4 - set bind mount as propagation slave |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
When using a multi-mount with mount targets that are on the |
|||
local machine and resulting bind mounts are made to a file |
|||
system that is mount propagation shared (such as the root |
|||
file system on systemd managed systems) the autofs offset |
|||
mount triggers made within the bind mount will be propagated |
|||
back to the target file system. |
|||
|
|||
When this happens the target of the offset (the unwanted |
|||
propagated mount) is itself an autofs trigger mount and |
|||
accessing the path results in a deadlock. |
|||
|
|||
In order for these multi-mounts to function properly in this |
|||
case bind mounts that contain mount triggers must be set to |
|||
propagation slave or private so the backward propagation |
|||
doesn't occur. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/mount_bind.c | 16 +++++++++++++++- |
|||
2 files changed, 16 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 42950d51..88829564 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -34,6 +34,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix update_negative_cache() map source usage. |
|||
- fix program usage message. |
|||
- mark removed cache entry negative. |
|||
+- set bind mount as propagation slave.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
|
|||
index 5effa880..fe1ad9b6 100644
|
|||
--- a/modules/mount_bind.c
|
|||
+++ b/modules/mount_bind.c
|
|||
@@ -20,6 +20,7 @@
|
|||
#include <sys/param.h> |
|||
#include <sys/types.h> |
|||
#include <sys/stat.h> |
|||
+#include <sys/mount.h>
|
|||
|
|||
#define MODULE_MOUNT |
|||
#include "automount.h" |
|||
@@ -183,8 +184,21 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
debug(ap->logopt, |
|||
MODPREFIX "mounted %s type %s on %s", |
|||
what, fstype, fullpath); |
|||
- return 0;
|
|||
} |
|||
+
|
|||
+ /* The bind mount has succeeded but if the target
|
|||
+ * mount is propagation shared propagation of child
|
|||
+ * mounts (autofs offset mounts for example) back to
|
|||
+ * the target of the bind mount must be avoided or
|
|||
+ * autofs trigger mounts will deadlock.
|
|||
+ */
|
|||
+ err = mount(NULL, fullpath, NULL, MS_SLAVE, NULL);
|
|||
+ if (err)
|
|||
+ warn(ap->logopt,
|
|||
+ "failed to set propagation type for %s",
|
|||
+ fullpath);
|
|||
+
|
|||
+ return 0;
|
|||
} else { |
|||
char *cp; |
|||
char basepath[PATH_MAX]; |
@ -1,52 +0,0 @@ |
|||
autofs-5.1.4 - tiny patch for autofs typo and possible bug |
|||
|
|||
From: Todd Eigenschink <todd@fai2.com> |
|||
|
|||
(1) The word "to" is doubled in two warnings. |
|||
|
|||
(2) It prints a warning when it can't open the "old" config file, even |
|||
if it was able to open the default one. That's a reasonable warning if |
|||
it *couldn't* open the new one, but seems unnecessary if it could. |
|||
|
|||
The patch removes the unneeded "to"s and only prints warning about the |
|||
old config file if it couldn't open the default one. |
|||
|
|||
Signed-off-by: Todd Eigenschink <todd@fai2.com> |
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/defaults.c | 6 +++--- |
|||
2 files changed, 4 insertions(+), 3 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index a5b79dd6..1e11c3d5 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -21,6 +21,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- add an example fedfs master map entry to the installed master map. |
|||
- improve hostname lookup error logging. |
|||
- fix rpm spec install premissions on auto.net and auto.smb. |
|||
+- tiny patch for autofs typo and possible bug.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/lib/defaults.c b/lib/defaults.c
|
|||
index d20c1907..ae4d27c1 100644
|
|||
--- a/lib/defaults.c
|
|||
+++ b/lib/defaults.c
|
|||
@@ -1207,12 +1207,12 @@ unsigned int defaults_read_config(unsigned int to_syslog)
|
|||
|
|||
conf = open_fopen_r(DEFAULT_CONFIG_FILE); |
|||
if (!conf) |
|||
- message(to_syslog, "failed to to open config %s",
|
|||
+ message(to_syslog, "failed to open config %s",
|
|||
DEFAULT_CONFIG_FILE); |
|||
|
|||
oldconf = open_fopen_r(OLD_CONFIG_FILE); |
|||
- if (!oldconf)
|
|||
- message(to_syslog, "failed to to open old config %s",
|
|||
+ if (!oldconf && !conf)
|
|||
+ message(to_syslog, "failed to open old config %s",
|
|||
OLD_CONFIG_FILE); |
|||
|
|||
/* Neither config has been updated */ |
@ -1,45 +0,0 @@ |
|||
autofs-5.1.4 - update build info with systemd |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Update the show_build_info() function to include systemd |
|||
build info. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/automount.c | 9 +++++++++ |
|||
2 files changed, 10 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index ad9932a2..b30e52c6 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -44,6 +44,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix indent in automount(8) man page. |
|||
- remove autofs4 module load code. |
|||
- add NULL check in prepare_attempt_prefix(). |
|||
+- update build info with systemd.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/automount.c b/daemon/automount.c
|
|||
index 2c0def54..a99d6b33 100644
|
|||
--- a/daemon/automount.c
|
|||
+++ b/daemon/automount.c
|
|||
@@ -1951,6 +1951,15 @@ static void show_build_info(void)
|
|||
} |
|||
#endif |
|||
|
|||
+#ifdef WITH_SYSTEMD
|
|||
+ printf("WITH_SYSTEMD ");
|
|||
+ count = count + 13;
|
|||
+
|
|||
+ if (count > 60) {
|
|||
+ printf("\n ");
|
|||
+ count = 0;
|
|||
+ }
|
|||
+#endif
|
|||
|
|||
#ifdef WITH_HESIOD |
|||
printf("WITH_HESIOD "); |
@ -1,108 +0,0 @@ |
|||
autofs-5.1.4 - use defines for expire type |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The kernel defines for expire type such as an immediate expire |
|||
shoule be used to clearify what is being requested. |
|||
|
|||
AUTOFS_EXP_IMMEDIATE corresponds to a SIGUSR1 prune operation. |
|||
|
|||
AUTOFS_EXP_FORCE corresponds to an expire type not yet implemented in |
|||
the kernel, a SIGUSR2 forced expire. Define it in our internal autofs |
|||
kernel include file, the kernel will ignore it if it doesn't support it. |
|||
|
|||
AUTOFS_EXP_LEAVES is no longer used in autofs version 5. |
|||
|
|||
Finally add a define AUTOFS_EXP_NORMAL to indicate we're perfoming a |
|||
normal expire. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/state.c | 8 ++++---- |
|||
include/linux/auto_fs4.h | 6 ++++-- |
|||
include/state.h | 2 +- |
|||
4 files changed, 10 insertions(+), 7 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index c5ebb7e0..0b7983ea 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -28,6 +28,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix fd leak in rpc_do_create_client(). |
|||
- add-man page note about extra slashes in paths. |
|||
- change expire type naming to better reflect usage. |
|||
+- use defines for expire type.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/state.c b/daemon/state.c
|
|||
index ab235455..3d91f5b1 100644
|
|||
--- a/daemon/state.c
|
|||
+++ b/daemon/state.c
|
|||
@@ -645,7 +645,7 @@ static unsigned int st_prepare_shutdown(struct autofs_point *ap)
|
|||
ap->state = ST_SHUTDOWN_PENDING; |
|||
|
|||
/* Unmount everything */ |
|||
- exp = expire_proc(ap, 1);
|
|||
+ exp = expire_proc(ap, AUTOFS_EXP_IMMEDIATE);
|
|||
switch (exp) { |
|||
case EXP_ERROR: |
|||
case EXP_PARTIAL: |
|||
@@ -671,7 +671,7 @@ static unsigned int st_force_shutdown(struct autofs_point *ap)
|
|||
ap->state = ST_SHUTDOWN_FORCE; |
|||
|
|||
/* Unmount everything */ |
|||
- exp = expire_proc(ap, 1);
|
|||
+ exp = expire_proc(ap, AUTOFS_EXP_FORCE | AUTOFS_EXP_IMMEDIATE);
|
|||
switch (exp) { |
|||
case EXP_ERROR: |
|||
case EXP_PARTIAL: |
|||
@@ -706,7 +706,7 @@ static unsigned int st_prune(struct autofs_point *ap)
|
|||
assert(ap->state == ST_READY); |
|||
ap->state = ST_PRUNE; |
|||
|
|||
- switch (expire_proc(ap, 1)) {
|
|||
+ switch (expire_proc(ap, AUTOFS_EXP_IMMEDIATE)) {
|
|||
case EXP_ERROR: |
|||
case EXP_PARTIAL: |
|||
if (!ap->submount) |
|||
@@ -727,7 +727,7 @@ static unsigned int st_expire(struct autofs_point *ap)
|
|||
assert(ap->state == ST_READY); |
|||
ap->state = ST_EXPIRE; |
|||
|
|||
- switch (expire_proc(ap, 0)) {
|
|||
+ switch (expire_proc(ap, AUTOFS_EXP_NORMAL)) {
|
|||
case EXP_ERROR: |
|||
case EXP_PARTIAL: |
|||
if (!ap->submount) |
|||
diff --git a/include/linux/auto_fs4.h b/include/linux/auto_fs4.h
|
|||
index e02982fa..9196e7bb 100644
|
|||
--- a/include/linux/auto_fs4.h
|
|||
+++ b/include/linux/auto_fs4.h
|
|||
@@ -27,8 +27,10 @@
|
|||
#define AUTOFS_PROTO_SUBVERSION 2 |
|||
|
|||
/* Mask for expire behaviour */ |
|||
-#define AUTOFS_EXP_IMMEDIATE 1
|
|||
-#define AUTOFS_EXP_LEAVES 2
|
|||
+#define AUTOFS_EXP_NORMAL 0x00
|
|||
+#define AUTOFS_EXP_IMMEDIATE 0x01
|
|||
+#define AUTOFS_EXP_LEAVES 0x02
|
|||
+#define AUTOFS_EXP_FORCE 0x04
|
|||
|
|||
#define AUTOFS_TYPE_ANY 0U |
|||
#define AUTOFS_TYPE_INDIRECT 1U |
|||
diff --git a/include/state.h b/include/state.h
|
|||
index e3079c20..98f27d3f 100644
|
|||
--- a/include/state.h
|
|||
+++ b/include/state.h
|
|||
@@ -55,7 +55,7 @@ struct expire_args {
|
|||
unsigned int signaled; |
|||
struct autofs_point *ap; /* autofs mount we are working on */ |
|||
enum states state; /* State prune or expire */ |
|||
- unsigned int how; /* Normal, immediate expire ? */
|
|||
+ unsigned int how; /* Normal, immediate, forced expire ? */
|
|||
int status; /* Return status */ |
|||
}; |
|||
|
@ -1,225 +0,0 @@ |
|||
autofs-5.1.4 - use flags for startup boolean options |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
The daemon uses a number of boolean flags each stored in unsigned int |
|||
variables. But a single bit flag is sufficient storage for most of |
|||
these flags. |
|||
|
|||
So use bit flags for these where possible. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/automount.c | 45 ++++++++++++++++++++++----------------------- |
|||
include/automount.h | 6 ++++++ |
|||
lib/master.c | 4 ++-- |
|||
4 files changed, 31 insertions(+), 25 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index b30e52c6..4c5f276e 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -45,6 +45,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- remove autofs4 module load code. |
|||
- add NULL check in prepare_attempt_prefix(). |
|||
- update build info with systemd. |
|||
+- use flags for startup boolean options.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/daemon/automount.c b/daemon/automount.c
|
|||
index a99d6b33..d891562a 100644
|
|||
--- a/daemon/automount.c
|
|||
+++ b/daemon/automount.c
|
|||
@@ -1195,7 +1195,7 @@ static int handle_packet(struct autofs_point *ap)
|
|||
return -1; |
|||
} |
|||
|
|||
-static void become_daemon(unsigned foreground, unsigned daemon_check)
|
|||
+static void become_daemon(unsigned int flags)
|
|||
{ |
|||
FILE *pidfp; |
|||
char buf[MAX_ERR_BUF]; |
|||
@@ -1210,8 +1210,8 @@ static void become_daemon(unsigned foreground, unsigned daemon_check)
|
|||
} |
|||
|
|||
/* Detach from foreground process */ |
|||
- if (foreground) {
|
|||
- if (daemon_check && !aquire_flag_file()) {
|
|||
+ if (flags & DAEMON_FLAGS_FOREGROUND) {
|
|||
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
|||
fprintf(stderr, "%s: program is already running.\n", |
|||
program); |
|||
exit(1); |
|||
@@ -1238,7 +1238,7 @@ static void become_daemon(unsigned foreground, unsigned daemon_check)
|
|||
} |
|||
close(start_pipefd[0]); |
|||
|
|||
- if (daemon_check && !aquire_flag_file()) {
|
|||
+ if ((flags & DAEMON_FLAGS_CHECK_DAEMON) && !aquire_flag_file()) {
|
|||
fprintf(stderr, "%s: program is already running.\n", |
|||
program); |
|||
/* Return success if already running */ |
|||
@@ -2158,8 +2158,8 @@ int main(int argc, char *argv[])
|
|||
{ |
|||
int res, opt, status; |
|||
int logpri = -1; |
|||
- unsigned ghost, logging, daemon_check;
|
|||
- unsigned dumpmaps, foreground, have_global_options;
|
|||
+ unsigned int flags;
|
|||
+ unsigned int logging;
|
|||
unsigned master_read; |
|||
int master_wait; |
|||
time_t timeout; |
|||
@@ -2202,17 +2202,15 @@ int main(int argc, char *argv[])
|
|||
|
|||
nfs_mount_uses_string_options = check_nfs_mount_version(&vers, &check); |
|||
|
|||
+ flags = defaults_get_browse_mode() ? DAEMON_FLAGS_GHOST : 0;
|
|||
+ flags |= DAEMON_FLAGS_CHECK_DAEMON;
|
|||
+
|
|||
kpkt_len = get_kpkt_len(); |
|||
master_wait = defaults_get_master_wait(); |
|||
timeout = defaults_get_timeout(); |
|||
- ghost = defaults_get_browse_mode();
|
|||
logging = defaults_get_logging(); |
|||
global_selection_options = 0; |
|||
global_options = NULL; |
|||
- have_global_options = 0;
|
|||
- foreground = 0;
|
|||
- dumpmaps = 0;
|
|||
- daemon_check = 1;
|
|||
|
|||
remove_empty_args(argv, &argc); |
|||
|
|||
@@ -2244,7 +2242,7 @@ int main(int argc, char *argv[])
|
|||
break; |
|||
|
|||
case 'f': |
|||
- foreground = 1;
|
|||
+ flags |= DAEMON_FLAGS_FOREGROUND;
|
|||
break; |
|||
|
|||
case 'V': |
|||
@@ -2260,7 +2258,7 @@ int main(int argc, char *argv[])
|
|||
break; |
|||
|
|||
case 'm': |
|||
- dumpmaps = 1;
|
|||
+ flags |= DAEMON_FLAGS_DUMP_MAPS;
|
|||
break; |
|||
|
|||
case 'M': |
|||
@@ -2268,9 +2266,9 @@ int main(int argc, char *argv[])
|
|||
break; |
|||
|
|||
case 'O': |
|||
- if (!have_global_options) {
|
|||
+ if (!(flags & DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS)) {
|
|||
global_options = strdup(optarg); |
|||
- have_global_options = 1;
|
|||
+ flags |= DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS;
|
|||
break; |
|||
} |
|||
printf("%s: global options already specified.\n", |
|||
@@ -2295,7 +2293,7 @@ int main(int argc, char *argv[])
|
|||
break; |
|||
|
|||
case 'C': |
|||
- daemon_check = 0;
|
|||
+ flags &= ~DAEMON_FLAGS_CHECK_DAEMON;
|
|||
break; |
|||
|
|||
case 'F': |
|||
@@ -2346,7 +2344,8 @@ int main(int argc, char *argv[])
|
|||
} |
|||
|
|||
/* Don't need the kernel module just to look at the configured maps */ |
|||
- if (!dumpmaps && (!query_kproto_ver() || get_kver_major() < 5)) {
|
|||
+ if (!(flags & DAEMON_FLAGS_DUMP_MAPS) &&
|
|||
+ (!query_kproto_ver() || get_kver_major() < 5)) {
|
|||
fprintf(stderr, |
|||
"%s: test mount forbidden or " |
|||
"incorrect kernel protocol version, " |
|||
@@ -2377,7 +2376,7 @@ int main(int argc, char *argv[])
|
|||
/* Get processor information for predefined escapes */ |
|||
macro_init(); |
|||
|
|||
- if (dumpmaps) {
|
|||
+ if (flags & DAEMON_FLAGS_DUMP_MAPS) {
|
|||
struct master_mapent *entry; |
|||
struct list_head *head, *p; |
|||
struct mapent_cache *nc; |
|||
@@ -2395,9 +2394,9 @@ int main(int argc, char *argv[])
|
|||
} |
|||
|
|||
if (master) |
|||
- master_list = master_new(NULL, timeout, ghost);
|
|||
+ master_list = master_new(NULL, timeout, flags);
|
|||
else |
|||
- master_list = master_new(master, timeout, ghost);
|
|||
+ master_list = master_new(master, timeout, flags);
|
|||
if (!master_list) { |
|||
printf("%s: can't create master map", program); |
|||
macro_free_global_table(); |
|||
@@ -2443,9 +2442,9 @@ int main(int argc, char *argv[])
|
|||
} |
|||
|
|||
if (argc == 0) |
|||
- master_list = master_new(NULL, timeout, ghost);
|
|||
+ master_list = master_new(NULL, timeout, flags);
|
|||
else |
|||
- master_list = master_new(argv[0], timeout, ghost);
|
|||
+ master_list = master_new(argv[0], timeout, flags);
|
|||
|
|||
if (!master_list) { |
|||
printf("%s: can't create master map %s", program, argv[0]); |
|||
@@ -2453,7 +2452,7 @@ int main(int argc, char *argv[])
|
|||
exit(1); |
|||
} |
|||
|
|||
- become_daemon(foreground, daemon_check);
|
|||
+ become_daemon(flags);
|
|||
|
|||
if (pthread_attr_init(&th_attr)) { |
|||
logerr("%s: failed to init thread attribute struct!", |
|||
diff --git a/include/automount.h b/include/automount.h
|
|||
index eccd16aa..848fd0be 100644
|
|||
--- a/include/automount.h
|
|||
+++ b/include/automount.h
|
|||
@@ -66,6 +66,12 @@
|
|||
#define SLOPPY |
|||
#endif |
|||
|
|||
+#define DAEMON_FLAGS_FOREGROUND 0x0001
|
|||
+#define DAEMON_FLAGS_HAVE_GLOBAL_OPTIONS 0x0004
|
|||
+#define DAEMON_FLAGS_GHOST 0x0008
|
|||
+#define DAEMON_FLAGS_CHECK_DAEMON 0x0010
|
|||
+#define DAEMON_FLAGS_DUMP_MAPS 0x0020
|
|||
+
|
|||
#define AUTOFS_SUPER_MAGIC 0x00000187L |
|||
#define SMB_SUPER_MAGIC 0x0000517BL |
|||
#define CIFS_MAGIC_NUMBER 0xFF534D42L |
|||
diff --git a/lib/master.c b/lib/master.c
|
|||
index 76717d57..ba5272f0 100644
|
|||
--- a/lib/master.c
|
|||
+++ b/lib/master.c
|
|||
@@ -922,7 +922,7 @@ void master_free_mapent(struct master_mapent *entry)
|
|||
return; |
|||
} |
|||
|
|||
-struct master *master_new(const char *name, unsigned int timeout, unsigned int ghost)
|
|||
+struct master *master_new(const char *name, unsigned int timeout, unsigned int flags)
|
|||
{ |
|||
struct master *master; |
|||
char *tmp; |
|||
@@ -948,7 +948,7 @@ struct master *master_new(const char *name, unsigned int timeout, unsigned int g
|
|||
master->depth = 0; |
|||
master->reading = 0; |
|||
master->read_fail = 0; |
|||
- master->default_ghost = ghost;
|
|||
+ master->default_ghost = flags & DAEMON_FLAGS_GHOST;
|
|||
master->default_timeout = timeout; |
|||
master->default_logging = defaults_get_logging(); |
|||
master->logopt = master->default_logging; |
File diff suppressed because it is too large
@ -1,226 +0,0 @@ |
|||
autofs-5.1.4 - use_hostname_for_mounts shouldn't prevent selection among replicas |
|||
|
|||
From: NeilBrown <neilb@suse.com> |
|||
|
|||
If several replicas have been specified for a mount point, |
|||
and use_hostname_for_mount is set to "yes", the selection |
|||
between these replicas is currently disabled and the last in |
|||
the list is always chosen. |
|||
|
|||
There is little point selecting between different addresses |
|||
for the one host in this case, but it is still worth |
|||
selecting between different hosts, particularly if different |
|||
weights have been specified. |
|||
|
|||
This patch restores the "prune_host_list()" functionality |
|||
when use_hostname_for_mount is set, and modifies it slightly |
|||
so that only on IP address for any host:/path entry in the |
|||
config file is willl be successfully probed. After a |
|||
success, further addresses from the same entry are skipped. |
|||
This is achieved by tracking an entry number ("ent_num") for |
|||
each 'struct host'. |
|||
|
|||
Signed-off-by: NeilBrown <neilb@suse.com> |
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
include/replicated.h | 3 ++- |
|||
modules/mount_nfs.c | 2 +- |
|||
modules/replicated.c | 35 ++++++++++++++++++++--------------- |
|||
4 files changed, 24 insertions(+), 17 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 2d5d5b1f..104fca90 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -9,6 +9,7 @@ xx/xx/2018 autofs-5.1.5
|
|||
- fix error return in do_nfs_mount(). |
|||
- add error handling for ext_mount_add(). |
|||
- account for recent libnsl changes. |
|||
+- use_hostname_for_mounts shouldn't prevent selection among replicas.
|
|||
|
|||
19/12/2017 autofs-5.1.4 |
|||
- fix spec file url. |
|||
diff --git a/include/replicated.h b/include/replicated.h
|
|||
index 69ab7800..0f482d21 100644
|
|||
--- a/include/replicated.h
|
|||
+++ b/include/replicated.h
|
|||
@@ -57,6 +57,7 @@
|
|||
|
|||
struct host { |
|||
char *name; |
|||
+ int ent_num;
|
|||
struct sockaddr *addr; |
|||
size_t addr_len; |
|||
unsigned int rr; |
|||
@@ -70,7 +71,7 @@ struct host {
|
|||
}; |
|||
|
|||
void seed_random(void); |
|||
-struct host *new_host(const char *, struct sockaddr *, size_t,
|
|||
+struct host *new_host(const char *, int, struct sockaddr *, size_t,
|
|||
unsigned int, unsigned int, unsigned int); |
|||
void free_host_list(struct host **); |
|||
int parse_location(unsigned, struct host **, const char *, unsigned int); |
|||
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
|
|||
index 77166544..4cf0cd27 100644
|
|||
--- a/modules/mount_nfs.c
|
|||
+++ b/modules/mount_nfs.c
|
|||
@@ -236,7 +236,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
(vers & NFS4_VERS_MASK) != 0 && |
|||
!(vers & UDP6_REQUESTED)) { |
|||
unsigned int v4_probe_ok = 0; |
|||
- struct host *tmp = new_host(hosts->name,
|
|||
+ struct host *tmp = new_host(hosts->name, 0,
|
|||
hosts->addr, hosts->addr_len, |
|||
hosts->proximity, |
|||
hosts->weight, hosts->options); |
|||
diff --git a/modules/replicated.c b/modules/replicated.c
|
|||
index 3ac4c70f..f7b83236 100644
|
|||
--- a/modules/replicated.c
|
|||
+++ b/modules/replicated.c
|
|||
@@ -83,7 +83,7 @@ void seed_random(void)
|
|||
return; |
|||
} |
|||
|
|||
-struct host *new_host(const char *name,
|
|||
+struct host *new_host(const char *name, int ent_num,
|
|||
struct sockaddr *addr, size_t addr_len, |
|||
unsigned int proximity, unsigned int weight, |
|||
unsigned int options) |
|||
@@ -116,6 +116,7 @@ struct host *new_host(const char *name,
|
|||
memset(new, 0, sizeof(struct host)); |
|||
|
|||
new->name = tmp1; |
|||
+ new->ent_num = ent_num;
|
|||
new->addr_len = addr_len; |
|||
new->addr = tmp2; |
|||
new->proximity = proximity; |
|||
@@ -714,7 +715,7 @@ done:
|
|||
int prune_host_list(unsigned logopt, struct host **list, |
|||
unsigned int vers, int port) |
|||
{ |
|||
- struct host *this, *last, *first;
|
|||
+ struct host *this, *last, *first, *prev;
|
|||
struct host *new = NULL; |
|||
unsigned int proximity, selected_version = 0; |
|||
unsigned int v2_tcp_count, v3_tcp_count, v4_tcp_count; |
|||
@@ -726,12 +727,6 @@ int prune_host_list(unsigned logopt, struct host **list,
|
|||
if (!*list) |
|||
return 0; |
|||
|
|||
- /* If we're using the host name then there's no point probing
|
|||
- * avialability and respose time.
|
|||
- */
|
|||
- if (defaults_use_hostname_for_mounts())
|
|||
- return 1;
|
|||
-
|
|||
/* Use closest hosts to choose NFS version */ |
|||
|
|||
first = *list; |
|||
@@ -877,11 +872,18 @@ int prune_host_list(unsigned logopt, struct host **list,
|
|||
|
|||
first = last; |
|||
this = first; |
|||
+ prev = NULL;
|
|||
while (this) { |
|||
struct host *next = this->next; |
|||
if (!this->name) { |
|||
remove_host(list, this); |
|||
add_host(&new, this); |
|||
+ } else if (defaults_use_hostname_for_mounts() && prev &&
|
|||
+ prev->ent_num == this->ent_num) {
|
|||
+ /* When we use the hostname to mount, there is no
|
|||
+ * point in probing every address it has, just one is
|
|||
+ * enough. Skip the rest.
|
|||
+ */
|
|||
} else { |
|||
status = get_supported_ver_and_cost(logopt, this, |
|||
selected_version, port); |
|||
@@ -889,6 +891,7 @@ int prune_host_list(unsigned logopt, struct host **list,
|
|||
this->version = selected_version; |
|||
remove_host(list, this); |
|||
add_host(&new, this); |
|||
+ prev = this;
|
|||
} |
|||
} |
|||
this = next; |
|||
@@ -901,7 +904,7 @@ int prune_host_list(unsigned logopt, struct host **list,
|
|||
} |
|||
|
|||
static int add_new_host(struct host **list, |
|||
- const char *host, unsigned int weight,
|
|||
+ const char *host, int ent_num, unsigned int weight,
|
|||
struct addrinfo *host_addr, |
|||
unsigned int rr, unsigned int options) |
|||
{ |
|||
@@ -940,7 +943,7 @@ static int add_new_host(struct host **list,
|
|||
else |
|||
return 0; |
|||
|
|||
- new = new_host(host, host_addr->ai_addr, addr_len, prx, weight, options);
|
|||
+ new = new_host(host, ent_num, host_addr->ai_addr, addr_len, prx, weight, options);
|
|||
if (!new) |
|||
return 0; |
|||
|
|||
@@ -953,7 +956,7 @@ static int add_new_host(struct host **list,
|
|||
return 1; |
|||
} |
|||
|
|||
-static int add_host_addrs(struct host **list, const char *host,
|
|||
+static int add_host_addrs(struct host **list, const char *host, int ent_num,
|
|||
unsigned int weight, unsigned int options) |
|||
{ |
|||
struct addrinfo hints, *ni, *this; |
|||
@@ -988,7 +991,7 @@ static int add_host_addrs(struct host **list, const char *host,
|
|||
|
|||
this = ni; |
|||
while (this) { |
|||
- ret = add_new_host(list, host, weight, this, 0, options);
|
|||
+ ret = add_new_host(list, host, ent_num, weight, this, 0, options);
|
|||
if (!ret) |
|||
break; |
|||
this = this->ai_next; |
|||
@@ -1027,7 +1030,7 @@ try_name:
|
|||
rr++; |
|||
this = ni; |
|||
while (this) { |
|||
- ret = add_new_host(list, host, weight, this, rr, options);
|
|||
+ ret = add_new_host(list, host, ent_num, weight, this, rr, options);
|
|||
if (!ret) |
|||
break; |
|||
this = this->ai_next; |
|||
@@ -1120,6 +1123,7 @@ int parse_location(unsigned logopt, struct host **hosts,
|
|||
{ |
|||
char *str, *p, *delim; |
|||
unsigned int empty = 1; |
|||
+ int ent_num = 1;
|
|||
|
|||
if (!list) |
|||
return 0; |
|||
@@ -1177,7 +1181,7 @@ int parse_location(unsigned logopt, struct host **hosts,
|
|||
} |
|||
|
|||
if (p != delim) { |
|||
- if (!add_host_addrs(hosts, p, weight, options)) {
|
|||
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
|
|||
if (empty) { |
|||
p = next; |
|||
continue; |
|||
@@ -1199,7 +1203,7 @@ int parse_location(unsigned logopt, struct host **hosts,
|
|||
*delim = '\0'; |
|||
next = delim + 1; |
|||
|
|||
- if (!add_host_addrs(hosts, p, weight, options)) {
|
|||
+ if (!add_host_addrs(hosts, p, ent_num, weight, options)) {
|
|||
p = next; |
|||
continue; |
|||
} |
|||
@@ -1213,6 +1217,7 @@ int parse_location(unsigned logopt, struct host **hosts,
|
|||
return 0; |
|||
} |
|||
|
|||
+ ent_num++;
|
|||
p = next; |
|||
} |
|||
|
@ -1,55 +0,0 @@ |
|||
autofs-5.1.4-fix-flag-file-permission.patch |
|||
autofs-5.1.4-fix-directory-create-permission.patch |
|||
autofs-5.1.4-fix-use-after-free-in-do_master_list_reset.patch |
|||
autofs-5.1.4-fix-deadlock-in-dumpmaps.patch |
|||
autofs-5.1.4-dont-use-array-for-path-when-not-neccessary.patch |
|||
autofs-5.1.4-fix-prefix-option-handling-in-expand_entry.patch |
|||
autofs-5.1.4-fix-sublink-option-not-set-from-defaults.patch |
|||
autofs-5.1.4-fix-error-return-in-do_nfs_mount.patch |
|||
autofs-5.1.4-add-error-handling-for-ext_mount_add.patch |
|||
autofs-5.1.4-account-for-libnsl-changes.patch |
|||
autofs-5.1.4-use_hostname_for_mounts-shouldnt-prevent-selection-among-replicas.patch |
|||
autofs-5.1.4-fix-monotonic_elapsed.patch |
|||
autofs-5.1.4-Makefiles.rules-remove-samples-from-SUBDIRS.patch |
|||
autofs-5.1.4-dont-allow-trailing-slash-in-master-map-mount-points.patch |
|||
autofs-5.1.4-fix-libresolv-configure-check.patch |
|||
autofs-5.1.4-add-fedfs-getsrvinfo_c.patch |
|||
autofs-5.1.4-add-mount_fedfs_c.patch |
|||
autofs-5.1.4-add-fedfs-map-nfs4_c.patch |
|||
autofs-5.1.4-add-conditional-inclusion-of-fedfs-binaries.patch |
|||
autofs-5.1.4-add-an-example-fedfs-master-map-entry-to-the-installed-master-map.patch |
|||
autofs-5.1.4-improve-hostname-lookup-error-logging.patch |
|||
autofs-5.1.4-fix-rpm-spec-install-permissions-on-auto_net-and-auto_smb.patch |
|||
autofs-5.1.4-tiny-patch-for-autofs-typo-and-possible-bug.patch |
|||
autofs-5.1.4-add-units-After-line-to-include-statd-service.patch |
|||
autofs-5.1.4-use-systemd-sd_notify-at-startup.patch |
|||
autofs-5.1.4-fix-NFS-version-mask-usage.patch |
|||
autofs-5.1.4-fix-fd-leak-in-rpc_do_create_client.patch |
|||
autofs-5.1.4-add-man-page-note-about-extra-slashes-in-paths.patch |
|||
autofs-5.1.4-covarity-fixes-1.patch |
|||
autofs-5.1.4-change-expire-type-naming-to-better-reflect-usage.patch |
|||
autofs-5.1.4-use-defines-for-expire-type.patch |
|||
autofs-5.1.4-make-umount_ent-recognise-forced-umount.patch |
|||
autofs-5.1.4-enable-SIGUSR2-handling-in-rpm-spec-file.patch |
|||
autofs-5.1.4-fix-age-setting-at-startup.patch |
|||
autofs-5.1.4-fix-update_negative_cache-map-source-usage.patch |
|||
autofs-5.1.4-fix-program-usage-message.patch |
|||
autofs-5.1.4-mark-removed-cache-entry-negative.patch |
|||
autofs-5.1.4-set-bind-mount-as-propagation-slave.patch |
|||
autofs-5.1.4-add-master-map-pseudo-options-for-mount-propagation.patch |
|||
autofs-5.1.4-fix-use-after-free-in-parse_ldap_config.patch |
|||
autofs-5.1.4-fix-incorrect-locking-in-sss-lookup.patch |
|||
autofs-5.1.4-fix-amd-parser-opts-option-handling.patch |
|||
autofs-5.1.4-fix-possible-NULL-pointer-access-in-get_defaults_entry.patch |
|||
autofs-5.1.4-better-handle-hesiod-support-not-built-in.patch |
|||
autofs-5.1.4-fix-indent-in-automount-8-man-page.patch |
|||
autofs-5.1.4-remove-autofs4-module-load-code.patch |
|||
autofs-5.1.4-add-NULL-check-in-prepare_attempt_prefix.patch |
|||
autofs-5.1.4-update-build-info-with-systemd.patch |
|||
autofs-5.1.4-use-flags-for-startup-boolean-options.patch |
|||
autofs-5.1.4-move-close-stdio-descriptors-to-become_daemon.patch |
|||
autofs-5.1.4-add-systemd-service-command-line-option.patch |
|||
autofs-5.1.4-refactor-negative-map-entry-check.patch |
|||
autofs-5.1.4-remove-unused-function-dump_master.patch |
|||
autofs-5.1.4-remove-unused-function-dump_state_queue.patch |
|||
autofs-5.1.4-remove-couple-of-undeeded-requires.patch |
@ -0,0 +1,47 @@ |
|||
autofs-5.1.5 - Fix NFS mount from IPv6 addresses |
|||
|
|||
From: Goldwyn Rodrigues <rgoldwyn@suse.de> |
|||
|
|||
When an NFS server is specified by an IPv6 address and no mount |
|||
options, the mount fails because check_address_proto() |
|||
receives vers with TCP_REQUESTED set but the host.addr_len is |
|||
INET6_ADDRSTRLEN. Removing the check for INET_ADDRSTRLEN |
|||
fixes this issue. |
|||
|
|||
However, this will allow mount from "proto=tcp" for an IPv6 |
|||
addressed server. |
|||
|
|||
Fixes: 9053214 ("autofs-5.1.3 - fix ipv6 proto option handling") |
|||
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> |
|||
Acked-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/replicated.c | 3 --- |
|||
2 files changed, 1 insertion(+), 3 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 5650e73b..c8a3dec2 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -6,6 +6,7 @@ xx/xx/2019 autofs-5.1.6
|
|||
- add mount_verbose configuration option. |
|||
- optionally log mount requestor process info. |
|||
- log mount call arguments if mount_verbose is set. |
|||
+- Fix NFS mount from IPv6 addresses.
|
|||
|
|||
30/10/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
diff --git a/modules/replicated.c b/modules/replicated.c
|
|||
index 740270ec..e99e32a9 100644
|
|||
--- a/modules/replicated.c
|
|||
+++ b/modules/replicated.c
|
|||
@@ -497,9 +497,6 @@ static int check_address_proto(unsigned logopt,
|
|||
if (ipv6_requested) { |
|||
if (host->addr_len == INET_ADDRSTRLEN) |
|||
ret = 0; |
|||
- } else {
|
|||
- if (host->addr_len == INET6_ADDRSTRLEN)
|
|||
- ret = 0;
|
|||
} |
|||
|
|||
if (!ret) |
@ -0,0 +1,43 @@ |
|||
autofs-5.1.5 - add NULL check for get_addr_string() return |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
When constructing the mount location string in mount_nfs.c:mount_mount() |
|||
the return from get_addr_string() is not checked for NULL. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/mount_nfs.c | 6 ++++++ |
|||
2 files changed, 7 insertions(+) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index 76da2ee4..e71e913a 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -1,6 +1,7 @@
|
|||
xx/xx/2019 autofs-5.1.6 |
|||
- support strictexpire mount option. |
|||
- fix hesiod string check in master_parse(). |
|||
+- add NULL check for get_addr_string() return.
|
|||
|
|||
30/10/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
|
|||
index 426c27bd..295c4a5d 100644
|
|||
--- a/modules/mount_nfs.c
|
|||
+++ b/modules/mount_nfs.c
|
|||
@@ -333,7 +333,13 @@ dont_probe:
|
|||
socklen_t len = INET6_ADDRSTRLEN; |
|||
char n_buf[len + 1]; |
|||
const char *n_addr; |
|||
+
|
|||
n_addr = get_addr_string(this->addr, n_buf, len); |
|||
+ if (!n_addr) {
|
|||
+ char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
|
|||
+ error(ap->logopt, "get_addr_string: %s", estr);
|
|||
+ goto forced_fail;
|
|||
+ }
|
|||
loc = malloc(strlen(n_addr) + strlen(this->path) + 4); |
|||
if (!loc) { |
|||
char *estr = strerror_r(errno, buf, MAX_ERR_BUF); |
@ -0,0 +1,87 @@ |
|||
autofs-5.1.5 - add ignore mount option |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Add mount option "ignore", if the kernel supports it, as an |
|||
indicator to applications to ignore the mount entry. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
daemon/direct.c | 10 ++++++++++ |
|||
daemon/indirect.c | 10 ++++++++++ |
|||
include/automount.h | 3 +++ |
|||
lib/master.c | 4 ++-- |
|||
4 files changed, 25 insertions(+), 2 deletions(-) |
|||
|
|||
diff --git a/daemon/direct.c b/daemon/direct.c
|
|||
index 4f468563..42992220 100644
|
|||
--- a/daemon/direct.c
|
|||
+++ b/daemon/direct.c
|
|||
@@ -431,6 +431,16 @@ int do_mount_autofs_direct(struct autofs_point *ap,
|
|||
mp->options = tmp; |
|||
} |
|||
} |
|||
+
|
|||
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
|
|||
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
|
|||
+ (get_kver_major() > 5))) {
|
|||
+ char *tmp = realloc(mp->options, strlen(mp->options) + 7);
|
|||
+ if (tmp) {
|
|||
+ strcat(tmp, ",ignore");
|
|||
+ mp->options = tmp;
|
|||
+ }
|
|||
+ }
|
|||
} |
|||
|
|||
/* In case the directory doesn't exist, try to mkdir it */ |
|||
diff --git a/daemon/indirect.c b/daemon/indirect.c
|
|||
index 9ccbc038..8719960e 100644
|
|||
--- a/daemon/indirect.c
|
|||
+++ b/daemon/indirect.c
|
|||
@@ -142,6 +142,16 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
|
|||
} |
|||
} |
|||
|
|||
+ if ((ap->flags & MOUNT_FLAG_IGNORE) &&
|
|||
+ ((get_kver_major() == 5 && get_kver_minor() > 4) ||
|
|||
+ (get_kver_major() > 5))) {
|
|||
+ char *tmp = realloc(options, strlen(options) + 7);
|
|||
+ if (tmp) {
|
|||
+ strcat(tmp, ",ignore");
|
|||
+ options = tmp;
|
|||
+ }
|
|||
+ }
|
|||
+
|
|||
/* In case the directory doesn't exist, try to mkdir it */ |
|||
if (mkdir_path(root, mp_mode) < 0) { |
|||
if (errno != EEXIST && errno != EROFS) { |
|||
diff --git a/include/automount.h b/include/automount.h
|
|||
index 1bb32015..d02410f3 100644
|
|||
--- a/include/automount.h
|
|||
+++ b/include/automount.h
|
|||
@@ -557,6 +557,9 @@ struct kernel_mod_version {
|
|||
/* Use strict expire semantics if requested and kernel supports it */ |
|||
#define MOUNT_FLAG_STRICTEXPIRE 0x0400 |
|||
|
|||
+/* Indicator for applications to ignore the mount entry */
|
|||
+#define MOUNT_FLAG_IGNORE 0x0800
|
|||
+
|
|||
struct autofs_point { |
|||
pthread_t thid; |
|||
char *path; /* Mount point name */ |
|||
diff --git a/lib/master.c b/lib/master.c
|
|||
index 5f3a3d99..e0bd34ab 100644
|
|||
--- a/lib/master.c
|
|||
+++ b/lib/master.c
|
|||
@@ -101,9 +101,9 @@ int master_add_autofs_point(struct master_mapent *entry, unsigned logopt,
|
|||
ap->negative_timeout = global_negative_timeout; |
|||
ap->exp_timeout = defaults_get_timeout(); |
|||
ap->exp_runfreq = 0; |
|||
- ap->flags = 0;
|
|||
+ ap->flags = MOUNT_FLAG_IGNORE;
|
|||
if (ghost) |
|||
- ap->flags = MOUNT_FLAG_GHOST;
|
|||
+ ap->flags |= MOUNT_FLAG_GHOST;
|
|||
|
|||
if (nobind) |
|||
ap->flags |= MOUNT_FLAG_NOBIND; |
@ -0,0 +1,188 @@ |
|||
autofs-5.1.5 - add mount_verbose configuration option |
|||
|
|||
From: Lars R. Damerow <lars@pixar.com> |
|||
|
|||
This option makes automount pass the -v flag to mount(8). |
|||
|
|||
Signed-off-by: Lars R. Damerow <lars@pixar.com> |
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/spawn.c | 20 ++++++++++++-------- |
|||
include/defaults.h | 2 ++ |
|||
lib/defaults.c | 17 +++++++++++++++++ |
|||
man/autofs.conf.5.in | 4 ++++ |
|||
redhat/autofs.conf.default.in | 4 ++++ |
|||
samples/autofs.conf.default.in | 4 ++++ |
|||
7 files changed, 44 insertions(+), 8 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index b3c3b3b9..c2a0c7f1 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -3,6 +3,7 @@ xx/xx/2019 autofs-5.1.6
|
|||
- fix hesiod string check in master_parse(). |
|||
- add NULL check for get_addr_string() return. |
|||
- use malloc(3) in spawn.c. |
|||
+- add mount_verbose configuration option.
|
|||
|
|||
30/10/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
diff --git a/daemon/spawn.c b/daemon/spawn.c
|
|||
index 2ab5c46f..4eb268ab 100644
|
|||
--- a/daemon/spawn.c
|
|||
+++ b/daemon/spawn.c
|
|||
@@ -558,12 +558,14 @@ int spawn_mount(unsigned logopt, ...)
|
|||
char prog[] = PATH_MOUNT; |
|||
char arg0[] = PATH_MOUNT; |
|||
char argn[] = "-n"; |
|||
+ char argvr[] = "-v";
|
|||
/* In case we need to use the fake option to mount */ |
|||
char arg_fake[] = "-f"; |
|||
unsigned int options; |
|||
unsigned int retries = MTAB_LOCK_RETRIES; |
|||
int update_mtab = 1, ret, printed = 0; |
|||
unsigned int wait = defaults_get_mount_wait(); |
|||
+ int verbose = defaults_get_mount_verbose();
|
|||
char buf[PATH_MAX + 1]; |
|||
unsigned int argv_len; |
|||
|
|||
@@ -590,8 +592,10 @@ int spawn_mount(unsigned logopt, ...)
|
|||
} |
|||
} |
|||
|
|||
- /* Alloc 1 extra slot in case we need to use the "-f" option */
|
|||
- argv_len = sizeof(char *) * (argc + 2);
|
|||
+ /* Alloc 2 extra slots in case we need to use the "-f" or "-v" options
|
|||
+ * plus the NULL slot for end of args.
|
|||
+ */
|
|||
+ argv_len = sizeof(char *) * (argc + 3);
|
|||
argv = malloc(argv_len); |
|||
if (!argv) { |
|||
char buf[MAX_ERR_BUF]; |
|||
@@ -604,12 +608,12 @@ int spawn_mount(unsigned logopt, ...)
|
|||
argv[0] = arg0; |
|||
|
|||
va_start(arg, logopt); |
|||
- if (update_mtab)
|
|||
- p = argv + 1;
|
|||
- else {
|
|||
- argv[1] = argn;
|
|||
- p = argv + 2;
|
|||
- }
|
|||
+ p = argv + 1;
|
|||
+ if (!update_mtab)
|
|||
+ *(p++) = argn;
|
|||
+ if (verbose)
|
|||
+ *(p++) = argvr;
|
|||
+
|
|||
while ((*p = va_arg(arg, char *))) { |
|||
if (options == SPAWN_OPT_OPEN && !strcmp(*p, "-t")) { |
|||
*(++p) = va_arg(arg, char *); |
|||
diff --git a/include/defaults.h b/include/defaults.h
|
|||
index b28fde34..baa4b4c9 100644
|
|||
--- a/include/defaults.h
|
|||
+++ b/include/defaults.h
|
|||
@@ -27,6 +27,7 @@
|
|||
#define DEFAULT_TIMEOUT "600" |
|||
#define DEFAULT_MASTER_WAIT "10" |
|||
#define DEFAULT_NEGATIVE_TIMEOUT "60" |
|||
+#define DEFAULT_MOUNT_VERBOSE "0"
|
|||
#define DEFAULT_MOUNT_WAIT "-1" |
|||
#define DEFAULT_UMOUNT_WAIT "12" |
|||
#define DEFAULT_BROWSE_MODE "1" |
|||
@@ -166,6 +167,7 @@ unsigned int defaults_get_ldap_timeout(void);
|
|||
unsigned int defaults_get_ldap_network_timeout(void); |
|||
unsigned int defaults_get_mount_nfs_default_proto(void); |
|||
unsigned int defaults_get_append_options(void); |
|||
+unsigned int defaults_get_mount_verbose(void);
|
|||
unsigned int defaults_get_mount_wait(void); |
|||
unsigned int defaults_get_umount_wait(void); |
|||
const char *defaults_get_auth_conf_file(void); |
|||
diff --git a/lib/defaults.c b/lib/defaults.c
|
|||
index ae4d27c1..4ac5a180 100644
|
|||
--- a/lib/defaults.c
|
|||
+++ b/lib/defaults.c
|
|||
@@ -68,6 +68,7 @@
|
|||
|
|||
#define NAME_MOUNT_NFS_DEFAULT_PROTOCOL "mount_nfs_default_protocol" |
|||
#define NAME_APPEND_OPTIONS "append_options" |
|||
+#define NAME_MOUNT_VERBOSE "mount_verbose"
|
|||
#define NAME_MOUNT_WAIT "mount_wait" |
|||
#define NAME_UMOUNT_WAIT "umount_wait" |
|||
#define NAME_AUTH_CONF_FILE "auth_conf_file" |
|||
@@ -328,6 +329,11 @@ static int conf_load_autofs_defaults(void)
|
|||
if (ret == CFG_FAIL) |
|||
goto error; |
|||
|
|||
+ ret = conf_update(sec, NAME_MOUNT_VERBOSE,
|
|||
+ DEFAULT_MOUNT_VERBOSE, CONF_ENV);
|
|||
+ if (ret == CFG_FAIL)
|
|||
+ goto error;
|
|||
+
|
|||
ret = conf_update(sec, NAME_MOUNT_WAIT, |
|||
DEFAULT_MOUNT_WAIT, CONF_ENV); |
|||
if (ret == CFG_FAIL) |
|||
@@ -1781,6 +1787,17 @@ unsigned int defaults_get_append_options(void)
|
|||
return res; |
|||
} |
|||
|
|||
+unsigned int defaults_get_mount_verbose(void)
|
|||
+{
|
|||
+ long res;
|
|||
+
|
|||
+ res = conf_get_yesno(autofs_gbl_sec, NAME_MOUNT_VERBOSE);
|
|||
+ if (res < 0)
|
|||
+ res = atoi(DEFAULT_MOUNT_VERBOSE);
|
|||
+
|
|||
+ return res;
|
|||
+}
|
|||
+
|
|||
unsigned int defaults_get_mount_wait(void) |
|||
{ |
|||
long wait; |
|||
diff --git a/man/autofs.conf.5.in b/man/autofs.conf.5.in
|
|||
index cd7fc2f2..31136e2e 100644
|
|||
--- a/man/autofs.conf.5.in
|
|||
+++ b/man/autofs.conf.5.in
|
|||
@@ -41,6 +41,10 @@ Set the default timeout for caching failed key lookups (program default
|
|||
60). If the equivalent command line option is given it will override this |
|||
setting. |
|||
.TP |
|||
+.B mount_verbose
|
|||
+.br
|
|||
+Use the verbose flag when spawning mount(8) (program default "no").
|
|||
+.TP
|
|||
.B mount_wait |
|||
.br |
|||
Set the default time to wait for a response from a spawned mount(8) |
|||
diff --git a/redhat/autofs.conf.default.in b/redhat/autofs.conf.default.in
|
|||
index a72a79f6..7949f51a 100644
|
|||
--- a/redhat/autofs.conf.default.in
|
|||
+++ b/redhat/autofs.conf.default.in
|
|||
@@ -26,6 +26,10 @@ timeout = 300
|
|||
# |
|||
#negative_timeout = 60 |
|||
# |
|||
+# mount_verbose - use the -v flag when calling mount(8).
|
|||
+#
|
|||
+#mount_verbose = no
|
|||
+#
|
|||
# mount_wait - time to wait for a response from mount(8). |
|||
# Setting this timeout can cause problems when |
|||
# mount would otherwise wait for a server that |
|||
diff --git a/samples/autofs.conf.default.in b/samples/autofs.conf.default.in
|
|||
index 2693a975..d33625f1 100644
|
|||
--- a/samples/autofs.conf.default.in
|
|||
+++ b/samples/autofs.conf.default.in
|
|||
@@ -26,6 +26,10 @@ timeout = 300
|
|||
# |
|||
#negative_timeout = 60 |
|||
# |
|||
+# mount_verbose - use the -v flag when calling mount(8).
|
|||
+#
|
|||
+#mount_verbose = no
|
|||
+#
|
|||
# mount_wait - time to wait for a response from mount(8). |
|||
# Setting this timeout can cause problems when |
|||
# mount would otherwise wait for a server that |
@ -0,0 +1,215 @@ |
|||
autofs-5.1.5 - support strictexpire mount option |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Kernel commit 092a53452b (("autofs: take more care to not update |
|||
last_used on path walk") helped to (partially) resolve a problem |
|||
where automounts were not expiring due to aggressive accesses from |
|||
user space. |
|||
|
|||
This patch was later reverted because, for very large environments, |
|||
it meant more mount requests from clients and when there are a lot |
|||
of clients this caused a fairly significant increase in server load. |
|||
|
|||
But there is a need for both types of expire check, depending on use |
|||
case, so a mount option to allow for strict update of last use of |
|||
autofs dentrys has been added ito the autofs file system (which just |
|||
means not updating the last use on path walk accesses). |
|||
|
|||
So add support for this master map mount entry option in the user |
|||
space code. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 3 +++ |
|||
daemon/direct.c | 10 ++++++++++ |
|||
daemon/indirect.c | 10 ++++++++++ |
|||
include/automount.h | 3 +++ |
|||
lib/master_parse.y | 8 +++++++- |
|||
lib/master_tok.l | 1 + |
|||
man/auto.master.5.in | 8 ++++++++ |
|||
modules/mount_autofs.c | 5 +++++ |
|||
8 files changed, 47 insertions(+), 1 deletion(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index ca036f19..f671dc52 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -1,3 +1,6 @@
|
|||
+xx/xx/2019 autofs-5.1.6
|
|||
+- support strictexpire mount option.
|
|||
+
|
|||
30/10/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
- fix directory create permission. |
|||
diff --git a/daemon/direct.c b/daemon/direct.c
|
|||
index b885d12f..9c61c4b4 100644
|
|||
--- a/daemon/direct.c
|
|||
+++ b/daemon/direct.c
|
|||
@@ -421,6 +421,16 @@ int do_mount_autofs_direct(struct autofs_point *ap,
|
|||
mp->options = make_options_string(ap->path, ap->kpipefd, str_direct); |
|||
if (!mp->options) |
|||
return 0; |
|||
+
|
|||
+ if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
|
|||
+ ((get_kver_major() == 5 && get_kver_minor() > 3) ||
|
|||
+ (get_kver_major() > 5))) {
|
|||
+ char *tmp = realloc(mp->options, strlen(mp->options) + 12);
|
|||
+ if (tmp) {
|
|||
+ strcat(tmp, ",strictexpire");
|
|||
+ mp->options = tmp;
|
|||
+ }
|
|||
+ }
|
|||
} |
|||
|
|||
/* In case the directory doesn't exist, try to mkdir it */ |
|||
diff --git a/daemon/indirect.c b/daemon/indirect.c
|
|||
index 438a0a21..d0724293 100644
|
|||
--- a/daemon/indirect.c
|
|||
+++ b/daemon/indirect.c
|
|||
@@ -132,6 +132,16 @@ static int do_mount_autofs_indirect(struct autofs_point *ap, const char *root)
|
|||
goto out_err; |
|||
} |
|||
|
|||
+ if ((ap->flags & MOUNT_FLAG_STRICTEXPIRE) &&
|
|||
+ ((get_kver_major() == 5 && get_kver_minor() > 3) ||
|
|||
+ (get_kver_major() > 5))) {
|
|||
+ char *tmp = realloc(options, strlen(options) + 12);
|
|||
+ if (tmp) {
|
|||
+ strcat(tmp, ",strictexpire");
|
|||
+ options = tmp;
|
|||
+ }
|
|||
+ }
|
|||
+
|
|||
/* In case the directory doesn't exist, try to mkdir it */ |
|||
if (mkdir_path(root, mp_mode) < 0) { |
|||
if (errno != EEXIST && errno != EROFS) { |
|||
diff --git a/include/automount.h b/include/automount.h
|
|||
index 947daa10..1bb32015 100644
|
|||
--- a/include/automount.h
|
|||
+++ b/include/automount.h
|
|||
@@ -554,6 +554,9 @@ struct kernel_mod_version {
|
|||
#define MOUNT_FLAG_SLAVE 0x0100 |
|||
#define MOUNT_FLAG_PRIVATE 0x0200 |
|||
|
|||
+/* Use strict expire semantics if requested and kernel supports it */
|
|||
+#define MOUNT_FLAG_STRICTEXPIRE 0x0400
|
|||
+
|
|||
struct autofs_point { |
|||
pthread_t thid; |
|||
char *path; /* Mount point name */ |
|||
diff --git a/lib/master_parse.y b/lib/master_parse.y
|
|||
index 9aa57327..8fe8b128 100644
|
|||
--- a/lib/master_parse.y
|
|||
+++ b/lib/master_parse.y
|
|||
@@ -58,6 +58,7 @@ static char *format;
|
|||
static long timeout; |
|||
static long negative_timeout; |
|||
static unsigned symlnk; |
|||
+static unsigned strictexpire;
|
|||
static unsigned slave; |
|||
static unsigned private; |
|||
static unsigned nobind; |
|||
@@ -105,7 +106,7 @@ static int master_fprintf(FILE *, char *, ...);
|
|||
%token MAP |
|||
%token OPT_TIMEOUT OPT_NTIMEOUT OPT_NOBIND OPT_NOGHOST OPT_GHOST OPT_VERBOSE |
|||
%token OPT_DEBUG OPT_RANDOM OPT_USE_WEIGHT OPT_SYMLINK OPT_MODE |
|||
-%token OPT_SLAVE OPT_PRIVATE
|
|||
+%token OPT_STRICTEXPIRE OPT_SLAVE OPT_PRIVATE
|
|||
%token COLON COMMA NL DDASH |
|||
%type <strtype> map |
|||
%type <strtype> options |
|||
@@ -206,6 +207,7 @@ line:
|
|||
| PATH OPT_DEBUG { master_notify($1); YYABORT; } |
|||
| PATH OPT_TIMEOUT { master_notify($1); YYABORT; } |
|||
| PATH OPT_SYMLINK { master_notify($1); YYABORT; } |
|||
+ | PATH OPT_STRICTEXPIRE { master_notify($1); YYABORT; }
|
|||
| PATH OPT_SLAVE { master_notify($1); YYABORT; } |
|||
| PATH OPT_PRIVATE { master_notify($1); YYABORT; } |
|||
| PATH OPT_NOBIND { master_notify($1); YYABORT; } |
|||
@@ -619,6 +621,7 @@ option: daemon_option
|
|||
daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; } |
|||
| OPT_NTIMEOUT NUMBER { negative_timeout = $2; } |
|||
| OPT_SYMLINK { symlnk = 1; } |
|||
+ | OPT_STRICTEXPIRE { strictexpire = 1; }
|
|||
| OPT_SLAVE { slave = 1; } |
|||
| OPT_PRIVATE { private = 1; } |
|||
| OPT_NOBIND { nobind = 1; } |
|||
@@ -693,6 +696,7 @@ static void local_init_vars(void)
|
|||
timeout = -1; |
|||
negative_timeout = 0; |
|||
symlnk = 0; |
|||
+ strictexpire = 0;
|
|||
slave = 0; |
|||
private = 0; |
|||
nobind = 0; |
|||
@@ -901,6 +905,8 @@ int master_parse_entry(const char *buffer, unsigned int default_timeout, unsigne
|
|||
entry->ap->flags |= MOUNT_FLAG_USE_WEIGHT_ONLY; |
|||
if (symlnk) |
|||
entry->ap->flags |= MOUNT_FLAG_SYMLINK; |
|||
+ if (strictexpire)
|
|||
+ entry->ap->flags |= MOUNT_FLAG_STRICTEXPIRE;
|
|||
if (slave) |
|||
entry->ap->flags |= MOUNT_FLAG_SLAVE; |
|||
if (private) |
|||
diff --git a/lib/master_tok.l b/lib/master_tok.l
|
|||
index f4e940ce..7486710b 100644
|
|||
--- a/lib/master_tok.l
|
|||
+++ b/lib/master_tok.l
|
|||
@@ -391,6 +391,7 @@ MODE (--mode{OPTWS}|--mode{OPTWS}={OPTWS})
|
|||
-?nobrowse { return(OPT_NOGHOST); } |
|||
-?slave { return(OPT_SLAVE); } |
|||
-?private { return(OPT_PRIVATE); } |
|||
+ -?strictexpire { return(OPT_STRICTEXPIRE); }
|
|||
-g|--ghost|-?browse { return(OPT_GHOST); } |
|||
-v|--verbose { return(OPT_VERBOSE); } |
|||
-d|--debug { return(OPT_DEBUG); } |
|||
diff --git a/man/auto.master.5.in b/man/auto.master.5.in
|
|||
index 68242d45..dace4a1c 100644
|
|||
--- a/man/auto.master.5.in
|
|||
+++ b/man/auto.master.5.in
|
|||
@@ -199,6 +199,14 @@ entries only, either in the master map (so it effects all map entries)
|
|||
or with individual map entries. The option is ignored for direct mounts |
|||
and non-root offest mount entries. |
|||
.TP |
|||
+.I "strictexpire"
|
|||
+Use a strict expire policy for this automount. Using this option means
|
|||
+that last use of autofs directory entries will not be updated during
|
|||
+path walks so that mounts in an automount won't be kept mounted by
|
|||
+applications scanning the mount tree. Note that this doesn't completely
|
|||
+resolve the problem of expired automounts being immediately re-mounted
|
|||
+due to application accesses triggered by the expire itself.
|
|||
+.TP
|
|||
.I slave \fPor\fI private |
|||
This option allows mount propagation of bind mounts to be set to |
|||
either \fIslave\fP or \fIprivate\fP. This option may be needed when using |
|||
diff --git a/modules/mount_autofs.c b/modules/mount_autofs.c
|
|||
index cd0631b8..72e1aba4 100644
|
|||
--- a/modules/mount_autofs.c
|
|||
+++ b/modules/mount_autofs.c
|
|||
@@ -57,6 +57,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name,
|
|||
int nobind = ap->flags & MOUNT_FLAG_NOBIND; |
|||
int ghost = ap->flags & MOUNT_FLAG_GHOST; |
|||
int symlnk = ap->flags & MOUNT_FLAG_SYMLINK; |
|||
+ int strictexpire = ap->flags & MOUNT_FLAG_STRICTEXPIRE;
|
|||
time_t timeout = get_exp_timeout(ap, ap->entry->maps); |
|||
unsigned logopt = ap->logopt; |
|||
struct map_type_info *info; |
|||
@@ -131,6 +132,8 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name,
|
|||
ghost = 1; |
|||
else if (_strncmp("symlink", cp, 7) == 0) |
|||
symlnk = 1; |
|||
+ else if (_strncmp("strictexpire", cp, 12) == 0)
|
|||
+ strictexpire = 1;
|
|||
else if (_strncmp("hosts", cp, 5) == 0) |
|||
hosts = 1; |
|||
else if (_strncmp("timeout=", cp, 8) == 0) { |
|||
@@ -173,6 +176,8 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name,
|
|||
nap->parent = ap; |
|||
if (symlnk) |
|||
nap->flags |= MOUNT_FLAG_SYMLINK; |
|||
+ if (strictexpire)
|
|||
+ nap->flags |= MOUNT_FLAG_STRICTEXPIRE;
|
|||
|
|||
if (hosts) |
|||
argc = 0; |
@ -0,0 +1,52 @@ |
|||
autofs-5.1.5 - fix hesiod string check in master_parse() |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
When map source is specified in a master map entry, checking if |
|||
map type is hesiod in master_parse() will generate a SEGV if a |
|||
parser type is not also present becuase tmp will be NULL in this |
|||
case. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
lib/master_parse.y | 8 ++++---- |
|||
2 files changed, 5 insertions(+), 4 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index f671dc52..76da2ee4 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -1,5 +1,6 @@
|
|||
xx/xx/2019 autofs-5.1.6 |
|||
- support strictexpire mount option. |
|||
+- fix hesiod string check in master_parse().
|
|||
|
|||
30/10/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
diff --git a/lib/master_parse.y b/lib/master_parse.y
|
|||
index 8fe8b128..f817f739 100644
|
|||
--- a/lib/master_parse.y
|
|||
+++ b/lib/master_parse.y
|
|||
@@ -173,8 +173,8 @@ line:
|
|||
if ((tmp = strchr($2, ','))) |
|||
*tmp++ = '\0'; |
|||
#ifndef WITH_HESIOD |
|||
- /* Map type or or map type parser is hesiod */
|
|||
- if (!strcmp($2, "hesiod") || !strcmp(tmp, "hesiod")) {
|
|||
+ /* Map type or map type parser is hesiod */
|
|||
+ if (!strcmp($2, "hesiod") || (tmp && !strcmp(tmp, "hesiod"))) {
|
|||
master_error("hesiod support not built in"); |
|||
local_free_vars(); |
|||
YYABORT; |
|||
@@ -362,8 +362,8 @@ map: PATH
|
|||
if ((tmp = strchr($1, ','))) |
|||
*tmp++ = '\0'; |
|||
#ifndef WITH_HESIOD |
|||
- /* Map type or or map type parser is hesiod */
|
|||
- if (!strcmp($1, "hesiod") || !strcmp(tmp, "hesiod")) {
|
|||
+ /* Map type or map type parser is hesiod */
|
|||
+ if (!strcmp($1, "hesiod") || (tmp && !strcmp(tmp, "hesiod"))) {
|
|||
master_error("hesiod support not built in"); |
|||
local_free_vars(); |
|||
YYABORT; |
@ -0,0 +1,234 @@ |
|||
autofs-5.1.5 - log mount call arguments if mount_verbose is set |
|||
|
|||
From: Lars R. Damerow <lars@pixar.com> |
|||
|
|||
Override the debug log only setting if mount_verbose is set so that |
|||
mount parameter information is logged on mount. |
|||
|
|||
Signed-off-by: Lars R. Damerow <lars@pixar.com> |
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
modules/mount_afs.c | 6 +++++- |
|||
modules/mount_bind.c | 10 +++++++--- |
|||
modules/mount_ext2.c | 16 ++++++++++------ |
|||
modules/mount_generic.c | 14 +++++++++----- |
|||
modules/mount_nfs.c | 29 +++++++++++++++++------------ |
|||
6 files changed, 49 insertions(+), 27 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index ee7deda4..5650e73b 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -5,6 +5,7 @@ xx/xx/2019 autofs-5.1.6
|
|||
- use malloc(3) in spawn.c. |
|||
- add mount_verbose configuration option. |
|||
- optionally log mount requestor process info. |
|||
+- log mount call arguments if mount_verbose is set.
|
|||
|
|||
30/10/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
diff --git a/modules/mount_afs.c b/modules/mount_afs.c
|
|||
index 2a776bd2..ef4e04da 100644
|
|||
--- a/modules/mount_afs.c
|
|||
+++ b/modules/mount_afs.c
|
|||
@@ -37,10 +37,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
char dest[PATH_MAX + 1]; |
|||
size_t r_len = strlen(root); |
|||
size_t d_len = r_len + name_len + 2; |
|||
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
|||
|
|||
if (ap->flags & MOUNT_FLAG_REMOUNT) |
|||
return 0; |
|||
|
|||
+ if (defaults_get_mount_verbose())
|
|||
+ mountlog = &log_info;
|
|||
+
|
|||
if (d_len > PATH_MAX) |
|||
return 1; |
|||
|
|||
@@ -53,7 +57,7 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
if (dest[strlen(dest)-1] == '/') |
|||
dest[strlen(dest)-1] = '\0'; |
|||
|
|||
- debug(ap->logopt, MODPREFIX "mounting AFS %s -> %s", dest, what);
|
|||
+ mountlog(ap->logopt, MODPREFIX "mounting AFS %s -> %s", dest, what);
|
|||
|
|||
return symlink(what, dest); /* Try it. If it fails, return the error. */ |
|||
} |
|||
diff --git a/modules/mount_bind.c b/modules/mount_bind.c
|
|||
index b64cdccc..9cba0d7a 100644
|
|||
--- a/modules/mount_bind.c
|
|||
+++ b/modules/mount_bind.c
|
|||
@@ -81,10 +81,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
int err; |
|||
int i, len; |
|||
int symlnk = (*name != '/' && (ap->flags & MOUNT_FLAG_SYMLINK)); |
|||
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
|||
|
|||
if (ap->flags & MOUNT_FLAG_REMOUNT) |
|||
return 0; |
|||
|
|||
+ if (defaults_get_mount_verbose())
|
|||
+ mountlog = &log_info;
|
|||
+
|
|||
/* Extract "symlink" pseudo-option which forces local filesystems |
|||
* to be symlinked instead of bound. |
|||
*/ |
|||
@@ -164,9 +168,9 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
if (!status) |
|||
existed = 0; |
|||
|
|||
- debug(ap->logopt, MODPREFIX
|
|||
- "calling mount --bind -o %s %s %s",
|
|||
- options, what, fullpath);
|
|||
+ mountlog(ap->logopt, MODPREFIX
|
|||
+ "calling mount --bind -o %s %s %s",
|
|||
+ options, what, fullpath);
|
|||
|
|||
err = spawn_bind_mount(ap->logopt, "-o", |
|||
options, what, fullpath, NULL); |
|||
diff --git a/modules/mount_ext2.c b/modules/mount_ext2.c
|
|||
index 3bbea95a..eb28b06c 100644
|
|||
--- a/modules/mount_ext2.c
|
|||
+++ b/modules/mount_ext2.c
|
|||
@@ -47,10 +47,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
int err, ro = 0; |
|||
const char *fsck_prog; |
|||
int len, status, existed = 1; |
|||
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
|||
|
|||
if (ap->flags & MOUNT_FLAG_REMOUNT) |
|||
return 0; |
|||
|
|||
+ if (defaults_get_mount_verbose())
|
|||
+ mountlog = &log_info;
|
|||
+
|
|||
/* Root offset of multi-mount */ |
|||
len = strlen(root); |
|||
if (root[len - 1] == '/') { |
|||
@@ -121,15 +125,15 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
} |
|||
|
|||
if (options) { |
|||
- debug(ap->logopt, MODPREFIX
|
|||
- "calling mount -t %s -o %s %s %s",
|
|||
- fstype, options, what, fullpath);
|
|||
+ mountlog(ap->logopt, MODPREFIX
|
|||
+ "calling mount -t %s -o %s %s %s",
|
|||
+ fstype, options, what, fullpath);
|
|||
err = spawn_mount(ap->logopt, "-t", fstype, |
|||
"-o", options, what, fullpath, NULL); |
|||
} else { |
|||
- debug(ap->logopt,
|
|||
- MODPREFIX "calling mount -t %s %s %s",
|
|||
- fstype, what, fullpath);
|
|||
+ mountlog(ap->logopt,
|
|||
+ MODPREFIX "calling mount -t %s %s %s",
|
|||
+ fstype, what, fullpath);
|
|||
err = spawn_mount(ap->logopt, "-t", fstype, what, fullpath, NULL); |
|||
} |
|||
|
|||
diff --git a/modules/mount_generic.c b/modules/mount_generic.c
|
|||
index b1a3adbf..cf531145 100644
|
|||
--- a/modules/mount_generic.c
|
|||
+++ b/modules/mount_generic.c
|
|||
@@ -46,10 +46,14 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
char buf[MAX_ERR_BUF]; |
|||
int err; |
|||
int len, status, existed = 1; |
|||
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
|||
|
|||
if (ap->flags & MOUNT_FLAG_REMOUNT) |
|||
return 0; |
|||
|
|||
+ if (defaults_get_mount_verbose())
|
|||
+ mountlog = &log_info;
|
|||
+
|
|||
/* Root offset of multi-mount */ |
|||
len = strlen(root); |
|||
if (root[len - 1] == '/') { |
|||
@@ -80,15 +84,15 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
existed = 0; |
|||
|
|||
if (options && options[0]) { |
|||
- debug(ap->logopt,
|
|||
- MODPREFIX "calling mount -t %s -o %s %s %s",
|
|||
- fstype, options, what, fullpath);
|
|||
+ mountlog(ap->logopt,
|
|||
+ MODPREFIX "calling mount -t %s -o %s %s %s",
|
|||
+ fstype, options, what, fullpath);
|
|||
|
|||
err = spawn_mount(ap->logopt, "-t", fstype, |
|||
"-o", options, what, fullpath, NULL); |
|||
} else { |
|||
- debug(ap->logopt, MODPREFIX "calling mount -t %s %s %s",
|
|||
- fstype, what, fullpath);
|
|||
+ mountlog(ap->logopt, MODPREFIX "calling mount -t %s %s %s",
|
|||
+ fstype, what, fullpath);
|
|||
err = spawn_mount(ap->logopt, "-t", fstype, what, fullpath, NULL); |
|||
} |
|||
|
|||
diff --git a/modules/mount_nfs.c b/modules/mount_nfs.c
|
|||
index 295c4a5d..4e3e703f 100644
|
|||
--- a/modules/mount_nfs.c
|
|||
+++ b/modules/mount_nfs.c
|
|||
@@ -77,13 +77,17 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
int port = -1; |
|||
int ro = 0; /* Set if mount bind should be read-only */ |
|||
int rdma = 0; |
|||
+ void (*mountlog)(unsigned int, const char*, ...) = &log_debug;
|
|||
|
|||
if (ap->flags & MOUNT_FLAG_REMOUNT) |
|||
return 0; |
|||
|
|||
- debug(ap->logopt,
|
|||
- MODPREFIX "root=%s name=%s what=%s, fstype=%s, options=%s",
|
|||
- root, name, what, fstype, options);
|
|||
+ if (defaults_get_mount_verbose())
|
|||
+ mountlog = &log_info;
|
|||
+
|
|||
+ mountlog(ap->logopt,
|
|||
+ MODPREFIX "root=%s name=%s what=%s, fstype=%s, options=%s",
|
|||
+ root, name, what, fstype, options);
|
|||
|
|||
mount_default_proto = defaults_get_mount_nfs_default_proto(); |
|||
vers = NFS_VERS_DEFAULT | NFS_PROTO_DEFAULT; |
|||
@@ -203,9 +207,9 @@ int mount_mount(struct autofs_point *ap, const char *root, const char *name, int
|
|||
if ((vers & NFS_PROTO_MASK) == 0) |
|||
vers |= NFS_PROTO_MASK; |
|||
|
|||
- debug(ap->logopt, MODPREFIX
|
|||
- "nfs options=\"%s\", nobind=%d, nosymlink=%d, ro=%d",
|
|||
- nfsoptions, nobind, nosymlink, ro);
|
|||
+ mountlog(ap->logopt, MODPREFIX
|
|||
+ "nfs options=\"%s\", nobind=%d, nosymlink=%d, ro=%d",
|
|||
+ nfsoptions, nobind, nosymlink, ro);
|
|||
} |
|||
|
|||
if (!parse_location(ap->logopt, &hosts, what, flags)) { |
|||
@@ -379,17 +383,18 @@ dont_probe:
|
|||
} |
|||
|
|||
if (nfsoptions && *nfsoptions) { |
|||
- debug(ap->logopt,
|
|||
- MODPREFIX "calling mount -t %s " SLOPPY
|
|||
- "-o %s %s %s", fstype, nfsoptions, loc, fullpath);
|
|||
+ mountlog(ap->logopt,
|
|||
+ MODPREFIX "calling mount -t %s " SLOPPY
|
|||
+ "-o %s %s %s", fstype, nfsoptions, loc,
|
|||
+ fullpath);
|
|||
|
|||
err = spawn_mount(ap->logopt, |
|||
"-t", fstype, SLOPPYOPT "-o", |
|||
nfsoptions, loc, fullpath, NULL); |
|||
} else { |
|||
- debug(ap->logopt,
|
|||
- MODPREFIX "calling mount -t %s %s %s",
|
|||
- fstype, loc, fullpath);
|
|||
+ mountlog(ap->logopt,
|
|||
+ MODPREFIX "calling mount -t %s %s %s",
|
|||
+ fstype, loc, fullpath);
|
|||
err = spawn_mount(ap->logopt, |
|||
"-t", fstype, loc, fullpath, NULL); |
|||
} |
@ -0,0 +1,171 @@ |
|||
autofs-5.1.5 - optionally log mount requestor process info |
|||
|
|||
From: Lars R. Damerow <lars@pixar.com> |
|||
|
|||
This information can be helpful to determine who or what is making |
|||
particular mount requests, especially when used in conjunction with |
|||
the use_mount_request_log_id option. |
|||
|
|||
Signed-off-by: Lars R. Damerow <lars@pixar.com> |
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/direct.c | 6 ++++++ |
|||
daemon/indirect.c | 6 ++++++ |
|||
include/log.h | 2 ++ |
|||
lib/log.c | 39 +++++++++++++++++++++++++++++++++++++++ |
|||
man/autofs.conf.5.in | 3 ++- |
|||
redhat/autofs.conf.default.in | 4 +++- |
|||
samples/autofs.conf.default.in | 4 +++- |
|||
8 files changed, 62 insertions(+), 3 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index c2a0c7f1..ee7deda4 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -4,6 +4,7 @@ xx/xx/2019 autofs-5.1.6
|
|||
- add NULL check for get_addr_string() return. |
|||
- use malloc(3) in spawn.c. |
|||
- add mount_verbose configuration option. |
|||
+- optionally log mount requestor process info.
|
|||
|
|||
30/10/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
diff --git a/daemon/direct.c b/daemon/direct.c
|
|||
index 9c61c4b4..4f468563 100644
|
|||
--- a/daemon/direct.c
|
|||
+++ b/daemon/direct.c
|
|||
@@ -1242,6 +1242,12 @@ static void *do_mount_direct(void *arg)
|
|||
|
|||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state); |
|||
|
|||
+ if (defaults_get_mount_verbose()) {
|
|||
+ pid_t ppid = log_pidinfo(ap, mt.pid, "requestor");
|
|||
+ if (ppid > 0)
|
|||
+ log_pidinfo(ap, ppid, "parent");
|
|||
+ }
|
|||
+
|
|||
status = fstat(mt.ioctlfd, &st); |
|||
if (status == -1) { |
|||
error(ap->logopt, |
|||
diff --git a/daemon/indirect.c b/daemon/indirect.c
|
|||
index d0724293..9ccbc038 100644
|
|||
--- a/daemon/indirect.c
|
|||
+++ b/daemon/indirect.c
|
|||
@@ -758,6 +758,12 @@ static void *do_mount_indirect(void *arg)
|
|||
|
|||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &state); |
|||
|
|||
+ if (defaults_get_mount_verbose()) {
|
|||
+ pid_t ppid = log_pidinfo(ap, mt.pid, "requestor");
|
|||
+ if (ppid > 0)
|
|||
+ log_pidinfo(ap, ppid, "parent");
|
|||
+ }
|
|||
+
|
|||
len = ncat_path(buf, sizeof(buf), ap->path, mt.name, mt.len); |
|||
if (!len) { |
|||
crit(ap->logopt, "path to be mounted is to long"); |
|||
diff --git a/include/log.h b/include/log.h
|
|||
index c9b17b3c..69eed96b 100644
|
|||
--- a/include/log.h
|
|||
+++ b/include/log.h
|
|||
@@ -46,6 +46,8 @@ extern void log_crit(unsigned, const char* msg, ...);
|
|||
extern void log_debug(unsigned int, const char* msg, ...); |
|||
extern void logmsg(const char* msg, ...); |
|||
|
|||
+extern pid_t log_pidinfo(struct autofs_point *ap, pid_t pid, char *label);
|
|||
+
|
|||
#define debug(opt, msg, args...) \ |
|||
do { log_debug(opt, "%s: " msg, __FUNCTION__, ##args); } while (0) |
|||
|
|||
diff --git a/lib/log.c b/lib/log.c
|
|||
index ca771d72..0cb47d7e 100644
|
|||
--- a/lib/log.c
|
|||
+++ b/lib/log.c
|
|||
@@ -325,3 +325,42 @@ void log_to_stderr(void)
|
|||
|
|||
return; |
|||
} |
|||
+
|
|||
+pid_t log_pidinfo(struct autofs_point *ap, pid_t pid, char *label) {
|
|||
+ char buf[PATH_MAX + 1] = "";
|
|||
+ FILE *statfile;
|
|||
+
|
|||
+ pid_t tgid, ppid;
|
|||
+ int uid, euid, gid, egid;
|
|||
+ char comm[64] = "";
|
|||
+
|
|||
+ sprintf(buf, "/proc/%d/status", pid);
|
|||
+ statfile = fopen(buf, "r");
|
|||
+ if (statfile == NULL) {
|
|||
+ info(ap->logopt, "pidinfo %s: failed to open %s", label, buf);
|
|||
+ return -1;
|
|||
+ }
|
|||
+
|
|||
+ while (fgets(buf, sizeof(buf), statfile) != NULL) {
|
|||
+ if (strncmp(buf, "Name:", 5) == 0) {
|
|||
+ sscanf(buf, "Name:\t%s", (char *) &comm);
|
|||
+ } else if (strncmp(buf, "Tgid:", 5) == 0) {
|
|||
+ sscanf(buf, "Tgid:\t%d", (int *) &tgid);
|
|||
+ } else if (strncmp(buf, "PPid:", 5) == 0) {
|
|||
+ sscanf(buf, "PPid:\t%d", (int *) &ppid);
|
|||
+ } else if (strncmp(buf, "Uid:", 4) == 0) {
|
|||
+ sscanf(buf,
|
|||
+ "Uid:\t%d\t%d", (int *) &uid, (int *) &euid);
|
|||
+ } else if (strncmp(buf, "Gid:", 4) == 0) {
|
|||
+ sscanf(buf,
|
|||
+ "Gid:\t%d\t%d", (int *) &gid, (int *) &egid);
|
|||
+ }
|
|||
+ }
|
|||
+ fclose(statfile);
|
|||
+
|
|||
+ info(ap->logopt,
|
|||
+ "pidinfo %s: pid:%d comm:%s tgid:%d uid:%d euid:%d gid:%d egid:%d",
|
|||
+ label, pid, comm, tgid, uid, euid, gid, egid);
|
|||
+
|
|||
+ return ppid;
|
|||
+}
|
|||
diff --git a/man/autofs.conf.5.in b/man/autofs.conf.5.in
|
|||
index 31136e2e..95ff7dd0 100644
|
|||
--- a/man/autofs.conf.5.in
|
|||
+++ b/man/autofs.conf.5.in
|
|||
@@ -43,7 +43,8 @@ setting.
|
|||
.TP |
|||
.B mount_verbose |
|||
.br |
|||
-Use the verbose flag when spawning mount(8) (program default "no").
|
|||
+Use the verbose flag when spawning mount(8), and log some process info
|
|||
+about the requestor and its parent (program default "no").
|
|||
.TP |
|||
.B mount_wait |
|||
.br |
|||
diff --git a/redhat/autofs.conf.default.in b/redhat/autofs.conf.default.in
|
|||
index 7949f51a..4b89a5f7 100644
|
|||
--- a/redhat/autofs.conf.default.in
|
|||
+++ b/redhat/autofs.conf.default.in
|
|||
@@ -26,7 +26,9 @@ timeout = 300
|
|||
# |
|||
#negative_timeout = 60 |
|||
# |
|||
-# mount_verbose - use the -v flag when calling mount(8).
|
|||
+# mount_verbose - use the -v flag when calling mount(8) and log some
|
|||
+# process information about the requestor and its
|
|||
+# parent.
|
|||
# |
|||
#mount_verbose = no |
|||
# |
|||
diff --git a/samples/autofs.conf.default.in b/samples/autofs.conf.default.in
|
|||
index d33625f1..2f155111 100644
|
|||
--- a/samples/autofs.conf.default.in
|
|||
+++ b/samples/autofs.conf.default.in
|
|||
@@ -26,7 +26,9 @@ timeout = 300
|
|||
# |
|||
#negative_timeout = 60 |
|||
# |
|||
-# mount_verbose - use the -v flag when calling mount(8).
|
|||
+# mount_verbose - use the -v flag when calling mount(8) and log some
|
|||
+# process information about the requestor and its
|
|||
+# parent.
|
|||
# |
|||
#mount_verbose = no |
|||
# |
@ -0,0 +1,165 @@ |
|||
autofs-5.1.5 - use malloc(3) in spawn.c |
|||
|
|||
From: Ian Kent <raven@themaw.net> |
|||
|
|||
Use malloc(3) in spawn.c functions instead of alloca(3) as a failure |
|||
return for this function is undefined. |
|||
|
|||
Signed-off-by: Ian Kent <raven@themaw.net> |
|||
---
|
|||
CHANGELOG | 1 + |
|||
daemon/spawn.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------ |
|||
2 files changed, 45 insertions(+), 6 deletions(-) |
|||
|
|||
diff --git a/CHANGELOG b/CHANGELOG
|
|||
index e71e913a..b3c3b3b9 100644
|
|||
--- a/CHANGELOG
|
|||
+++ b/CHANGELOG
|
|||
@@ -2,6 +2,7 @@ xx/xx/2019 autofs-5.1.6
|
|||
- support strictexpire mount option. |
|||
- fix hesiod string check in master_parse(). |
|||
- add NULL check for get_addr_string() return. |
|||
+- use malloc(3) in spawn.c.
|
|||
|
|||
30/10/2018 autofs-5.1.5 |
|||
- fix flag file permission. |
|||
diff --git a/daemon/spawn.c b/daemon/spawn.c
|
|||
index dbbca7fa..2ab5c46f 100644
|
|||
--- a/daemon/spawn.c
|
|||
+++ b/daemon/spawn.c
|
|||
@@ -521,22 +521,33 @@ int spawnv(unsigned logopt, const char *prog, const char *const *argv)
|
|||
int spawnl(unsigned logopt, const char *prog, ...) |
|||
{ |
|||
va_list arg; |
|||
- int argc;
|
|||
+ int argc, ret;
|
|||
char **argv, **p; |
|||
+ unsigned int argv_len;
|
|||
|
|||
va_start(arg, prog); |
|||
for (argc = 1; va_arg(arg, char *); argc++); |
|||
va_end(arg); |
|||
|
|||
- if (!(argv = alloca(sizeof(char *) * argc)))
|
|||
+ argv_len = sizeof(char *) * (argc + 1);
|
|||
+ argv = malloc(argv_len);
|
|||
+ if (!argv) {
|
|||
+ char buf[MAX_ERR_BUF];
|
|||
+ char *estr = strerror_r(errno, buf, sizeof(buf));
|
|||
+ crit(logopt, "malloc: %s", estr);
|
|||
return -1; |
|||
+ }
|
|||
+ memset(argv, 0, argv_len);
|
|||
|
|||
va_start(arg, prog); |
|||
p = argv; |
|||
while ((*p++ = va_arg(arg, char *))); |
|||
va_end(arg); |
|||
|
|||
- return do_spawn(logopt, -1, SPAWN_OPT_NONE, prog, (const char **) argv);
|
|||
+ ret = do_spawn(logopt, -1, SPAWN_OPT_NONE, prog, (const char **) argv);
|
|||
+ free(argv);
|
|||
+
|
|||
+ return ret;
|
|||
} |
|||
|
|||
int spawn_mount(unsigned logopt, ...) |
|||
@@ -554,6 +565,7 @@ int spawn_mount(unsigned logopt, ...)
|
|||
int update_mtab = 1, ret, printed = 0; |
|||
unsigned int wait = defaults_get_mount_wait(); |
|||
char buf[PATH_MAX + 1]; |
|||
+ unsigned int argv_len;
|
|||
|
|||
/* If we use mount locking we can't validate the location */ |
|||
#ifdef ENABLE_MOUNT_LOCKING |
|||
@@ -579,8 +591,15 @@ int spawn_mount(unsigned logopt, ...)
|
|||
} |
|||
|
|||
/* Alloc 1 extra slot in case we need to use the "-f" option */ |
|||
- if (!(argv = alloca(sizeof(char *) * (argc + 2))))
|
|||
+ argv_len = sizeof(char *) * (argc + 2);
|
|||
+ argv = malloc(argv_len);
|
|||
+ if (!argv) {
|
|||
+ char buf[MAX_ERR_BUF];
|
|||
+ char *estr = strerror_r(errno, buf, sizeof(buf));
|
|||
+ crit(logopt, "malloc: %s", estr);
|
|||
return -1; |
|||
+ }
|
|||
+ memset(argv, 0, argv_len);
|
|||
|
|||
argv[0] = arg0; |
|||
|
|||
@@ -655,6 +674,7 @@ int spawn_mount(unsigned logopt, ...)
|
|||
umount(argv[argc]); |
|||
ret = MNT_FORCE_FAIL; |
|||
} |
|||
+ free(argv);
|
|||
|
|||
return ret; |
|||
} |
|||
@@ -683,6 +703,7 @@ int spawn_bind_mount(unsigned logopt, ...)
|
|||
int update_mtab = 1, ret, printed = 0; |
|||
unsigned int wait = defaults_get_mount_wait(); |
|||
char buf[PATH_MAX + 1]; |
|||
+ unsigned int argv_len;
|
|||
|
|||
/* If we use mount locking we can't validate the location */ |
|||
#ifdef ENABLE_MOUNT_LOCKING |
|||
@@ -711,8 +732,15 @@ int spawn_bind_mount(unsigned logopt, ...)
|
|||
} |
|||
} |
|||
|
|||
- if (!(argv = alloca(sizeof(char *) * (argc + 2))))
|
|||
+ argv_len = sizeof(char *) * (argc + 2);
|
|||
+ argv = malloc(argv_len);
|
|||
+ if (!argv) {
|
|||
+ char buf[MAX_ERR_BUF];
|
|||
+ char *estr = strerror_r(errno, buf, sizeof(buf));
|
|||
+ crit(logopt, "malloc: %s", estr);
|
|||
return -1; |
|||
+ }
|
|||
+ memset(argv, 0, argv_len);
|
|||
|
|||
argv[0] = arg0; |
|||
argv[1] = bind; |
|||
@@ -774,6 +802,7 @@ int spawn_bind_mount(unsigned logopt, ...)
|
|||
umount(argv[argc]); |
|||
ret = MNT_FORCE_FAIL; |
|||
} |
|||
+ free(argv);
|
|||
|
|||
return ret; |
|||
} |
|||
@@ -796,6 +825,7 @@ int spawn_umount(unsigned logopt, ...)
|
|||
int update_mtab = 1, ret, printed = 0; |
|||
unsigned int wait = defaults_get_umount_wait(); |
|||
char buf[PATH_MAX + 1]; |
|||
+ unsigned int argv_len;
|
|||
|
|||
#ifdef ENABLE_MOUNT_LOCKING |
|||
options = SPAWN_OPT_LOCK; |
|||
@@ -821,8 +851,15 @@ int spawn_umount(unsigned logopt, ...)
|
|||
if (arg_c) |
|||
argc++;; |
|||
|
|||
- if (!(argv = alloca(sizeof(char *) * (argc + 1))))
|
|||
+ argv_len = sizeof(char *) * (argc + 1);
|
|||
+ argv = malloc(argv_len);
|
|||
+ if (!argv) {
|
|||
+ char buf[MAX_ERR_BUF];
|
|||
+ char *estr = strerror_r(errno, buf, sizeof(buf));
|
|||
+ crit(logopt, "malloc: %s", estr);
|
|||
return -1; |
|||
+ }
|
|||
+ memset(argv, 0, argv_len);
|
|||
|
|||
p = argv; |
|||
*p++ = arg0; |
|||
@@ -870,6 +907,7 @@ int spawn_umount(unsigned logopt, ...)
|
|||
"and /etc/mtab will differ"); |
|||
ret = 0; |
|||
} |
|||
+ free(argv);
|
|||
|
|||
return ret; |
|||
} |
@ -0,0 +1,9 @@ |
|||
autofs-5.1.5-add-strictexpire-mount-option.patch |
|||
autofs-5.1.5-fix-hesiod-string-check-in-master_parse.patch |
|||
autofs-5.1.5-add-NULL-check-for-get_addr_string-return.patch |
|||
autofs-5.1.5-use-malloc-in-spawn_c.patch |
|||
autofs-5.1.5-add-mount_verbose-configuration-option.patch |
|||
autofs-5.1.5-optionally-log-mount-requestor-process-info.patch |
|||
autofs-5.1.5-log-mount-call-arguments-if-mount_verbose-is-set.patch |
|||
autofs-5.1.5-add-ignore-mount-option.patch |
|||
autofs-5.1.5-Fix-NFS-mount-from-IPv6-addresses.patch |
Loading…
Reference in new issue