From c938c601dd2c194d86be5196c4851069b7849b48 Mon Sep 17 00:00:00 2001 From: Ian Kent Date: Wed, 30 Dec 2015 17:26:11 +0800 Subject: [PATCH 1/5] - update to official version 6.2 source plus add bug fixes for the internal NFSv3 server. --- .gitignore | 1 + ...debug-log-trace-to-NFSv3-readdirplus.patch | 25 + ...uto-generated-macros-in-aclinlude_m4.patch | 805 ++---------------- ...d-return-on-non-existent-mount-point.patch | 32 + ...v3-lookup-dir-attribute-return-value.patch | 76 ++ ...eaddir-post_op_dir-attributes-return.patch | 53 ++ ..._or_rmdir3-post_op-attributes-return.patch | 62 ++ am-utils-6.2.0-1.git.bb13dea6-ylwrap.patch | 36 - am-utils.spec | 44 +- sources | 2 +- 10 files changed, 364 insertions(+), 772 deletions(-) create mode 100644 am-utils-6.2-add-debug-log-trace-to-NFSv3-readdirplus.patch rename am-utils-6.2.0-1.git.bb13dea6-dont-include-auto-generated-macros-in-aclinlude_m4.patch => am-utils-6.2-dont-include-auto-generated-macros-in-aclinlude_m4.patch (91%) create mode 100644 am-utils-6.2-fix-NFSv3-access-method-return-on-non-existent-mount-point.patch create mode 100644 am-utils-6.2-fix-NFSv3-lookup-dir-attribute-return-value.patch create mode 100644 am-utils-6.2-fix-NFSv3-readdir-post_op_dir-attributes-return.patch create mode 100644 am-utils-6.2-fix-NFSv3-unlink3_or_rmdir3-post_op-attributes-return.patch delete mode 100644 am-utils-6.2.0-1.git.bb13dea6-ylwrap.patch diff --git a/.gitignore b/.gitignore index 9ee960c..6d683a2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ am-utils-6.1.5.tar.gz *.log *.rpm /am-utils-6.2.0-1.git.bb13dea6.tar.gz +/am-utils-6.2.tar.gz diff --git a/am-utils-6.2-add-debug-log-trace-to-NFSv3-readdirplus.patch b/am-utils-6.2-add-debug-log-trace-to-NFSv3-readdirplus.patch new file mode 100644 index 0000000..41e23e3 --- /dev/null +++ b/am-utils-6.2-add-debug-log-trace-to-NFSv3-readdirplus.patch @@ -0,0 +1,25 @@ +am-utils-6.2 - add debug log trace to NFSv3 readdirplus + +From: Ian Kent + +Add log trace print to NFSv3 readdirplus for debuging purposes. + +Signed-off-by: Ian Kent +--- + amd/nfs_subr.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c +index 30effba..ef07a4a 100644 +--- a/amd/nfs_subr.c ++++ b/amd/nfs_subr.c +@@ -1642,6 +1642,9 @@ am_nfs3_readdirplus_3_svc(am_READDIRPLUS3args *argp, struct svc_req *rqstp) + am_node *mp; + int retry; + ++ if (amuDebug(D_TRACE)) ++ plog(XLOG_DEBUG, "readdirplus_3:"); ++ + mp = fh3_to_mp3(dir, &retry, VLOOK_CREATE); + if (mp == NULL) { + if (retry < 0) { diff --git a/am-utils-6.2.0-1.git.bb13dea6-dont-include-auto-generated-macros-in-aclinlude_m4.patch b/am-utils-6.2-dont-include-auto-generated-macros-in-aclinlude_m4.patch similarity index 91% rename from am-utils-6.2.0-1.git.bb13dea6-dont-include-auto-generated-macros-in-aclinlude_m4.patch rename to am-utils-6.2-dont-include-auto-generated-macros-in-aclinlude_m4.patch index 1c68146..fef63f9 100644 --- a/am-utils-6.2.0-1.git.bb13dea6-dont-include-auto-generated-macros-in-aclinlude_m4.patch +++ b/am-utils-6.2-dont-include-auto-generated-macros-in-aclinlude_m4.patch @@ -1,35 +1,33 @@ -am-utils-6.2.0-1.git.bb13dea6 - dont include auto generated macros in aclinluder.m4 +Move libtool macro functions from m4/macros to m4 and delete -From: Ian Kent +From: Christos Zoulas -am-utils-6.2 - dont include auto generated macros in aclinlude.m4 - -libtool-2.4.4 causes the am-utils build to not produce a working install. - -To fix this (for future libtool rebases) put system macros into -$(top_srcdir)/m4 and maintainer-defined macros into $(top_srcdir)/m4/macros. - -Then, bootstrap script generates acinclude.m4 only from maintainer-defined -macros. - -Signed-off-by: Ian Kent +the repository copies. Makes am-utils work with libtool-2.4.4 +and fixes the serial number warnings (raven at themaw.net) --- - Makefile.am | 2 - configure.ac | 2 - m4/macros/libtool.m4 | 7982 ---------------------------------------------- - m4/macros/ltoptions.m4 | 384 -- - m4/macros/ltsugar.m4 | 123 - - m4/macros/ltversion.m4 | 23 - m4/macros/lt~obsolete.m4 | 98 - - 7 files changed, 2 insertions(+), 8612 deletions(-) + ChangeLog | 6 + Makefile.am | 2 + configure.ac | 2 + m4/macros/libtool.m4 | 7997 -------------------------------------------------- + 4 files changed, 8 insertions(+), 7999 deletions(-) delete mode 100644 m4/macros/libtool.m4 - delete mode 100644 m4/macros/ltoptions.m4 - delete mode 100644 m4/macros/ltsugar.m4 - delete mode 100644 m4/macros/ltversion.m4 - delete mode 100644 m4/macros/lt~obsolete.m4 +diff --git a/ChangeLog b/ChangeLog +index d996f8e..fd05087 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,9 @@ ++2015-01-17 Christos Zoulas ++ ++ * Move libtool macro functions from m4/macros to m4 and delete ++ the repository copies. Makes am-utils work with libtool-2.4.4 ++ and fixes the serial number warnings (raven at themaw.net) ++ + 2014-10-28 Christos Zoulas + + ******************************************************************* diff --git a/Makefile.am b/Makefile.am -index 01700f8..f9345c1 100644 +index 7e7082d..bae4615 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,7 +6,7 @@ @@ -56,10 +54,10 @@ index 3d1bb00..ce61925 100644 /* diff --git a/m4/macros/libtool.m4 b/m4/macros/libtool.m4 deleted file mode 100644 -index dfb036f..0000000 +index d7c043f..0000000 --- a/m4/macros/libtool.m4 +++ /dev/null -@@ -1,7982 +0,0 @@ +@@ -1,7997 +0,0 @@ -# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, @@ -996,7 +994,7 @@ index dfb036f..0000000 -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` --$RM -r conftest* +-$RM conftest* -])# _LT_COMPILER_BOILERPLATE - - @@ -1374,7 +1372,7 @@ index dfb036f..0000000 - rm -rf conftest* - ;; - --x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext @@ -1386,9 +1384,19 @@ index dfb036f..0000000 - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) -- LD="${LD-ld} -m elf_i386" +- case `/usr/bin/file conftest.o` in +- *x86-64*) +- LD="${LD-ld} -m elf32_x86_64" +- ;; +- *) +- LD="${LD-ld} -m elf_i386" +- ;; +- esac - ;; -- ppc64-*linux*|powerpc64-*linux*) +- powerpc64le-*) +- LD="${LD-ld} -m elf32lppclinux" +- ;; +- powerpc64-*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) @@ -1407,7 +1415,10 @@ index dfb036f..0000000 - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; -- ppc*-*linux*|powerpc*-*linux*) +- powerpcle-*) +- LD="${LD-ld} -m elf64lppc" +- ;; +- powerpc-*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) @@ -1592,7 +1603,7 @@ index dfb036f..0000000 - $2=yes - fi - fi -- $RM -r conftest* +- $RM conftest* -]) - -if test x"[$]$2" = xyes; then @@ -1750,7 +1761,8 @@ index dfb036f..0000000 - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` -- if test -n "$lt_cv_sys_max_cmd_len"; then +- if test -n "$lt_cv_sys_max_cmd_len" && \ +- test undefined != "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else @@ -2067,14 +2079,14 @@ index dfb036f..0000000 - fi - fi - chmod u+w . 2>&AS_MESSAGE_LOG_FD -- $RM -r conftest* +- $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest -- $RM -r conftest* +- $RM conftest* -]) -_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], - [Does compiler simultaneously support -c and -o options?]) @@ -2094,7 +2106,7 @@ index dfb036f..0000000 - # do not overwrite the value of need_locks provided by the user - AC_MSG_CHECKING([if we can lock with hard links]) - hard_links=yes -- $RM -r conftest* +- $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no @@ -2574,17 +2586,6 @@ index dfb036f..0000000 - esac - ;; - --gnu*) -- version_type=linux # correct to gnu/linux during the next big refactor -- need_lib_prefix=no -- need_version=no -- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' -- soname_spec='${libname}${release}${shared_ext}$major' -- shlibpath_var=LD_LIBRARY_PATH -- shlibpath_overrides_runpath=no -- hardcode_into_libs=yes -- ;; -- -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no @@ -2701,7 +2702,7 @@ index dfb036f..0000000 - ;; - -# This must be glibc/ELF. --linux* | k*bsd*-gnu | kopensolaris*-gnu) +-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no @@ -2746,6 +2747,18 @@ index dfb036f..0000000 - dynamic_linker='GNU/Linux ld.so' - ;; - +-netbsdelf*-gnu) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='NetBSD ld.elf_so' +- ;; +- -netbsd*) - version_type=sunos - need_lib_prefix=no @@ -3305,10 +3318,6 @@ index dfb036f..0000000 - fi - ;; - --gnu*) -- lt_cv_deplibs_check_method=pass_all -- ;; -- -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; @@ -3347,11 +3356,11 @@ index dfb036f..0000000 - ;; - -# This must be glibc/ELF. --linux* | k*bsd*-gnu | kopensolaris*-gnu) +-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - --netbsd*) +-netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' - else @@ -3544,7 +3553,7 @@ index dfb036f..0000000 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi -- rm -rf conftest*]) +- rm -f conftest*]) -])# LT_PATH_NM - -# Old names: @@ -3608,7 +3617,7 @@ index dfb036f..0000000 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi -- rm -rf conftest*]) +- rm -f conftest*]) -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi @@ -3784,7 +3793,7 @@ index dfb036f..0000000 - # Check to see that the pipe works correctly. - pipe_works=no - -- rm -rf conftest* +- rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { @@ -4099,7 +4108,7 @@ index dfb036f..0000000 - ;; - esac - ;; -- linux* | k*bsd*-gnu | kopensolaris*-gnu) +- linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - KCC*) - # KAI C++ Compiler @@ -4163,7 +4172,7 @@ index dfb036f..0000000 - ;; - esac - ;; -- netbsd*) +- netbsd* | netbsdelf*-gnu) - ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise @@ -4398,7 +4407,7 @@ index dfb036f..0000000 - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - -- linux* | k*bsd*-gnu | kopensolaris*-gnu) +- linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) @@ -4640,6 +4649,9 @@ index dfb036f..0000000 - ;; - esac - ;; +- linux* | k*bsd*-gnu | gnu*) +- _LT_TAGVAR(link_all_deplibs, $1)=no +- ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; @@ -4702,6 +4714,9 @@ index dfb036f..0000000 - openbsd*) - with_gnu_ld=no - ;; +- linux* | k*bsd*-gnu | gnu*) +- _LT_TAGVAR(link_all_deplibs, $1)=no +- ;; - esac - - _LT_TAGVAR(ld_shlibs, $1)=yes @@ -4923,7 +4938,7 @@ index dfb036f..0000000 - fi - ;; - -- netbsd*) +- netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= @@ -5100,6 +5115,7 @@ index dfb036f..0000000 - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi +- _LT_TAGVAR(link_all_deplibs, $1)=no - else - # not using gcc - if test "$host_cpu" = ia64; then @@ -5404,7 +5420,7 @@ index dfb036f..0000000 - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - -- netbsd*) +- netbsd* | netbsdelf*-gnu) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else @@ -5676,7 +5692,7 @@ index dfb036f..0000000 - # to ld, don't add -lc before -lgcc. - AC_CACHE_CHECK([whether -lc should be explicitly linked in], - [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), -- [$RM -r conftest* +- [$RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then @@ -5703,7 +5719,7 @@ index dfb036f..0000000 - else - cat conftest.err 1>&5 - fi -- $RM -r conftest* +- $RM conftest* - ]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) - ;; @@ -6284,9 +6300,6 @@ index dfb036f..0000000 - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - -- gnu*) -- ;; -- - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes @@ -6448,7 +6461,7 @@ index dfb036f..0000000 - _LT_TAGVAR(inherit_rpath, $1)=yes - ;; - -- linux* | k*bsd*-gnu | kopensolaris*-gnu) +- linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler @@ -8042,655 +8055,3 @@ index dfb036f..0000000 -_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], - [0], [convert $build files to toolchain format])dnl -])# _LT_PATH_CONVERSION_FUNCTIONS -diff --git a/m4/macros/ltoptions.m4 b/m4/macros/ltoptions.m4 -deleted file mode 100644 -index 5d9acd8..0000000 ---- a/m4/macros/ltoptions.m4 -+++ /dev/null -@@ -1,384 +0,0 @@ --# Helper functions for option handling. -*- Autoconf -*- --# --# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, --# Inc. --# Written by Gary V. Vaughan, 2004 --# --# This file is free software; the Free Software Foundation gives --# unlimited permission to copy and/or distribute it, with or without --# modifications, as long as this notice is preserved. -- --# serial 7 ltoptions.m4 -- --# This is to help aclocal find these macros, as it can't see m4_define. --AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) -- -- --# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) --# ------------------------------------------ --m4_define([_LT_MANGLE_OPTION], --[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) -- -- --# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) --# --------------------------------------- --# Set option OPTION-NAME for macro MACRO-NAME, and if there is a --# matching handler defined, dispatch to it. Other OPTION-NAMEs are --# saved as a flag. --m4_define([_LT_SET_OPTION], --[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl --m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), -- _LT_MANGLE_DEFUN([$1], [$2]), -- [m4_warning([Unknown $1 option `$2'])])[]dnl --]) -- -- --# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) --# ------------------------------------------------------------ --# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. --m4_define([_LT_IF_OPTION], --[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) -- -- --# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) --# ------------------------------------------------------- --# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME --# are set. --m4_define([_LT_UNLESS_OPTIONS], --[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), -- [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), -- [m4_define([$0_found])])])[]dnl --m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 --])[]dnl --]) -- -- --# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) --# ---------------------------------------- --# OPTION-LIST is a space-separated list of Libtool options associated --# with MACRO-NAME. If any OPTION has a matching handler declared with --# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about --# the unknown option and exit. --m4_defun([_LT_SET_OPTIONS], --[# Set options --m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), -- [_LT_SET_OPTION([$1], _LT_Option)]) -- --m4_if([$1],[LT_INIT],[ -- dnl -- dnl Simply set some default values (i.e off) if boolean options were not -- dnl specified: -- _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no -- ]) -- _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no -- ]) -- dnl -- dnl If no reference was made to various pairs of opposing options, then -- dnl we run the default mode handler for the pair. For example, if neither -- dnl `shared' nor `disable-shared' was passed, we enable building of shared -- dnl archives by default: -- _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) -- _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) -- _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) -- _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], -- [_LT_ENABLE_FAST_INSTALL]) -- ]) --])# _LT_SET_OPTIONS -- -- --## --------------------------------- ## --## Macros to handle LT_INIT options. ## --## --------------------------------- ## -- --# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) --# ----------------------------------------- --m4_define([_LT_MANGLE_DEFUN], --[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) -- -- --# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) --# ----------------------------------------------- --m4_define([LT_OPTION_DEFINE], --[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl --])# LT_OPTION_DEFINE -- -- --# dlopen --# ------ --LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes --]) -- --AU_DEFUN([AC_LIBTOOL_DLOPEN], --[_LT_SET_OPTION([LT_INIT], [dlopen]) --AC_DIAGNOSE([obsolete], --[$0: Remove this warning and the call to _LT_SET_OPTION when you --put the `dlopen' option into LT_INIT's first parameter.]) --]) -- --dnl aclocal-1.4 backwards compatibility: --dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) -- -- --# win32-dll --# --------- --# Declare package support for building win32 dll's. --LT_OPTION_DEFINE([LT_INIT], [win32-dll], --[enable_win32_dll=yes -- --case $host in --*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) -- AC_CHECK_TOOL(AS, as, false) -- AC_CHECK_TOOL(DLLTOOL, dlltool, false) -- AC_CHECK_TOOL(OBJDUMP, objdump, false) -- ;; --esac -- --test -z "$AS" && AS=as --_LT_DECL([], [AS], [1], [Assembler program])dnl -- --test -z "$DLLTOOL" && DLLTOOL=dlltool --_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl -- --test -z "$OBJDUMP" && OBJDUMP=objdump --_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl --])# win32-dll -- --AU_DEFUN([AC_LIBTOOL_WIN32_DLL], --[AC_REQUIRE([AC_CANONICAL_HOST])dnl --_LT_SET_OPTION([LT_INIT], [win32-dll]) --AC_DIAGNOSE([obsolete], --[$0: Remove this warning and the call to _LT_SET_OPTION when you --put the `win32-dll' option into LT_INIT's first parameter.]) --]) -- --dnl aclocal-1.4 backwards compatibility: --dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) -- -- --# _LT_ENABLE_SHARED([DEFAULT]) --# ---------------------------- --# implement the --enable-shared flag, and supports the `shared' and --# `disable-shared' LT_INIT options. --# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. --m4_define([_LT_ENABLE_SHARED], --[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl --AC_ARG_ENABLE([shared], -- [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], -- [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], -- [p=${PACKAGE-default} -- case $enableval in -- yes) enable_shared=yes ;; -- no) enable_shared=no ;; -- *) -- enable_shared=no -- # Look at the argument we got. We use all the common list separators. -- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," -- for pkg in $enableval; do -- IFS="$lt_save_ifs" -- if test "X$pkg" = "X$p"; then -- enable_shared=yes -- fi -- done -- IFS="$lt_save_ifs" -- ;; -- esac], -- [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) -- -- _LT_DECL([build_libtool_libs], [enable_shared], [0], -- [Whether or not to build shared libraries]) --])# _LT_ENABLE_SHARED -- --LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) --LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) -- --# Old names: --AC_DEFUN([AC_ENABLE_SHARED], --[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) --]) -- --AC_DEFUN([AC_DISABLE_SHARED], --[_LT_SET_OPTION([LT_INIT], [disable-shared]) --]) -- --AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) --AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) -- --dnl aclocal-1.4 backwards compatibility: --dnl AC_DEFUN([AM_ENABLE_SHARED], []) --dnl AC_DEFUN([AM_DISABLE_SHARED], []) -- -- -- --# _LT_ENABLE_STATIC([DEFAULT]) --# ---------------------------- --# implement the --enable-static flag, and support the `static' and --# `disable-static' LT_INIT options. --# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. --m4_define([_LT_ENABLE_STATIC], --[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl --AC_ARG_ENABLE([static], -- [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], -- [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], -- [p=${PACKAGE-default} -- case $enableval in -- yes) enable_static=yes ;; -- no) enable_static=no ;; -- *) -- enable_static=no -- # Look at the argument we got. We use all the common list separators. -- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," -- for pkg in $enableval; do -- IFS="$lt_save_ifs" -- if test "X$pkg" = "X$p"; then -- enable_static=yes -- fi -- done -- IFS="$lt_save_ifs" -- ;; -- esac], -- [enable_static=]_LT_ENABLE_STATIC_DEFAULT) -- -- _LT_DECL([build_old_libs], [enable_static], [0], -- [Whether or not to build static libraries]) --])# _LT_ENABLE_STATIC -- --LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) --LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) -- --# Old names: --AC_DEFUN([AC_ENABLE_STATIC], --[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) --]) -- --AC_DEFUN([AC_DISABLE_STATIC], --[_LT_SET_OPTION([LT_INIT], [disable-static]) --]) -- --AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) --AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) -- --dnl aclocal-1.4 backwards compatibility: --dnl AC_DEFUN([AM_ENABLE_STATIC], []) --dnl AC_DEFUN([AM_DISABLE_STATIC], []) -- -- -- --# _LT_ENABLE_FAST_INSTALL([DEFAULT]) --# ---------------------------------- --# implement the --enable-fast-install flag, and support the `fast-install' --# and `disable-fast-install' LT_INIT options. --# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. --m4_define([_LT_ENABLE_FAST_INSTALL], --[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl --AC_ARG_ENABLE([fast-install], -- [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], -- [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], -- [p=${PACKAGE-default} -- case $enableval in -- yes) enable_fast_install=yes ;; -- no) enable_fast_install=no ;; -- *) -- enable_fast_install=no -- # Look at the argument we got. We use all the common list separators. -- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," -- for pkg in $enableval; do -- IFS="$lt_save_ifs" -- if test "X$pkg" = "X$p"; then -- enable_fast_install=yes -- fi -- done -- IFS="$lt_save_ifs" -- ;; -- esac], -- [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) -- --_LT_DECL([fast_install], [enable_fast_install], [0], -- [Whether or not to optimize for fast installation])dnl --])# _LT_ENABLE_FAST_INSTALL -- --LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) --LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) -- --# Old names: --AU_DEFUN([AC_ENABLE_FAST_INSTALL], --[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) --AC_DIAGNOSE([obsolete], --[$0: Remove this warning and the call to _LT_SET_OPTION when you put --the `fast-install' option into LT_INIT's first parameter.]) --]) -- --AU_DEFUN([AC_DISABLE_FAST_INSTALL], --[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) --AC_DIAGNOSE([obsolete], --[$0: Remove this warning and the call to _LT_SET_OPTION when you put --the `disable-fast-install' option into LT_INIT's first parameter.]) --]) -- --dnl aclocal-1.4 backwards compatibility: --dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) --dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) -- -- --# _LT_WITH_PIC([MODE]) --# -------------------- --# implement the --with-pic flag, and support the `pic-only' and `no-pic' --# LT_INIT options. --# MODE is either `yes' or `no'. If omitted, it defaults to `both'. --m4_define([_LT_WITH_PIC], --[AC_ARG_WITH([pic], -- [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], -- [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], -- [lt_p=${PACKAGE-default} -- case $withval in -- yes|no) pic_mode=$withval ;; -- *) -- pic_mode=default -- # Look at the argument we got. We use all the common list separators. -- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," -- for lt_pkg in $withval; do -- IFS="$lt_save_ifs" -- if test "X$lt_pkg" = "X$lt_p"; then -- pic_mode=yes -- fi -- done -- IFS="$lt_save_ifs" -- ;; -- esac], -- [pic_mode=default]) -- --test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) -- --_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl --])# _LT_WITH_PIC -- --LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) --LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) -- --# Old name: --AU_DEFUN([AC_LIBTOOL_PICMODE], --[_LT_SET_OPTION([LT_INIT], [pic-only]) --AC_DIAGNOSE([obsolete], --[$0: Remove this warning and the call to _LT_SET_OPTION when you --put the `pic-only' option into LT_INIT's first parameter.]) --]) -- --dnl aclocal-1.4 backwards compatibility: --dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) -- --## ----------------- ## --## LTDL_INIT Options ## --## ----------------- ## -- --m4_define([_LTDL_MODE], []) --LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], -- [m4_define([_LTDL_MODE], [nonrecursive])]) --LT_OPTION_DEFINE([LTDL_INIT], [recursive], -- [m4_define([_LTDL_MODE], [recursive])]) --LT_OPTION_DEFINE([LTDL_INIT], [subproject], -- [m4_define([_LTDL_MODE], [subproject])]) -- --m4_define([_LTDL_TYPE], []) --LT_OPTION_DEFINE([LTDL_INIT], [installable], -- [m4_define([_LTDL_TYPE], [installable])]) --LT_OPTION_DEFINE([LTDL_INIT], [convenience], -- [m4_define([_LTDL_TYPE], [convenience])]) -diff --git a/m4/macros/ltsugar.m4 b/m4/macros/ltsugar.m4 -deleted file mode 100644 -index 9000a05..0000000 ---- a/m4/macros/ltsugar.m4 -+++ /dev/null -@@ -1,123 +0,0 @@ --# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- --# --# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. --# Written by Gary V. Vaughan, 2004 --# --# This file is free software; the Free Software Foundation gives --# unlimited permission to copy and/or distribute it, with or without --# modifications, as long as this notice is preserved. -- --# serial 6 ltsugar.m4 -- --# This is to help aclocal find these macros, as it can't see m4_define. --AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) -- -- --# lt_join(SEP, ARG1, [ARG2...]) --# ----------------------------- --# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their --# associated separator. --# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier --# versions in m4sugar had bugs. --m4_define([lt_join], --[m4_if([$#], [1], [], -- [$#], [2], [[$2]], -- [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) --m4_define([_lt_join], --[m4_if([$#$2], [2], [], -- [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) -- -- --# lt_car(LIST) --# lt_cdr(LIST) --# ------------ --# Manipulate m4 lists. --# These macros are necessary as long as will still need to support --# Autoconf-2.59 which quotes differently. --m4_define([lt_car], [[$1]]) --m4_define([lt_cdr], --[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], -- [$#], 1, [], -- [m4_dquote(m4_shift($@))])]) --m4_define([lt_unquote], $1) -- -- --# lt_append(MACRO-NAME, STRING, [SEPARATOR]) --# ------------------------------------------ --# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. --# Note that neither SEPARATOR nor STRING are expanded; they are appended --# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). --# No SEPARATOR is output if MACRO-NAME was previously undefined (different --# than defined and empty). --# --# This macro is needed until we can rely on Autoconf 2.62, since earlier --# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. --m4_define([lt_append], --[m4_define([$1], -- m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) -- -- -- --# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) --# ---------------------------------------------------------- --# Produce a SEP delimited list of all paired combinations of elements of --# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list --# has the form PREFIXmINFIXSUFFIXn. --# Needed until we can rely on m4_combine added in Autoconf 2.62. --m4_define([lt_combine], --[m4_if(m4_eval([$# > 3]), [1], -- [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl --[[m4_foreach([_Lt_prefix], [$2], -- [m4_foreach([_Lt_suffix], -- ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, -- [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) -- -- --# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) --# ----------------------------------------------------------------------- --# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited --# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. --m4_define([lt_if_append_uniq], --[m4_ifdef([$1], -- [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], -- [lt_append([$1], [$2], [$3])$4], -- [$5])], -- [lt_append([$1], [$2], [$3])$4])]) -- -- --# lt_dict_add(DICT, KEY, VALUE) --# ----------------------------- --m4_define([lt_dict_add], --[m4_define([$1($2)], [$3])]) -- -- --# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) --# -------------------------------------------- --m4_define([lt_dict_add_subkey], --[m4_define([$1($2:$3)], [$4])]) -- -- --# lt_dict_fetch(DICT, KEY, [SUBKEY]) --# ---------------------------------- --m4_define([lt_dict_fetch], --[m4_ifval([$3], -- m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), -- m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) -- -- --# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) --# ----------------------------------------------------------------- --m4_define([lt_if_dict_fetch], --[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], -- [$5], -- [$6])]) -- -- --# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) --# -------------------------------------------------------------- --m4_define([lt_dict_filter], --[m4_if([$5], [], [], -- [lt_join(m4_quote(m4_default([$4], [[, ]])), -- lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), -- [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl --]) -diff --git a/m4/macros/ltversion.m4 b/m4/macros/ltversion.m4 -deleted file mode 100644 -index 07a8602..0000000 ---- a/m4/macros/ltversion.m4 -+++ /dev/null -@@ -1,23 +0,0 @@ --# ltversion.m4 -- version numbers -*- Autoconf -*- --# --# Copyright (C) 2004 Free Software Foundation, Inc. --# Written by Scott James Remnant, 2004 --# --# This file is free software; the Free Software Foundation gives --# unlimited permission to copy and/or distribute it, with or without --# modifications, as long as this notice is preserved. -- --# @configure_input@ -- --# serial 3337 ltversion.m4 --# This file is part of GNU Libtool -- --m4_define([LT_PACKAGE_VERSION], [2.4.2]) --m4_define([LT_PACKAGE_REVISION], [1.3337]) -- --AC_DEFUN([LTVERSION_VERSION], --[macro_version='2.4.2' --macro_revision='1.3337' --_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) --_LT_DECL(, macro_revision, 0) --]) -diff --git a/m4/macros/lt~obsolete.m4 b/m4/macros/lt~obsolete.m4 -deleted file mode 100644 -index c573da9..0000000 ---- a/m4/macros/lt~obsolete.m4 -+++ /dev/null -@@ -1,98 +0,0 @@ --# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- --# --# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. --# Written by Scott James Remnant, 2004. --# --# This file is free software; the Free Software Foundation gives --# unlimited permission to copy and/or distribute it, with or without --# modifications, as long as this notice is preserved. -- --# serial 5 lt~obsolete.m4 -- --# These exist entirely to fool aclocal when bootstrapping libtool. --# --# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) --# which have later been changed to m4_define as they aren't part of the --# exported API, or moved to Autoconf or Automake where they belong. --# --# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN --# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us --# using a macro with the same name in our local m4/libtool.m4 it'll --# pull the old libtool.m4 in (it doesn't see our shiny new m4_define --# and doesn't know about Autoconf macros at all.) --# --# So we provide this file, which has a silly filename so it's always --# included after everything else. This provides aclocal with the --# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything --# because those macros already exist, or will be overwritten later. --# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. --# --# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. --# Yes, that means every name once taken will need to remain here until --# we give up compatibility with versions before 1.7, at which point --# we need to keep only those names which we still refer to. -- --# This is to help aclocal find these macros, as it can't see m4_define. --AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) -- --m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) --m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) --m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) --m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) --m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) --m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) --m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) --m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) --m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) --m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) --m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) --m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) --m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) --m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) --m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) --m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) --m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) --m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) --m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) --m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) --m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) --m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) --m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) --m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) --m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) --m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) --m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) --m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) --m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) --m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) --m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) --m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) --m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) --m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) --m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) --m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) --m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) --m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) --m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) --m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) --m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) --m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) --m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) --m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) --m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) --m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) --m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) --m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) --m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) --m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) --m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) --m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) --m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) --m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) --m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) --m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) --m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) --m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) --m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) --m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) --m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/am-utils-6.2-fix-NFSv3-access-method-return-on-non-existent-mount-point.patch b/am-utils-6.2-fix-NFSv3-access-method-return-on-non-existent-mount-point.patch new file mode 100644 index 0000000..85dcf79 --- /dev/null +++ b/am-utils-6.2-fix-NFSv3-access-method-return-on-non-existent-mount-point.patch @@ -0,0 +1,32 @@ +am-utils-6.2 - fix NFSv3 access method return on non-existent mount point + +From: Ian Kent + +When the NFS v3 access method is called and there is no mount point +corresponding to the path ESTALE needs to be returned the kernel NFS +client so an NFS lookup will be done and the mount point re-mounted. + +If there is no map entry to mount the NFS v3 lookup method can then +return the failure. + +Signed-off-by: Ian Kent +--- + amd/nfs_subr.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c +index ef07a4a..85cf98c 100644 +--- a/amd/nfs_subr.c ++++ b/amd/nfs_subr.c +@@ -1239,9 +1239,9 @@ am_nfs3_access_3_svc(am_ACCESS3args *argp, struct svc_req *rqstp) + if (!mp) { + post_op_obj = &result.res_u.fail.obj_attributes; + post_op_obj->attributes_follow = 0; +- result.status = nfs_error(ENOENT); ++ result.status = nfs_error(ESTALE); + if (amuDebug(D_TRACE)) +- plog(XLOG_DEBUG, "access_3: ENOENT"); ++ plog(XLOG_DEBUG, "access_3: ESTALE"); + } else { + nfsfattr *fattr = &mp->am_fattr; + am_fattr3 *fattr3; diff --git a/am-utils-6.2-fix-NFSv3-lookup-dir-attribute-return-value.patch b/am-utils-6.2-fix-NFSv3-lookup-dir-attribute-return-value.patch new file mode 100644 index 0000000..85b1801 --- /dev/null +++ b/am-utils-6.2-fix-NFSv3-lookup-dir-attribute-return-value.patch @@ -0,0 +1,76 @@ +am-utils-6.2 - fix NFSv3 lookup dir attribute return value + +From: Ian Kent + +The NFS v3 lookup method, which returns attributes for the directory +containing the object to be looked up, used incorrect mount point +attributes which was causing unusual file system object visibility +problems. + +Signed-off-by: Ian Kent +--- + amd/nfs_subr.c | 29 +++++++++++++++++++++++++++-- + 1 file changed, 27 insertions(+), 2 deletions(-) + +diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c +index 85cf98c..6a1b717 100644 +--- a/amd/nfs_subr.c ++++ b/amd/nfs_subr.c +@@ -978,6 +978,29 @@ static void fattr_to_wcc_attr(nfsfattr *fattr, am_wcc_attr *wcc_attr) + nfstime_to_am_nfstime3(&fattr->na_ctime, &wcc_attr->ctime); + } + ++static nfsfattr *get_parent_fattr(am_node *mp) ++{ ++ nfsfattr *fattr; ++ ++ /* Set attributes to those of the parent only if this ++ * isn't topvol otherwise just use the mp attributes. ++ */ ++ fattr = &mp->am_fattr; ++ if (mp->am_parent && mp->am_parent->am_parent && ++ !(mp->am_parent->am_parent->am_flags & AMF_ROOT)) ++ fattr = &mp->am_parent->am_fattr; ++ ++ return fattr; ++} ++ ++static void parent_fattr_to_fattr3(am_node *mp, am_fattr3 *fattr3) ++{ ++ nfsfattr *fattr; ++ ++ fattr = get_parent_fattr(mp); ++ fattr_to_fattr3(fattr, fattr3); ++} ++ + static am_nfsstat3 return_estale_or_rofs(am_nfs_fh3 *fh, + am_pre_op_attr *pre_op, + am_post_op_attr *post_op) +@@ -1177,9 +1200,7 @@ am_nfs3_lookup_3_svc(am_LOOKUP3args *argp, struct svc_req *rqstp) + + /* dir attributes */ + post_op_dir->attributes_follow = 1; +- fattr = &mp->am_fattr; + fattr3 = &post_op_dir->am_post_op_attr_u.attributes; +- fattr_to_fattr3(fattr, fattr3); + + post_op_obj->attributes_follow = 0; + +@@ -1196,6 +1217,7 @@ am_nfs3_lookup_3_svc(am_LOOKUP3args *argp, struct svc_req *rqstp) + amd_stats.d_drops++; + return 0; + } ++ parent_fattr_to_fattr3(mp, fattr3); + result.status = nfs_error(error); + } else { + /* +@@ -1206,6 +1228,9 @@ am_nfs3_lookup_3_svc(am_LOOKUP3args *argp, struct svc_req *rqstp) + if (ap->am_ttl < mp->am_ttl) + ap->am_ttl = mp->am_ttl; + ++ /* dir attrs, update after mount */ ++ parent_fattr_to_fattr3(mp, fattr3); ++ + mp_to_fh3(ap, &result.res_u.ok.object); + + /* mount attributes */ diff --git a/am-utils-6.2-fix-NFSv3-readdir-post_op_dir-attributes-return.patch b/am-utils-6.2-fix-NFSv3-readdir-post_op_dir-attributes-return.patch new file mode 100644 index 0000000..8260cbf --- /dev/null +++ b/am-utils-6.2-fix-NFSv3-readdir-post_op_dir-attributes-return.patch @@ -0,0 +1,53 @@ +am-utils-6.2 - fix NFSv3 readdir post_op_dir attributes return + +From: Ian Kent + +The NFS v3 readdir method is expected to return the attributes of +the directory being read for both success and fail cases. + +Signed-off-by: Ian Kent +--- + amd/nfs_subr.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c +index 6a1b717..00a1dc0 100644 +--- a/amd/nfs_subr.c ++++ b/amd/nfs_subr.c +@@ -1627,28 +1627,29 @@ am_nfs3_readdir_3_svc(am_READDIR3args *argp, struct svc_req *rqstp) + result.status = nfs_error(retry); + } else { + am_dirlist3 *list = &result.res_u.ok.reply; ++ nfsfattr *fattr; ++ am_fattr3 *fattr3; + am_nfsstat3 status; + + if (amuDebug(D_TRACE)) + plog(XLOG_DEBUG, "\treaddir_3(%s)", mp->am_path); + ++ fattr = &mp->am_fattr; ++ + status = mp->am_al->al_mnt->mf_ops->readdir(mp, + (voidp)&cookie, list, entries, count); + if (status == 0) { + post_op_dir = &result.res_u.ok.dir_attributes; +- nfsfattr *fattr; +- am_fattr3 *fattr3; +- +- fattr = &mp->am_fattr; +- fattr3 = &post_op_dir->am_post_op_attr_u.attributes; + post_op_dir->attributes_follow = 1; +- fattr_to_fattr3(fattr, fattr3); ++ fattr3 = &post_op_dir->am_post_op_attr_u.attributes; + result.status = AM_NFS3_OK; + } else { + post_op_dir = &result.res_u.fail.dir_attributes; +- post_op_dir->attributes_follow = 0; ++ post_op_dir->attributes_follow = 1; ++ fattr3 = &post_op_dir->am_post_op_attr_u.attributes; + result.status = nfs_error(status); + } ++ fattr_to_fattr3(fattr, fattr3); + + mp->am_stats.s_readdir++; + } diff --git a/am-utils-6.2-fix-NFSv3-unlink3_or_rmdir3-post_op-attributes-return.patch b/am-utils-6.2-fix-NFSv3-unlink3_or_rmdir3-post_op-attributes-return.patch new file mode 100644 index 0000000..93b7c35 --- /dev/null +++ b/am-utils-6.2-fix-NFSv3-unlink3_or_rmdir3-post_op-attributes-return.patch @@ -0,0 +1,62 @@ +am-utils-6.2 - fix NFSv3 unlink3_or_rmdir3() post_op attributes return + +From: Ian Kent + +The function unlink3_or_rmdir3() is called by both NFS v3 remove and +rmdir methods. Both of these methods require post op wcc attributes +to be returned but unlink3_or_rmdir3() was returning only the pre op +wcc attributes. + +Signed-off-by: Ian Kent +--- + amd/nfs_subr.c | 16 +++++++++++++--- + 1 file changed, 13 insertions(+), 3 deletions(-) + +diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c +index 00a1dc0..0a43b98 100644 +--- a/amd/nfs_subr.c ++++ b/amd/nfs_subr.c +@@ -1033,7 +1033,7 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp, + am_pre_op_attr *pre_op_dir = &wcc_data->before; + am_post_op_attr *post_op_dir = &wcc_data->after; + nfsfattr *fattr; +- am_wcc_attr *wcc_attr; ++ am_wcc_attr *pre_op_wcc_attr, *post_op_wcc_attr; + am_node *mp, *ap; + int retry; + +@@ -1050,12 +1050,17 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp, + goto out; + } + ++ post_op_dir->attributes_follow = 1; ++ post_op_wcc_attr = &post_op_dir->am_post_op_attr_u.attributes; ++ + pre_op_dir->attributes_follow = 1; ++ pre_op_wcc_attr = &pre_op_dir->am_pre_op_attr_u.attributes; ++ + fattr = &mp->am_fattr; +- wcc_attr = &pre_op_dir->am_pre_op_attr_u.attributes; +- fattr_to_wcc_attr(fattr, wcc_attr); ++ fattr_to_wcc_attr(fattr, pre_op_wcc_attr); + + if (mp->am_fattr.na_type != NFDIR) { ++ fattr_to_wcc_attr(fattr, post_op_wcc_attr); + res = nfs_error(ENOTDIR); + goto out; + } +@@ -1075,9 +1080,14 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp, + */ + else if (retry == ENOENT) + retry = 0; ++ fattr_to_wcc_attr(fattr, post_op_wcc_attr); + res = nfs_error(retry); + } else { + forcibly_timeout_mp(mp); ++ /* we can't wait for the expire so use the attributes as ++ * they are now for the post op wcc attributes. ++ */ ++ fattr_to_wcc_attr(fattr, post_op_wcc_attr); + res = AM_NFS3_OK; + } + diff --git a/am-utils-6.2.0-1.git.bb13dea6-ylwrap.patch b/am-utils-6.2.0-1.git.bb13dea6-ylwrap.patch deleted file mode 100644 index 641822d..0000000 --- a/am-utils-6.2.0-1.git.bb13dea6-ylwrap.patch +++ /dev/null @@ -1,36 +0,0 @@ -diff -up am-utils-6.2.0-1.git.bb13dea6/bootstrap.orig am-utils-6.2.0-1.git.bb13dea6/bootstrap ---- am-utils-6.2.0-1.git.bb13dea6/bootstrap.orig 2014-10-21 05:42:37.128509523 -0400 -+++ am-utils-6.2.0-1.git.bb13dea6/bootstrap 2014-10-21 05:51:38.044996707 -0400 -@@ -59,13 +59,13 @@ fi - - echo "AMU: Fixing ylwrap..." - patch << \EOF ----- ylwrap.orig 2014-05-08 21:18:30.000000000 -0400 --+++ ylwrap 2014-05-09 22:25:54.900240000 -0400 --@@ -153,6 +153,22 @@ -- *[\\/]*) prog="`pwd`/$prog" ;; -+--- ylwrap.orig 2014-10-21 05:38:42.210204684 -0400 -++++ ylwrap 2014-10-21 05:44:45.602138698 -0400 -+@@ -161,6 +161,22 @@ -+ *[\\/]*) prog=`pwd`/$prog ;; - esac - --+prefix=`echo $input | sed \ -++prefix=`echo $input | sed \ - + -e 's,^.*/,,g' \ - + -e 's/_gram.[yl]$/_/g' \ - + -e 's/_lex.[yl]$/_/g' \ -@@ -81,10 +81,10 @@ patch << \EOF - + flags="-p $prefix";; - +esac - + -- # FIXME: add hostname here for parallel makes that run commands on -- # other machines. But that might take us over the 14-char limit. - dirname=ylwrap$$ --@@ -166,10 +182,13 @@ -+ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' -+ trap "ret=129; $do_exit" 1 -+@@ -172,10 +188,13 @@ - cd $dirname - - case $# in diff --git a/am-utils.spec b/am-utils.spec index 54dceab..dd58b39 100644 --- a/am-utils.spec +++ b/am-utils.spec @@ -1,17 +1,14 @@ Summary: Automount utilities including an updated version of Amd Name: am-utils Version: 6.2.0 -%define githash bb13dea6d0bf378f38a2a009a9802577f5399673 -%define shorthash %(echo "%{githash}" | cut -c -8) -%define gitdate 20140906 -%define revision 1 -Release: 4.%{gitdate}git%{shorthash}%{?dist} +%define upstream_version 6.2 +Release: 5%{?dist} License: BSD Epoch: 5 Group: System Environment/Daemons URL: http://am-utils.org # Git repository git://git.fsl.cs.sunysb.edu/am-utils-6.2.git -Source: am-utils-%{version}-%{revision}.git.%{shorthash}.tar.gz +Source: ftp://ftp.am-utils.org/pub/am-utils/am-utils-%{upstream_version}.tar.gz Source1: amd.service Source2: am-utils.conf Source3: am-utils.sysconf @@ -28,7 +25,6 @@ BuildRequires: flex BuildRequires: tcp_wrappers-devel BuildRequires: systemd-units BuildRequires: texinfo -BuildRequires: perl-Unicode-EastAsianWidth BuildRequires: gcc BuildRequires: m4 @@ -45,11 +41,14 @@ Requires(preun): systemd-units Requires(postun): systemd-units Requires(preun): /sbin/install-info -# automake ylwrap has changed, fix inline patch in bootstrap. -Patch1: am-utils-6.2.0-1.git.bb13dea6-ylwrap.patch - # Fix problems with possible future libtool rebases (#1181698) -Patch2: am-utils-6.2.0-1.git.bb13dea6-dont-include-auto-generated-macros-in-aclinlude_m4.patch +Patch1: am-utils-6.2-dont-include-auto-generated-macros-in-aclinlude_m4.patch + +Patch2: am-utils-6.2-add-debug-log-trace-to-NFSv3-readdirplus.patch +Patch3: am-utils-6.2-fix-NFSv3-access-method-return-on-non-existent-mount-point.patch +Patch4: am-utils-6.2-fix-NFSv3-lookup-dir-attribute-return-value.patch +Patch5: am-utils-6.2-fix-NFSv3-readdir-post_op_dir-attributes-return.patch +Patch6: am-utils-6.2-fix-NFSv3-unlink3_or_rmdir3-post_op-attributes-return.patch # Not needed since autoreconf/libtool appear to do this automatically # Leaving it set doesn't appear to be a problem so leave it set in @@ -72,10 +71,14 @@ You should install am-utils if you need a program for automatically mounting and unmounting filesystems. %prep -%setup -q -n %{name}-%{version}-%{revision}.git.%{shorthash} +%setup -q -n %{name}-%{upstream_version} %patch1 -p1 %patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 ./bootstrap @@ -87,7 +90,8 @@ chmod +x find-requires %configure \ --enable-shared \ --enable-am-cflags="-DHAVE_LINUX_NFS_MOUNT_H" \ - --enable-libs="-lnsl -lresolv" + --enable-libs="-lnsl -lresolv" \ + --enable-debug sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool @@ -186,6 +190,20 @@ fi %{_libdir}/libamu.so* %changelog +* Thu Dec 17 2015 Ian Kent - 5:6.2.0-5 +- update to upstream source release 6.2. +- use starting revision 5 to ensure package will update from previous package. +- add configure option enable-debug so we can get logs of any problems with + the new amd NFS v3 service. +- remove BuildRequires: perl-Unicode-EastAsianWidth. +- move libtool macro functions from m4/macros to m4 and delete. +- add debug log trace to NFSv3 readdirplus +- fix NFSv3 access method return on non-existent mount point. +- fix NFSv3 lookup dir attribute return value. +- fix NFSv3 readdir post_op_dir attributes return. +- fix NFSv3 unlink3_or_rmdir3() post_op attributes return. +- fix mtime update on NFSv3 lookup. + * Tue Jun 16 2015 Fedora Release Engineering - 5:6.2.0-4.20140906gitbb13dea6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild diff --git a/sources b/sources index ebfe662..8907255 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -6f631a68f7d98eca36feb5d675ff2296 am-utils-6.2.0-1.git.bb13dea6.tar.gz +4b2ada9cadd24f8a231601274d6fb036 am-utils-6.2.tar.gz From 0313c4523aefe6de7b4deeaca46d189afeeed8db Mon Sep 17 00:00:00 2001 From: Ian Kent Date: Tue, 2 Feb 2016 09:11:25 +0800 Subject: [PATCH 2/5] - fix permissions on amd.service and amd.conf. --- am-utils.spec | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/am-utils.spec b/am-utils.spec index dd58b39..7d90f13 100644 --- a/am-utils.spec +++ b/am-utils.spec @@ -2,7 +2,7 @@ Summary: Automount utilities including an updated version of Amd Name: am-utils Version: 6.2.0 %define upstream_version 6.2 -Release: 5%{?dist} +Release: 6%{?dist} License: BSD Epoch: 5 Group: System Environment/Daemons @@ -104,8 +104,8 @@ make %{?_smp_flags} mkdir -p ${RPM_BUILD_ROOT}/%{_sysconfdir}/sysconfig mkdir -p ${RPM_BUILD_ROOT}%{_unitdir} -install -m 755 %{SOURCE1} ${RPM_BUILD_ROOT}/%{_unitdir}/ -install -m 600 %{SOURCE2} ${RPM_BUILD_ROOT}/%{_sysconfdir}/amd.conf +install -m 644 %{SOURCE1} ${RPM_BUILD_ROOT}/%{_unitdir}/ +install -m 644 %{SOURCE2} ${RPM_BUILD_ROOT}/%{_sysconfdir}/amd.conf install -m 644 %{SOURCE3} ${RPM_BUILD_ROOT}/%{_sysconfdir}/sysconfig/amd install -m 640 %{SOURCE4} ${RPM_BUILD_ROOT}/%{_sysconfdir}/amd.net @@ -190,6 +190,9 @@ fi %{_libdir}/libamu.so* %changelog +* Tue Feb 2 2016 Ian Kent - 5:6.2.0-6 +- fix permissions on amd.service and amd.conf. + * Thu Dec 17 2015 Ian Kent - 5:6.2.0-5 - update to upstream source release 6.2. - use starting revision 5 to ensure package will update from previous package. From 66e745499bdbf8d4350e8453a200e558ca1fa765 Mon Sep 17 00:00:00 2001 From: Ian Kent Date: Tue, 2 Feb 2016 10:57:55 +0800 Subject: [PATCH 3/5] - fix systemd unit dependencies and update portmap to rpcbind in Requires. --- am-utils.spec | 8 ++++++-- amd.service | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/am-utils.spec b/am-utils.spec index 7d90f13..a16ab69 100644 --- a/am-utils.spec +++ b/am-utils.spec @@ -2,7 +2,7 @@ Summary: Automount utilities including an updated version of Amd Name: am-utils Version: 6.2.0 %define upstream_version 6.2 -Release: 6%{?dist} +Release: 8%{?dist} License: BSD Epoch: 5 Group: System Environment/Daemons @@ -28,7 +28,7 @@ BuildRequires: texinfo BuildRequires: gcc BuildRequires: m4 -Requires: portmap +Requires: rpcbind Requires: grep Requires: gawk Requires: findutils @@ -190,6 +190,10 @@ fi %{_libdir}/libamu.so* %changelog +* Tue Feb 2 2016 Ian Kent - 5:6.2.0-8 +- fix systemd unit dependencies. +- Update Requires: portmap to Requires: rpcbind. + * Tue Feb 2 2016 Ian Kent - 5:6.2.0-6 - fix permissions on amd.service and amd.conf. diff --git a/amd.service b/amd.service index b078c9e..0ca9365 100644 --- a/amd.service +++ b/amd.service @@ -1,6 +1,7 @@ [Unit] Description=automount daemon that mounts devices and NFS hosts on demand -After=syslog.target network.target +After=syslog.target network.target network-online.target rpcbind.service +Wants=network-online.target rpcbind.service [Service] EnvironmentFile=-/etc/sysconfig/amd From 0461ce7ab8b86a7ff16d0248e20e402947264854 Mon Sep 17 00:00:00 2001 From: Ian Kent Date: Mon, 29 Feb 2016 16:20:57 +0800 Subject: [PATCH 4/5] - fix Linux NFS recognition of umounts and add systemd dependency on nfs-lock.service. --- ...fix-Linux-NFS-recognition-of-umounts.patch | 39 +++++++++++++++++++ am-utils.spec | 9 ++++- amd.service | 2 +- 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 am-utils-6.2-fix-Linux-NFS-recognition-of-umounts.patch diff --git a/am-utils-6.2-fix-Linux-NFS-recognition-of-umounts.patch b/am-utils-6.2-fix-Linux-NFS-recognition-of-umounts.patch new file mode 100644 index 0000000..6513e19 --- /dev/null +++ b/am-utils-6.2-fix-Linux-NFS-recognition-of-umounts.patch @@ -0,0 +1,39 @@ +am-utils-6.2 - fix Linux NFS recognition of umounts + +From: Ian Kent + +Recent Linux NFS uses a simulated attibute cache change detection +method based on ctime. Consequenty the amd use of mtime for this +doesn't work properly for some kernel versions. + +The problem seen with some kernel versions is a failure to recognize +umounts. + +Updating the parent ctime in step with mtime during umount appears +to fix the problem. + +Signed-off-by: Ian Kent +--- + amd/autil.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/amd/autil.c b/amd/autil.c +index cd9514d..efd18ef 100644 +--- a/amd/autil.c ++++ b/amd/autil.c +@@ -709,10 +709,13 @@ am_unmounted(am_node *mp) + --mp->am_parent->am_fattr.na_nlink; + + /* +- * Update mtime of parent node ++ * Update mtime and ctime of parent node (as ctime is needed for some ++ * Linux NFS kernel versions to properly recognize attribute changes). + */ +- if (mp->am_parent && mp->am_parent->am_al->al_mnt) ++ if (mp->am_parent && mp->am_parent->am_al->al_mnt) { + clocktime(&mp->am_parent->am_fattr.na_mtime); ++ mp->am_parent->am_fattr.na_ctime = mp->am_parent->am_fattr.na_mtime; ++ } + + if (mp->am_parent && (mp->am_flags & AMF_REMOUNT)) { + char *fname = xstrdup(mp->am_name); diff --git a/am-utils.spec b/am-utils.spec index a16ab69..c96de92 100644 --- a/am-utils.spec +++ b/am-utils.spec @@ -2,7 +2,7 @@ Summary: Automount utilities including an updated version of Amd Name: am-utils Version: 6.2.0 %define upstream_version 6.2 -Release: 8%{?dist} +Release: 9%{?dist} License: BSD Epoch: 5 Group: System Environment/Daemons @@ -50,6 +50,8 @@ Patch4: am-utils-6.2-fix-NFSv3-lookup-dir-attribute-return-value.patch Patch5: am-utils-6.2-fix-NFSv3-readdir-post_op_dir-attributes-return.patch Patch6: am-utils-6.2-fix-NFSv3-unlink3_or_rmdir3-post_op-attributes-return.patch +Patch7: am-utils-6.2-fix-Linux-NFS-recognition-of-umounts.patch + # Not needed since autoreconf/libtool appear to do this automatically # Leaving it set doesn't appear to be a problem so leave it set in # case this changes. @@ -79,6 +81,7 @@ mounting and unmounting filesystems. %patch4 -p1 %patch5 -p1 %patch6 -p1 +%patch7 -p1 ./bootstrap @@ -190,6 +193,10 @@ fi %{_libdir}/libamu.so* %changelog +* Mon Feb 29 2016 Ian Kent - 5:6.2.0-9 +- fix Linux NFS recognition of umounts. +- add systemd dependency on nfs-lock.service. + * Tue Feb 2 2016 Ian Kent - 5:6.2.0-8 - fix systemd unit dependencies. - Update Requires: portmap to Requires: rpcbind. diff --git a/amd.service b/amd.service index 0ca9365..e20da2e 100644 --- a/amd.service +++ b/amd.service @@ -1,7 +1,7 @@ [Unit] Description=automount daemon that mounts devices and NFS hosts on demand After=syslog.target network.target network-online.target rpcbind.service -Wants=network-online.target rpcbind.service +Wants=network-online.target rpcbind.service nfs-lock.service [Service] EnvironmentFile=-/etc/sysconfig/amd From f826d803e7b8d56bb7c6dd7fdaf6b2d74d306c42 Mon Sep 17 00:00:00 2001 From: Ian Kent Date: Fri, 4 Mar 2016 13:49:28 +0800 Subject: [PATCH 5/5] - fix unusual NFS kernel client problem and add several fixes. --- ...-NFSv3-nfs_quick_reply-functionality.patch | 241 ++++++++++++++++++ ...6.2-add-NFSv3-rpc-request-validation.patch | 127 +++++++++ ..._nfs_xprt-and-put_nfs_xprt-functions.patch | 170 ++++++++++++ ...-wcc-attr-usage-in-unlink3_or_rmdir3.patch | 52 ++++ ...ls-6.2-use-linux-libtirpc-if-present.patch | 93 +++++++ ..._nfs_xprt-and-put_nfs_xprt-functions.patch | 60 +++++ am-utils.spec | 24 +- 7 files changed, 766 insertions(+), 1 deletion(-) create mode 100644 am-utils-6.2-add-NFSv3-nfs_quick_reply-functionality.patch create mode 100644 am-utils-6.2-add-NFSv3-rpc-request-validation.patch create mode 100644 am-utils-6.2-add-get_nfs_xprt-and-put_nfs_xprt-functions.patch create mode 100644 am-utils-6.2-fix-wcc-attr-usage-in-unlink3_or_rmdir3.patch create mode 100644 am-utils-6.2-use-linux-libtirpc-if-present.patch create mode 100644 am-utils-6.2-use-new-get_nfs_xprt-and-put_nfs_xprt-functions.patch diff --git a/am-utils-6.2-add-NFSv3-nfs_quick_reply-functionality.patch b/am-utils-6.2-add-NFSv3-nfs_quick_reply-functionality.patch new file mode 100644 index 0000000..8aaf65f --- /dev/null +++ b/am-utils-6.2-add-NFSv3-nfs_quick_reply-functionality.patch @@ -0,0 +1,241 @@ +am-utils-6.2 - add NFSv3 nfs_quick_reply() functionality + +From: Ian Kent + +The implementation of the NFS v3 server does not use the hack needed +by the nfs_quick_reply() function. + +Now that saving the current transort for later use by nfs_quick_reply() +avoids concurrency races it should be ok to use it. + +Signed-off-by: Ian Kent +--- + amd/nfs_prot_svc.c | 13 +++++ + amd/nfs_subr.c | 137 +++++++++++++++++++++++++++++++++++++++++----------- + 2 files changed, 120 insertions(+), 30 deletions(-) + +diff --git a/amd/nfs_prot_svc.c b/amd/nfs_prot_svc.c +index cbde172..29b7551 100644 +--- a/amd/nfs_prot_svc.c ++++ b/amd/nfs_prot_svc.c +@@ -180,7 +180,7 @@ nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp) + xdr_result = (xdrproc_t) xdr_diropres; + local = (nfssvcproc_t) nfsproc_lookup_2_svc; + /* +- * Cheap way to pass transp down to amfs_auto_lookuppn so it can ++ * Cheap way to pass transp down to amfs_auto_lookup so it can + * be stored in the am_node structure and later used for + * quick_reply(). + */ +@@ -327,6 +327,8 @@ nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp) + xdrproc_t _xdr_argument, _xdr_result; + nfssvcproc_t local; + ++ current_transp = NULL; ++ + switch (rqstp->rq_proc) { + case AM_NFS3_NULL: + _xdr_argument = (xdrproc_t) xdr_void; +@@ -350,6 +352,12 @@ nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp) + _xdr_argument = (xdrproc_t) xdr_am_LOOKUP3args; + _xdr_result = (xdrproc_t) xdr_am_LOOKUP3res; + local = (nfssvcproc_t) (char *(*)(char *, struct svc_req *)) am_nfs3_lookup_3_svc; ++ /* ++ * Cheap way to pass transp down to amfs_auto_lookup so it can ++ * be stored in the am_node structure and later used for ++ * quick_reply(). ++ */ ++ current_transp = transp; + break; + + case AM_NFS3_ACCESS: +@@ -476,6 +484,9 @@ nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp) + } + + result = (*local) (&argument, rqstp); ++ ++ current_transp = NULL; ++ + if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) { + svcerr_systemerr (transp); + } +diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c +index 07d960d..a383618 100644 +--- a/amd/nfs_subr.c ++++ b/amd/nfs_subr.c +@@ -87,6 +87,9 @@ struct am_fh3 { + }; + + /* forward declarations */ ++static int nfs_quick_reply2(am_node *mp, int error); ++static int nfs_quick_reply3(am_node *mp, int error); ++ + /* converting am-filehandles to mount-points */ + static am_node *fh_to_mp3(am_nfs_fh *fhp, int *rp, int vop); + static am_node *fh_to_mp(am_nfs_fh *fhp); +@@ -255,46 +258,65 @@ nfsproc_lookup_2_svc(nfsdiropargs *argp, struct svc_req *rqstp) + return &res; + } + +- + void + nfs_quick_reply(am_node *mp, int error) + { +- SVCXPRT *transp = mp->am_transp; +- nfsdiropres res; +- xdrproc_t xdr_result = (xdrproc_t) xdr_diropres; ++ int ret; + + /* +- * If there's a transp structure then we can reply to the client's +- * nfs lookup request. ++ * If there's no transp structure then we can't reply to the ++ * client's nfs lookup request. + */ +- if (transp) { +- if (error == 0) { +- /* +- * Construct a valid reply to a lookup request. Same +- * code as in nfsproc_lookup_2_svc() above. +- */ +- mp_to_fh(mp, &res.dr_u.dr_drok_u.drok_fhandle); +- res.dr_u.dr_drok_u.drok_attributes = mp->am_fattr; +- res.dr_status = NFS_OK; +- } else +- /* +- * Return the error that was passed to us. +- */ +- res.dr_status = nfs_error(error); ++ if (!mp->am_transp) ++ return; ++ ++ if (nfs_dispatcher == nfs_program_2) ++ ret = nfs_quick_reply2(mp, error); ++ else ++ ret = nfs_quick_reply3(mp, error); ++ ++ if (!ret) ++ svcerr_systemerr(mp->am_transp); ++ ++ /* ++ * Free up transp. It's only used for one reply. ++ */ ++ put_nfs_xprt(mp->am_transp); ++ mp->am_transp = NULL; ++ dlog("Quick reply sent for %s", mp->am_al->al_mnt->mf_mount); ++} + ++ ++static int ++nfs_quick_reply2(am_node *mp, int error) ++{ ++ SVCXPRT *transp = mp->am_transp; ++ nfsdiropres res; ++ xdrproc_t xdr_result = (xdrproc_t) xdr_diropres; ++ int ret; ++ ++ if (error == 0) { + /* +- * Send off our reply ++ * Construct a valid reply to a lookup request. Same ++ * code as in nfsproc_lookup_2_svc() above. + */ +- if (!svc_sendreply(transp, (XDRPROC_T_TYPE) xdr_result, (SVC_IN_ARG_TYPE) & res)) +- svcerr_systemerr(transp); +- ++ mp_to_fh(mp, &res.dr_u.dr_drok_u.drok_fhandle); ++ res.dr_u.dr_drok_u.drok_attributes = mp->am_fattr; ++ res.dr_status = NFS_OK; ++ } else + /* +- * Free up transp. It's only used for one reply. ++ * Return the error that was passed to us. + */ +- put_nfs_xprt(mp->am_transp); +- mp->am_transp = NULL; +- dlog("Quick reply sent for %s", mp->am_al->al_mnt->mf_mount); +- } ++ res.dr_status = nfs_error(error); ++ ++ /* ++ * Send off our reply ++ */ ++ ret = svc_sendreply(transp, ++ (XDRPROC_T_TYPE) xdr_result, ++ (SVC_IN_ARG_TYPE) & res); ++ ++ return ret; + } + + +@@ -890,6 +912,8 @@ mp_to_fh(am_node *mp, am_nfs_fh *fhp) + /* dlog("mp_to_fh: old filehandle: %d", fp->u.s.fhh_id); */ + } + } ++ ++ + void + mp_to_fh3(am_node *mp, am_nfs_fh3 *fhp) + { +@@ -1257,6 +1281,61 @@ am_nfs3_lookup_3_svc(am_LOOKUP3args *argp, struct svc_req *rqstp) + return &result; + } + ++ ++static int ++nfs_quick_reply3(am_node *mp, int error) ++{ ++ SVCXPRT *transp = mp->am_transp; ++ xdrproc_t xdr_result = (xdrproc_t) xdr_am_LOOKUP3res; ++ am_LOOKUP3res result; ++ am_post_op_attr *post_op_dir; ++ am_post_op_attr *post_op_obj; ++ int ret; ++ ++ if (error) { ++ /* ++ * Return the error that was passed to us. ++ */ ++ post_op_dir->attributes_follow = 0; ++ result.status = nfs_error(error); ++ } else { ++ post_op_dir = &result.res_u.ok.dir_attributes; ++ post_op_obj = &result.res_u.ok.obj_attributes; ++ am_fattr3 *fattr3; ++ nfsfattr *fattr; ++ ++ /* ++ * Construct a valid reply to a lookup request. Same ++ * code as in am_nfs3_lookup_3_svc() above. ++ */ ++ ++ /* dir attributes */ ++ post_op_dir->attributes_follow = 1; ++ fattr3 = &post_op_dir->am_post_op_attr_u.attributes; ++ parent_fattr_to_fattr3(mp, fattr3); ++ ++ mp_to_fh3(mp, &result.res_u.ok.object); ++ ++ /* mount attributes */ ++ post_op_obj->attributes_follow = 1; ++ fattr = &mp->am_fattr; ++ fattr3 = &post_op_obj->am_post_op_attr_u.attributes; ++ fattr_to_fattr3(fattr, fattr3); ++ ++ result.status = AM_NFS3_OK; ++ } ++ ++ /* ++ * Send off our reply ++ */ ++ ret = svc_sendreply(transp, ++ (XDRPROC_T_TYPE) xdr_result, ++ (SVC_IN_ARG_TYPE) &result); ++ ++ return ret; ++} ++ ++ + am_ACCESS3res * + am_nfs3_access_3_svc(am_ACCESS3args *argp, struct svc_req *rqstp) + { diff --git a/am-utils-6.2-add-NFSv3-rpc-request-validation.patch b/am-utils-6.2-add-NFSv3-rpc-request-validation.patch new file mode 100644 index 0000000..f5968e1 --- /dev/null +++ b/am-utils-6.2-add-NFSv3-rpc-request-validation.patch @@ -0,0 +1,127 @@ +am-utils-6.2 - add NFSv3 rpc request validation + +From: Ian Kent + +The NFS v2 internal server uses several validation checks for each +RPC request it receives, also add this validation for the NFS v3 +internal server. + +Signed-off-by: Ian Kent +--- + amd/nfs_prot_svc.c | 65 +++++++++++++++++++++++++++++++--------------------- + 1 file changed, 39 insertions(+), 26 deletions(-) + +diff --git a/amd/nfs_prot_svc.c b/amd/nfs_prot_svc.c +index 29b7551..cae12d4 100644 +--- a/amd/nfs_prot_svc.c ++++ b/amd/nfs_prot_svc.c +@@ -71,30 +71,9 @@ dispatcher_t nfs_dispatcher = nfs_program_2; + typedef char *(*nfssvcproc_t)(voidp, struct svc_req *); + + +-void +-nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp) ++static int ++validate_rpc_request(struct svc_req *rqstp, SVCXPRT *transp) + { +- union { +- am_nfs_fh nfsproc_getattr_2_arg; +- nfssattrargs nfsproc_setattr_2_arg; +- nfsdiropargs nfsproc_lookup_2_arg; +- am_nfs_fh nfsproc_readlink_2_arg; +- nfsreadargs nfsproc_read_2_arg; +- nfswriteargs nfsproc_write_2_arg; +- nfscreateargs nfsproc_create_2_arg; +- nfsdiropargs nfsproc_remove_2_arg; +- nfsrenameargs nfsproc_rename_2_arg; +- nfslinkargs nfsproc_link_2_arg; +- nfssymlinkargs nfsproc_symlink_2_arg; +- nfscreateargs nfsproc_mkdir_2_arg; +- nfsdiropargs fsproc_rmdir_2_arg; +- nfsreaddirargs nfsproc_readdir_2_arg; +- am_nfs_fh nfsproc_statfs_2_arg; +- } argument; +- char *result; +- xdrproc_t xdr_argument, xdr_result; +- nfssvcproc_t local; +- + #ifdef HAVE_TRANSPORT_TYPE_TLI + /* + * On TLI systems we don't use an INET network type, but a "ticlts" (see +@@ -109,7 +88,7 @@ nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp) + extern int __rpc_get_local_uid(SVCXPRT *transp, uid_t *uid); + if (__rpc_get_local_uid(transp, &u) >= 0 && u != 0) { + plog(XLOG_WARNING, "ignoring request from UID %ld, must be 0", (long) u); +- return; ++ return 0; + } + # else /* not HAVE___RPC_GET_LOCAL_UID */ + dlog("cannot verify local uid for rpc request"); +@@ -126,7 +105,7 @@ nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp) + plog(XLOG_WARNING, "ignoring request from %s:%u, port not reserved", + inet_dquad(dq, sizeof(dq), sinp->sin_addr.s_addr), + ntohs(sinp->sin_port)); +- return; ++ return 0; + } + # endif /* MNT2_NFS_OPT_RESVPORT */ + /* if the address does not match, ignore the request */ +@@ -136,16 +115,47 @@ nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp) + plog(XLOG_WARNING, "ignoring request from %s:%u, not a local interface", + inet_dquad(dq, sizeof(dq), sinp->sin_addr.s_addr), + ntohs(sinp->sin_port)); ++ return 0; + } + } else { + plog(XLOG_WARNING, "ignoring request from %s:%u, expected %s", + inet_dquad(dq, sizeof(dq), sinp->sin_addr.s_addr), + ntohs(sinp->sin_port), + inet_dquad(dq2, sizeof(dq2), myipaddr.s_addr)); +- return; ++ return 0; + } + } + #endif /* not HAVE_TRANPORT_TYPE_TLI */ ++ return 1; ++} ++ ++ ++void ++nfs_program_2(struct svc_req *rqstp, SVCXPRT *transp) ++{ ++ union { ++ am_nfs_fh nfsproc_getattr_2_arg; ++ nfssattrargs nfsproc_setattr_2_arg; ++ nfsdiropargs nfsproc_lookup_2_arg; ++ am_nfs_fh nfsproc_readlink_2_arg; ++ nfsreadargs nfsproc_read_2_arg; ++ nfswriteargs nfsproc_write_2_arg; ++ nfscreateargs nfsproc_create_2_arg; ++ nfsdiropargs nfsproc_remove_2_arg; ++ nfsrenameargs nfsproc_rename_2_arg; ++ nfslinkargs nfsproc_link_2_arg; ++ nfssymlinkargs nfsproc_symlink_2_arg; ++ nfscreateargs nfsproc_mkdir_2_arg; ++ nfsdiropargs fsproc_rmdir_2_arg; ++ nfsreaddirargs nfsproc_readdir_2_arg; ++ am_nfs_fh nfsproc_statfs_2_arg; ++ } argument; ++ char *result; ++ xdrproc_t xdr_argument, xdr_result; ++ nfssvcproc_t local; ++ ++ if (!validate_rpc_request(rqstp, transp)) ++ return; + + current_transp = NULL; + +@@ -327,6 +337,9 @@ nfs_program_3(struct svc_req *rqstp, register SVCXPRT *transp) + xdrproc_t _xdr_argument, _xdr_result; + nfssvcproc_t local; + ++ if (!validate_rpc_request(rqstp, transp)) ++ return; ++ + current_transp = NULL; + + switch (rqstp->rq_proc) { diff --git a/am-utils-6.2-add-get_nfs_xprt-and-put_nfs_xprt-functions.patch b/am-utils-6.2-add-get_nfs_xprt-and-put_nfs_xprt-functions.patch new file mode 100644 index 0000000..c24b20e --- /dev/null +++ b/am-utils-6.2-add-get_nfs_xprt-and-put_nfs_xprt-functions.patch @@ -0,0 +1,170 @@ +am-utils-6.2 - add get_nfs_xprt() and put_nfs_xprt() functions + +From: Ian Kent + +The nfs_quick_reply() functionality relies on taking a copy of the +current transport for later use. + +The problem with this is the context of the RPC message is kept in +the transport and if any RPC message arrives before nfs_quick_reply() +is called that context will be corrupted. + +So add a function get_nfs_xprt() to replace the current transport +with a new one returning the passed in transort so nfs_quick_reply() +can use it later. + +A function put_nfs_xprt() is also added (although not really needed +since it just destroys the now unused transport) for completeness. + +Signed-off-by: Ian Kent +--- + conf/transp/transp_sockets.c | 44 ++++++++++++++++++++++++++++++++++++++++ + conf/transp/transp_tli.c | 46 +++++++++++++++++++++++++++++++++++++++++- + include/am_utils.h | 2 ++ + 3 files changed, 91 insertions(+), 1 deletion(-) + +diff --git a/conf/transp/transp_sockets.c b/conf/transp/transp_sockets.c +index 6326007..a6e0054 100644 +--- a/conf/transp/transp_sockets.c ++++ b/conf/transp/transp_sockets.c +@@ -45,6 +45,7 @@ + #include + #include + ++static int soNFS = RPC_ANYSOCK; + + /* + * find the IP address that can be used to connect to the local host +@@ -273,9 +274,52 @@ create_nfs_service(int *soNFSp, u_short *nfs_portp, SVCXPRT **nfs_xprtp, void (* + return 3; + } + ++ soNFS = *soNFSp; ++ + return 0; /* all is well */ + } + ++/* ++ * Get a pointer to the current NFS SVCXPRT and replace it ++ * with a new one. ++ */ ++SVCXPRT * ++get_nfs_xprt(SVCXPRT *nfs_xprt) ++{ ++ SVCXPRT *newxprt; ++ int newfd; ++ ++ if (!nfs_xprt || soNFS == RPC_ANYSOCK) ++ return NULL; ++ ++ newfd = dup(soNFS); ++ if (newfd < 0) ++ return NULL; ++ ++ xprt_unregister(nfs_xprt); ++ newxprt = svcudp_create(newfd); ++ if (!newxprt) { ++ plog(XLOG_FATAL, "Can't switch to new transport"); ++ xprt_register(nfs_xprt); ++ close(newfd); ++ return NULL; ++ } ++ ++ soNFS = newfd; ++ ++ return nfs_xprt; ++} ++ ++/* ++ * Destroy a transport previously obtained by get_nfs_xprt(). ++ */ ++void put_nfs_xprt(SVCXPRT *nfs_xprt) ++{ ++ if (!nfs_xprt || soNFS == RPC_ANYSOCK) ++ return; ++ ++ svc_destroy(nfs_xprt); ++} + + /* + * Create the amq service for amd (both TCP and UDP) +diff --git a/conf/transp/transp_tli.c b/conf/transp/transp_tli.c +index d26a511..bfdb526 100644 +--- a/conf/transp/transp_tli.c ++++ b/conf/transp/transp_tli.c +@@ -45,7 +45,8 @@ + #include + #include + +-struct netconfig *nfsncp; ++struct netconfig *nfsncp = NULL; ++static int soNFS = RPC_ANYSOCK; + + + /* +@@ -456,9 +457,52 @@ create_nfs_service(int *soNFSp, u_short *nfs_portp, SVCXPRT **nfs_xprtp, void (* + return 1; + } + ++ soNFS = *soNFSp; ++ + return 0; /* all is well */ + } + ++/* ++ * Get a pointer to the current NFS SVCXPRT and replace it ++ * with a new one. ++ */ ++SVCXPRT * ++get_nfs_xprt(SVCXPRT *nfs_xprt) ++{ ++ SVCXPRT *newxprt; ++ int newfd; ++ ++ if (!nfs_xprt || soNFS == RPC_ANYSOCK) ++ return NULL; ++ ++ newfd = dup(soNFS); ++ if (newfd < 0) ++ return NULL; ++ ++ xprt_unregister(nfs_xprt); ++ newxprt = svc_tli_create(newfd, nfsncp, NULL, 0, 0); ++ if (!newxprt) { ++ plog(XLOG_FATAL, "Can't switch to new transport"); ++ xprt_register(nfs_xprt); ++ close(newfd); ++ return NULL; ++ } ++ ++ soNFS = newfd; ++ ++ return nfs_xprt; ++} ++ ++/* ++ * Destroy a transport previously obtained by get_nfs_xprt(). ++ */ ++void put_nfs_xprt(SVCXPRT *nfs_xprt) ++{ ++ if (!nfs_xprt || soNFS == RPC_ANYSOCK) ++ return; ++ ++ svc_destroy(nfs_xprt); ++} + + /* + * Bind to preferred AMQ port. +diff --git a/include/am_utils.h b/include/am_utils.h +index 0de881a..ff13c26 100644 +--- a/include/am_utils.h ++++ b/include/am_utils.h +@@ -378,6 +378,8 @@ extern void compute_nfs_args(void *nap, mntent_t *mntp, int genflags, struct net + extern void destroy_nfs_args(void *nap, u_long nfs_version); + extern int create_amq_service(int *udp_soAMQp, SVCXPRT **udp_amqpp, struct netconfig **udp_amqncpp, int *tcp_soAMQp, SVCXPRT **tcp_amqpp, struct netconfig **tcp_amqncpp, u_short preferred_amq_port); + extern int create_nfs_service(int *soNFSp, u_short *nfs_portp, SVCXPRT **nfs_xprtp, void (*dispatch_fxn)(struct svc_req *rqstp, SVCXPRT *transp), u_long nfs_version); ++extern SVCXPRT *get_nfs_xprt(SVCXPRT *nfs_xprt); ++extern void put_nfs_xprt(SVCXPRT *nfs_xprt); + extern int amu_svc_register(SVCXPRT *, u_long, u_long, void (*)(struct svc_req *, SVCXPRT *), u_long, struct netconfig *); + + #ifdef HAVE_TRANSPORT_TYPE_TLI diff --git a/am-utils-6.2-fix-wcc-attr-usage-in-unlink3_or_rmdir3.patch b/am-utils-6.2-fix-wcc-attr-usage-in-unlink3_or_rmdir3.patch new file mode 100644 index 0000000..6239c9f --- /dev/null +++ b/am-utils-6.2-fix-wcc-attr-usage-in-unlink3_or_rmdir3.patch @@ -0,0 +1,52 @@ +am-utils-6.2 - fix wcc attr usage in unlink3_or_rmdir3() + +From: Ian Kent + +The definition of the wcc post op attributes should be am_fattr3 not +am_wcc_attr in unlink3_or_rmdir3(). + +Signed-off-by: Ian Kent +--- + amd/nfs_subr.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c +index a383618..b88a40c 100644 +--- a/amd/nfs_subr.c ++++ b/amd/nfs_subr.c +@@ -1058,7 +1058,8 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp, + am_pre_op_attr *pre_op_dir = &wcc_data->before; + am_post_op_attr *post_op_dir = &wcc_data->after; + nfsfattr *fattr; +- am_wcc_attr *pre_op_wcc_attr, *post_op_wcc_attr; ++ am_wcc_attr *pre_op_wcc_attr; ++ am_fattr3 *post_op_wcc_attr; + am_node *mp, *ap; + int retry; + +@@ -1085,7 +1086,7 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp, + fattr_to_wcc_attr(fattr, pre_op_wcc_attr); + + if (mp->am_fattr.na_type != NFDIR) { +- fattr_to_wcc_attr(fattr, post_op_wcc_attr); ++ fattr_to_fattr3(fattr, post_op_wcc_attr); + res = nfs_error(ENOTDIR); + goto out; + } +@@ -1105,14 +1106,14 @@ static am_nfsstat3 unlink3_or_rmdir3(am_diropargs3 *argp, + */ + else if (retry == ENOENT) + retry = 0; +- fattr_to_wcc_attr(fattr, post_op_wcc_attr); ++ fattr_to_fattr3(fattr, post_op_wcc_attr); + res = nfs_error(retry); + } else { + forcibly_timeout_mp(mp); + /* we can't wait for the expire so use the attributes as + * they are now for the post op wcc attributes. + */ +- fattr_to_wcc_attr(fattr, post_op_wcc_attr); ++ fattr_to_fattr3(fattr, post_op_wcc_attr); + res = AM_NFS3_OK; + } + diff --git a/am-utils-6.2-use-linux-libtirpc-if-present.patch b/am-utils-6.2-use-linux-libtirpc-if-present.patch new file mode 100644 index 0000000..1649b54 --- /dev/null +++ b/am-utils-6.2-use-linux-libtirpc-if-present.patch @@ -0,0 +1,93 @@ +am-utils-6.2 - use Linux libtirpc if present + +From: Ian Kent + +For Linux systems, if the header files and shared libraries of libtirpc +are present use them instead of the glibc RPC implementation. + +Signed-off-by: Ian Kent +--- + Makefile.am | 3 ++- + configure.ac | 4 ++++ + include/am_compat.h | 8 ++++++-- + m4/macros/check_linux_libtirpc.m4 | 13 +++++++++++++ + 4 files changed, 25 insertions(+), 3 deletions(-) + create mode 100644 m4/macros/check_linux_libtirpc.m4 + +diff --git a/Makefile.am b/Makefile.am +index bae4615..e094e95 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -146,7 +146,8 @@ EXTRA_DIST_M4 = \ + m4/macros/type_xdrproc_t.m4 \ + m4/macros/type_xfs_args.m4 \ + m4/macros/type_yp_order_outorder.m4 \ +- m4/macros/with_addon.m4 ++ m4/macros/with_addon.m4 \ ++ m4/macros/check_linux_libtirpc.m4 + + EXTRA_DIST_CONF = \ + conf/autofs/autofs_default.h \ +diff --git a/configure.ac b/configure.ac +index ce61925..98b444d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -222,6 +222,9 @@ dnl lots of code. So I am forced to use a special purpose macro that sets + dnl the libraries based on the OS. Sigh. -Erez. + AMU_CHECK_OS_LIBS + ++dnl use Linux libtirpc if possible ++AMU_CHECK_LIBTIRPC ++ + dnl librpc and librpcsvc are needed on Solaris + AC_CHECK_LIB(rpc, clnt_sperrno) + AC_CHECK_LIB(rpcsvc, xdr_fhandle) +@@ -433,6 +436,7 @@ AC_CHECK_HEADERS( \ + arpa/nameser.h \ + arpa/inet.h \ + bsd/rpc/rpc.h \ ++ tirpc/netconfig.h \ + cdfs/cdfsmount.h \ + cdfs/cdfs_mount.h \ + fs/udf/udf_mount.h \ +diff --git a/include/am_compat.h b/include/am_compat.h +index 3463f3f..d6826fc 100644 +--- a/include/am_compat.h ++++ b/include/am_compat.h +@@ -454,11 +454,15 @@ struct hsfs_args { + /* + * Define a dummy struct netconfig for non-TLI systems + */ +-#if !defined(HAVE_NETCONFIG_H) && !defined(HAVE_SYS_NETCONFIG_H) ++#if !defined(HAVE_NETCONFIG_H) ++# if !defined(HAVE_SYS_NETCONFIG_H) ++# if !defined(HAVE_TIRPC_NETCONFIG_H) + struct netconfig { + int dummy; + }; +-#endif /* not HAVE_NETCONFIG_H and not HAVE_SYS_NETCONFIG_H */ ++# endif /* not HAVE_TIRPC_NETCONFIG_H */ ++# endif /* not HAVE_SYS_NETCONFIG_H */ ++#endif /* not HAVE_NETCONFIG_H */ + + /* some OSs don't define INADDR_NONE and assume it's unsigned -1 */ + #ifndef INADDR_NONE +diff --git a/m4/macros/check_linux_libtirpc.m4 b/m4/macros/check_linux_libtirpc.m4 +new file mode 100644 +index 0000000..918423c +--- /dev/null ++++ b/m4/macros/check_linux_libtirpc.m4 +@@ -0,0 +1,13 @@ ++dnl ###################################################################### ++dnl Check for Linux libtirpc library ++AC_DEFUN([AMU_CHECK_LIBTIRPC],[ ++TIRPC_CPPFLAGS="" ++TIRPC_LIBS="" ++ ++AC_CHECK_HEADER(tirpc/netconfig.h,[ ++ TIRPC_CPPFLAGS="-I/usr/include/tirpc" ++ AC_DEFINE(HAVE_LIBTIRPC, 1, [Define to 1 if you have libtirpc headers installed]) ++ AC_CHECK_LIB(tirpc, clnt_tli_create, [TIRPC_LIBS="-ltirpc"], [TIRPC_CPPFLAGS=""])]) ++ AMU_CFLAGS="$ANU_CFLAGS $TIRPC_CPPFLAGS" ++ LIBS="$LIBS $TIRPC_LIBS" ++]) diff --git a/am-utils-6.2-use-new-get_nfs_xprt-and-put_nfs_xprt-functions.patch b/am-utils-6.2-use-new-get_nfs_xprt-and-put_nfs_xprt-functions.patch new file mode 100644 index 0000000..8594739 --- /dev/null +++ b/am-utils-6.2-use-new-get_nfs_xprt-and-put_nfs_xprt-functions.patch @@ -0,0 +1,60 @@ +am-utils-6.2 - use new get_nfs_xprt() and put_nfs_xprt() functions + +From: Ian Kent + +The nfs_quick_reply() function needs to know the current RPC transport +outside of the NFS LOOKUP method call. It needs this to reply to the +NFS LOOKUP call that initiated the mount. + +Now there are functions that avoid transport corruption if another +request comes in during the backgroud mount make nfs_quick_reply() +use them. + +Signed-off-by: Ian Kent +--- + amd/amfs_generic.c | 3 +-- + amd/map.c | 2 +- + amd/nfs_subr.c | 3 ++- + 3 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/amd/amfs_generic.c b/amd/amfs_generic.c +index c352a32..86d0ab7 100644 +--- a/amd/amfs_generic.c ++++ b/amd/amfs_generic.c +@@ -1129,8 +1129,7 @@ amfs_generic_mount_child(am_node *new_mp, int *error_return) + */ + if (current_transp && !new_mp->am_transp) { + dlog("Saving RPC transport for %s", new_mp->am_path); +- new_mp->am_transp = (SVCXPRT *) xmalloc(sizeof(SVCXPRT)); +- *(new_mp->am_transp) = *current_transp; ++ new_mp->am_transp = get_nfs_xprt(current_transp); + } + if (error && new_mp->am_al && new_mp->am_al->al_mnt && + (new_mp->am_al->al_mnt->mf_ops == &amfs_error_ops)) +diff --git a/amd/map.c b/amd/map.c +index 0d404cf..bcb2156 100644 +--- a/amd/map.c ++++ b/amd/map.c +@@ -471,7 +471,7 @@ free_map(am_node *mp) + XFREE(mp->am_name); + XFREE(mp->am_path); + XFREE(mp->am_pref); +- XFREE(mp->am_transp); ++ put_nfs_xprt(mp->am_transp); + + if (mp->am_al) + free_loc(mp->am_al); +diff --git a/amd/nfs_subr.c b/amd/nfs_subr.c +index 0a43b98..07d960d 100644 +--- a/amd/nfs_subr.c ++++ b/amd/nfs_subr.c +@@ -291,7 +291,8 @@ nfs_quick_reply(am_node *mp, int error) + /* + * Free up transp. It's only used for one reply. + */ +- XFREE(mp->am_transp); ++ put_nfs_xprt(mp->am_transp); ++ mp->am_transp = NULL; + dlog("Quick reply sent for %s", mp->am_al->al_mnt->mf_mount); + } + } diff --git a/am-utils.spec b/am-utils.spec index c96de92..fb80b9f 100644 --- a/am-utils.spec +++ b/am-utils.spec @@ -2,7 +2,7 @@ Summary: Automount utilities including an updated version of Amd Name: am-utils Version: 6.2.0 %define upstream_version 6.2 -Release: 9%{?dist} +Release: 12%{?dist} License: BSD Epoch: 5 Group: System Environment/Daemons @@ -27,11 +27,13 @@ BuildRequires: systemd-units BuildRequires: texinfo BuildRequires: gcc BuildRequires: m4 +BuildRequires: libtirpc-devel Requires: rpcbind Requires: grep Requires: gawk Requires: findutils +Requires: libtirpc Requires(pre): /bin/grep Requires(post): /sbin/install-info @@ -51,6 +53,12 @@ Patch5: am-utils-6.2-fix-NFSv3-readdir-post_op_dir-attributes-return.patch Patch6: am-utils-6.2-fix-NFSv3-unlink3_or_rmdir3-post_op-attributes-return.patch Patch7: am-utils-6.2-fix-Linux-NFS-recognition-of-umounts.patch +Patch8: am-utils-6.2-add-get_nfs_xprt-and-put_nfs_xprt-functions.patch +Patch9: am-utils-6.2-use-new-get_nfs_xprt-and-put_nfs_xprt-functions.patch +Patch10: am-utils-6.2-add-NFSv3-nfs_quick_reply-functionality.patch +Patch11: am-utils-6.2-add-NFSv3-rpc-request-validation.patch +Patch12: am-utils-6.2-fix-wcc-attr-usage-in-unlink3_or_rmdir3.patch +Patch13: am-utils-6.2-use-linux-libtirpc-if-present.patch # Not needed since autoreconf/libtool appear to do this automatically # Leaving it set doesn't appear to be a problem so leave it set in @@ -82,6 +90,12 @@ mounting and unmounting filesystems. %patch5 -p1 %patch6 -p1 %patch7 -p1 +%patch8 -p1 +%patch9 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 ./bootstrap @@ -193,6 +207,14 @@ fi %{_libdir}/libamu.so* %changelog +* Fri Mar 4 2016 Ian Kent - 5:6.2.0-12 +- add get_nfs_xprt() and put_nfs_xprt() functions. +- use new get_nfs_xprt() and put_nfs_xprt() functions. +- add NFSv3 nfs_quick_reply() functionality. +- add NFSv3 rpc request validation. +- fix wcc attr usage in unlink3_or_rmdir3(). +- use Linux libtirpc if present. + * Mon Feb 29 2016 Ian Kent - 5:6.2.0-9 - fix Linux NFS recognition of umounts. - add systemd dependency on nfs-lock.service.