From c27a1d8eefd3fc848c50b231dfa2e98e95836a51 Mon Sep 17 00:00:00 2001 From: Ian Kent Date: Feb 07 2012 01:25:08 +0000 Subject: * Tue Feb 7 2012 Ian Kent - 1:5.0.6-10 - fix rpc build error. - add sss lookup module. - teach automount about sss source. --- diff --git a/autofs-5.0.6-add-sss-lookup-module.patch b/autofs-5.0.6-add-sss-lookup-module.patch new file mode 100644 index 0000000..8dd7b6f --- /dev/null +++ b/autofs-5.0.6-add-sss-lookup-module.patch @@ -0,0 +1,1676 @@ +autofs-5.0.6 - add sss lookup module + +From: Ian Kent + +Add a lookup module (initial implementation) to handle lookups for +an sssd source. + +The % hack for mixed case map keys present in case insensitive schema +still needs to be implemented. +--- + + CHANGELOG | 1 + Makefile.conf.in | 6 + aclocal.m4 | 24 + + configure | 238 ++++++++++------- + configure.in | 4 + modules/Makefile | 6 + modules/lookup_sss.c | 678 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 7 files changed, 860 insertions(+), 97 deletions(-) + create mode 100644 modules/lookup_sss.c + + +--- autofs-5.0.6.orig/CHANGELOG ++++ autofs-5.0.6/CHANGELOG +@@ -21,6 +21,7 @@ + - remove empty command line arguments (passed by systemd). + - fix improve mount location error reporting. + - fix rpc build error. ++- add sss lookup module. + + 28/06/2011 autofs-5.0.6 + ----------------------- +--- autofs-5.0.6.orig/Makefile.conf.in ++++ autofs-5.0.6/Makefile.conf.in +@@ -25,6 +25,9 @@ LDAP = @HAVE_LDAP@ + LIBLDAP= @LIBLDAP@ + LDAP_FLAGS = @LDAP_FLAGS@ + ++# sssd support ++SSSD = @HAVE_SSS_AUTOFS@ ++ + # SASL support: yes (1) no (0) + XML_LIBS = @XML_LIBS@ + XML_FLAGS = @XML_FLAGS@ +@@ -70,6 +73,9 @@ DMALLOCLIB = @DMALLOCLIB@ + prefix = @prefix@ + exec_prefix = @exec_prefix@ + ++# SSS library module directory ++ssslibdir=@sssldir@ ++ + # Directory for autofs modules + autofslibdir = @libdir@/autofs + +--- autofs-5.0.6.orig/aclocal.m4 ++++ autofs-5.0.6/aclocal.m4 +@@ -32,6 +32,30 @@ fi + AC_SUBST(PATH_$1)]) + + dnl -------------------------------------------------------------------------- ++dnl AF_CHECK_SSS_LIB: ++dnl ++dnl Check if a sss autofs library exists. ++dnl -------------------------------------------------------------------------- ++AC_DEFUN(AF_CHECK_SSS_LIB, ++[if test -z $sssldir; then ++ AC_MSG_CHECKING(for sssd autofs library) ++ for libd in /usr/lib64 /usr/lib; do ++ if test -z $sssldir; then ++ if test -e "$libd/sssd/modules/$2"; then ++ sssldir=$libd/sssd/modules ++ fi ++ fi ++ done ++ if test -n $sssldir; then ++ HAVE_$1=1 ++ AC_MSG_RESULT(yes) ++ else ++ HAVE_$1=0 ++ AC_MSG_RESULT(no) ++ fi ++fi]) ++ ++dnl -------------------------------------------------------------------------- + dnl AF_SLOPPY_MOUNT + dnl + dnl Check to see if mount(8) supports the sloppy (-s) option, and define +--- autofs-5.0.6.orig/configure ++++ autofs-5.0.6/configure +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.66. ++# Generated by GNU Autoconf 2.68. + # + # + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +@@ -89,6 +89,7 @@ fi + IFS=" "" $as_nl" + + # Find who we are. Look in the path if we contain no directory separator. ++as_myself= + case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +@@ -214,11 +215,18 @@ IFS=$as_save_IFS + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. ++ # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL +- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} ++ case $- in # (((( ++ *v*x* | *x*v* ) as_opts=-vx ;; ++ *v* ) as_opts=-v ;; ++ *x* ) as_opts=-x ;; ++ * ) as_opts= ;; ++ esac ++ exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} + fi + + if test x$as_have_required = xno; then : +@@ -617,6 +625,8 @@ LIBRESOLV + LIBNSL + KRB5_CONFIG + XML_CONFIG ++sssldir ++HAVE_SSS_AUTOFS + PATH_RPCGEN + RPCGEN + PATH_RANLIB +@@ -782,8 +792,9 @@ do + fi + + case $ac_option in +- *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; +- *) ac_optarg=yes ;; ++ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; ++ *=) ac_optarg= ;; ++ *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. +@@ -1123,7 +1134,7 @@ Try \`$0 --help' for more information" + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 +- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ++ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +@@ -1430,7 +1441,7 @@ test -n "$ac_init_help" && exit $ac_stat + if $ac_init_version; then + cat <<\_ACEOF + configure +-generated by GNU Autoconf 2.66 ++generated by GNU Autoconf 2.68 + + Copyright (C) 2010 Free Software Foundation, Inc. + This configure script is free software; the Free Software Foundation +@@ -1476,7 +1487,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + + } # ac_fn_c_try_compile +@@ -1522,7 +1533,7 @@ fi + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + + } # ac_fn_c_try_link +@@ -1548,7 +1559,7 @@ $as_echo "$ac_try_echo"; } >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } >/dev/null && { ++ test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : +@@ -1559,7 +1570,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 + fi +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + + } # ac_fn_c_try_cpp +@@ -1572,10 +1583,10 @@ fi + ac_fn_c_check_header_mongrel () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if eval "test \"\${$3+set}\"" = set; then : ++ if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if eval "test \"\${$3+set}\"" = set; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + fi + eval ac_res=\$$3 +@@ -1611,7 +1622,7 @@ if ac_fn_c_try_cpp "$LINENO"; then : + else + ac_header_preproc=no + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 + $as_echo "$ac_header_preproc" >&6; } + +@@ -1638,7 +1649,7 @@ $as_echo "$as_me: WARNING: $2: proceedin + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if eval "test \"\${$3+set}\"" = set; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + else + eval "$3=\$ac_header_compiler" +@@ -1647,7 +1658,7 @@ eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } + fi +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_header_mongrel + +@@ -1688,7 +1699,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 + ac_retval=$ac_status + fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + + } # ac_fn_c_try_run +@@ -1702,7 +1713,7 @@ ac_fn_c_check_header_compile () + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 + $as_echo_n "checking for $2... " >&6; } +-if eval "test \"\${$3+set}\"" = set; then : ++if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -1720,7 +1731,7 @@ fi + eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 + $as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_header_compile + cat >config.log <<_ACEOF +@@ -1728,7 +1739,7 @@ This file contains any messages produced + running configure, to aid debugging if configure makes a mistake. + + It was created by $as_me, which was +-generated by GNU Autoconf 2.66. Invocation command line was ++generated by GNU Autoconf 2.68. Invocation command line was + + $ $0 $@ + +@@ -2300,7 +2311,7 @@ if test -n "$ac_tool_prefix"; then + set dummy ${ac_tool_prefix}gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -2340,7 +2351,7 @@ if test -z "$ac_cv_prog_CC"; then + set dummy gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : ++if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then +@@ -2393,7 +2404,7 @@ if test -z "$CC"; then + set dummy ${ac_tool_prefix}cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -2433,7 +2444,7 @@ if test -z "$CC"; then + set dummy cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -2492,7 +2503,7 @@ if test -z "$CC"; then + set dummy $ac_tool_prefix$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 test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -2536,7 +2547,7 @@ do + 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; then : ++if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then +@@ -2819,7 +2830,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_ex + ac_clean_files=$ac_clean_files_save + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 + $as_echo_n "checking for suffix of object files... " >&6; } +-if test "${ac_cv_objext+set}" = set; then : ++if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -2870,7 +2881,7 @@ OBJEXT=$ac_cv_objext + ac_objext=$OBJEXT + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 + $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +-if test "${ac_cv_c_compiler_gnu+set}" = set; then : ++if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -2907,7 +2918,7 @@ ac_test_CFLAGS=${CFLAGS+set} + ac_save_CFLAGS=$CFLAGS + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 + $as_echo_n "checking whether $CC accepts -g... " >&6; } +-if test "${ac_cv_prog_cc_g+set}" = set; then : ++if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_save_c_werror_flag=$ac_c_werror_flag +@@ -2985,7 +2996,7 @@ else + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 + $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if test "${ac_cv_prog_cc_c89+set}" = set; then : ++if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_cv_prog_cc_c89=no +@@ -3183,7 +3194,7 @@ do + 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 test "${ac_cv_path_MOUNT+set}" = set; then : ++if ${ac_cv_path_MOUNT+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $MOUNT in +@@ -3243,7 +3254,7 @@ do + 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 test "${ac_cv_path_UMOUNT+set}" = set; then : ++if ${ac_cv_path_UMOUNT+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $UMOUNT in +@@ -3303,7 +3314,7 @@ do + 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 test "${ac_cv_path_E2FSCK+set}" = set; then : ++if ${ac_cv_path_E2FSCK+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $E2FSCK in +@@ -3362,7 +3373,7 @@ do + 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 test "${ac_cv_path_E3FSCK+set}" = set; then : ++if ${ac_cv_path_E3FSCK+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $E3FSCK in +@@ -3421,7 +3432,7 @@ do + 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 test "${ac_cv_path_E4FSCK+set}" = set; then : ++if ${ac_cv_path_E4FSCK+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $E4FSCK in +@@ -3480,7 +3491,7 @@ do + 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 test "${ac_cv_path_MODPROBE+set}" = set; then : ++if ${ac_cv_path_MODPROBE+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $MODPROBE in +@@ -3540,7 +3551,7 @@ do + 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 test "${ac_cv_path_LEX+set}" = set; then : ++if ${ac_cv_path_LEX+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $LEX in +@@ -3596,7 +3607,7 @@ do + 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 test "${ac_cv_path_YACC+set}" = set; then : ++if ${ac_cv_path_YACC+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $YACC in +@@ -3652,7 +3663,7 @@ do + 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 test "${ac_cv_path_RANLIB+set}" = set; then : ++if ${ac_cv_path_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $RANLIB in +@@ -3708,7 +3719,7 @@ do + 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 test "${ac_cv_path_RPCGEN+set}" = set; then : ++if ${ac_cv_path_RPCGEN+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $RPCGEN in +@@ -3759,6 +3770,29 @@ else + fi + + ++if test -z $sssldir; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sssd autofs library" >&5 ++$as_echo_n "checking for sssd autofs library... " >&6; } ++ for libd in /usr/lib64 /usr/lib; do ++ if test -z $sssldir; then ++ if test -e "$libd/sssd/modules/libsss_autofs.so"; then ++ sssldir=$libd/sssd/modules ++ fi ++ fi ++ done ++ if test -n $sssldir; then ++ HAVE_SSS_AUTOFS=1 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ else ++ HAVE_SSS_AUTOFS=0 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ fi ++fi ++ ++ ++ + # + # Newer mounts have the -s (sloppy) option to ignore unknown options, + # good for portability +@@ -3785,7 +3819,7 @@ do + 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 test "${ac_cv_path_XML_CONFIG+set}" = set; then : ++if ${ac_cv_path_XML_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $XML_CONFIG in +@@ -3860,7 +3894,7 @@ do + 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 test "${ac_cv_path_KRB5_CONFIG+set}" = set; then : ++if ${ac_cv_path_KRB5_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 + else + case $KRB5_CONFIG in +@@ -3920,7 +3954,7 @@ fi + # + { $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 test "${ac_cv_lib_nsl_yp_match+set}" = set; then : ++if ${ac_cv_lib_nsl_yp_match+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -3954,7 +3988,7 @@ 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" = x""yes; then : ++if test "x$ac_cv_lib_nsl_yp_match" = xyes; then : + LIBNSL="-lnsl" + fi + +@@ -3962,7 +3996,7 @@ 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; } +-if test "${ac_cv_lib_resolv_res_query+set}" = set; then : ++if ${ac_cv_lib_resolv_res_query+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -3996,7 +4030,7 @@ 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" = x""yes; then : ++if test "x$ac_cv_lib_resolv_res_query" = xyes; then : + LIBRESOLV="-lresolv" + fi + +@@ -4088,7 +4122,7 @@ if test -n "$CPP" && test -d "$CPP"; the + CPP= + fi + if test -z "$CPP"; then +- if test "${ac_cv_prog_CPP+set}" = set; then : ++ if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 + else + # Double quotes because CPP needs to be expanded +@@ -4118,7 +4152,7 @@ else + # Broken: fails on valid input. + continue + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. +@@ -4134,11 +4168,11 @@ else + ac_preproc_ok=: + break + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.i conftest.err conftest.$ac_ext + if $ac_preproc_ok; then : + break + fi +@@ -4177,7 +4211,7 @@ else + # Broken: fails on valid input. + continue + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. +@@ -4193,11 +4227,11 @@ else + ac_preproc_ok=: + break + fi +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.err conftest.i conftest.$ac_ext + + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.err conftest.$ac_ext ++rm -f conftest.i conftest.err conftest.$ac_ext + if $ac_preproc_ok; then : + + else +@@ -4216,7 +4250,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 + $as_echo_n "checking for grep that handles long lines and -e... " >&6; } +-if test "${ac_cv_path_GREP+set}" = set; then : ++if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -z "$GREP"; then +@@ -4279,7 +4313,7 @@ $as_echo "$ac_cv_path_GREP" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 + $as_echo_n "checking for egrep... " >&6; } +-if test "${ac_cv_path_EGREP+set}" = set; then : ++if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 + else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +@@ -4346,7 +4380,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 + $as_echo_n "checking for ANSI C header files... " >&6; } +-if test "${ac_cv_header_stdc+set}" = set; then : ++if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -4474,7 +4508,7 @@ 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" = x""yes; then : ++if test "x$ac_cv_header_rpcsvc_nis_h" = xyes; then : + HAVE_NISPLUS=1 + fi + +@@ -4509,7 +4543,7 @@ if test -z "$HAVE_LDAP" -o "$HAVE_LDAP" + LDAP_FLAGS="$LDAP_FLAGS -DLDAP_DEPRECATED=1" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_initialize in -lldap" >&5 + $as_echo_n "checking for ldap_initialize in -lldap... " >&6; } +-if test "${ac_cv_lib_ldap_ldap_initialize+set}" = set; then : ++if ${ac_cv_lib_ldap_ldap_initialize+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -4543,7 +4577,7 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ldap_ldap_initialize" >&5 + $as_echo "$ac_cv_lib_ldap_ldap_initialize" >&6; } +-if test "x$ac_cv_lib_ldap_ldap_initialize" = x""yes; then : ++if test "x$ac_cv_lib_ldap_ldap_initialize" = xyes; then : + HAVE_LDAP=1 LIBLDAP="$LIBLDAP -lldap -llber -lresolv" + fi + +@@ -4677,7 +4711,7 @@ then + HAVE_SASL=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sasl_client_start in -lsasl2" >&5 + $as_echo_n "checking for sasl_client_start in -lsasl2... " >&6; } +-if test "${ac_cv_lib_sasl2_sasl_client_start+set}" = set; then : ++if ${ac_cv_lib_sasl2_sasl_client_start+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +@@ -4711,7 +4745,7 @@ LIBS=$ac_check_lib_save_LIBS + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sasl2_sasl_client_start" >&5 + $as_echo "$ac_cv_lib_sasl2_sasl_client_start" >&6; } +-if test "x$ac_cv_lib_sasl2_sasl_client_start" = x""yes; then : ++if test "x$ac_cv_lib_sasl2_sasl_client_start" = xyes; then : + HAVE_SASL=1 LIBSASL="$LIBSASL -lsasl2" + fi + +@@ -4744,7 +4778,7 @@ if test -n "$ac_tool_prefix"; then + set dummy ${ac_tool_prefix}gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -4784,7 +4818,7 @@ if test -z "$ac_cv_prog_CC"; then + set dummy gcc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : ++if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then +@@ -4837,7 +4871,7 @@ if test -z "$CC"; then + set dummy ${ac_tool_prefix}cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -4877,7 +4911,7 @@ if test -z "$CC"; then + set dummy cc; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +-if test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -4936,7 +4970,7 @@ if test -z "$CC"; then + set dummy $ac_tool_prefix$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 test "${ac_cv_prog_CC+set}" = set; then : ++if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$CC"; then +@@ -4980,7 +5014,7 @@ do + 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; then : ++if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 + else + if test -n "$ac_ct_CC"; then +@@ -5064,7 +5098,7 @@ done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 + $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +-if test "${ac_cv_c_compiler_gnu+set}" = set; then : ++if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5101,7 +5135,7 @@ ac_test_CFLAGS=${CFLAGS+set} + ac_save_CFLAGS=$CFLAGS + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 + $as_echo_n "checking whether $CC accepts -g... " >&6; } +-if test "${ac_cv_prog_cc_g+set}" = set; then : ++if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_save_c_werror_flag=$ac_c_werror_flag +@@ -5179,7 +5213,7 @@ else + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 + $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if test "${ac_cv_prog_cc_c89+set}" = set; then : ++if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_cv_prog_cc_c89=no +@@ -5432,7 +5466,7 @@ LTLIBOBJS=$ac_ltlibobjs + + + +-: ${CONFIG_STATUS=./config.status} ++: "${CONFIG_STATUS=./config.status}" + ac_write_fail=0 + ac_clean_files_save=$ac_clean_files + ac_clean_files="$ac_clean_files $CONFIG_STATUS" +@@ -5533,6 +5567,7 @@ fi + IFS=" "" $as_nl" + + # Find who we are. Look in the path if we contain no directory separator. ++as_myself= + case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +@@ -5840,7 +5875,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # values after options handling. + ac_log=" + This file was extended by $as_me, which was +-generated by GNU Autoconf 2.66. Invocation command line was ++generated by GNU Autoconf 2.68. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS +@@ -5902,7 +5937,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ + config.status +-configured by $0, generated by GNU Autoconf 2.66, ++configured by $0, generated by GNU Autoconf 2.68, + with options \\"\$ac_cs_config\\" + + Copyright (C) 2010 Free Software Foundation, Inc. +@@ -5920,11 +5955,16 @@ ac_need_defaults=: + while test $# != 0 + do + case $1 in +- --*=*) ++ --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; ++ --*=) ++ ac_option=`expr "X$1" : 'X\([^=]*\)='` ++ ac_optarg= ++ ac_shift=: ++ ;; + *) + ac_option=$1 + ac_optarg=$2 +@@ -5946,6 +5986,7 @@ do + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; +@@ -6041,9 +6082,10 @@ fi + # after its creation but before its name has been assigned to `$tmp'. + $debug || + { +- tmp= ++ tmp= ac_tmp= + trap 'exit_status=$? +- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ++ : "${ac_tmp:=$tmp}" ++ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status + ' 0 + trap 'as_fn_exit 1' 1 2 13 15 + } +@@ -6051,12 +6093,13 @@ $debug || + + { + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && +- test -n "$tmp" && test -d "$tmp" ++ test -d "$tmp" + } || + { + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") + } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ++ac_tmp=$tmp + + # Set up the scripts for CONFIG_FILES section. + # No need to generate them if there are no CONFIG_FILES. +@@ -6078,7 +6121,7 @@ else + ac_cs_awk_cr=$ac_cr + fi + +-echo 'BEGIN {' >"$tmp/subs1.awk" && ++echo 'BEGIN {' >"$ac_tmp/subs1.awk" && + _ACEOF + + +@@ -6106,7 +6149,7 @@ done + rm -f conf$$subs.sh + + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-cat >>"\$tmp/subs1.awk" <<\\_ACAWK && ++cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && + _ACEOF + sed -n ' + h +@@ -6154,7 +6197,7 @@ t delim + rm -f conf$$subs.awk + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + _ACAWK +-cat >>"\$tmp/subs1.awk" <<_ACAWK && ++cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +@@ -6186,7 +6229,7 @@ if sed "s/$ac_cr//" < /dev/null > /dev/n + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" + else + cat +-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ ++fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 + _ACEOF + +@@ -6220,7 +6263,7 @@ fi # test -n "$CONFIG_FILES" + # No need to generate them if there are no CONFIG_HEADERS. + # This happens for instance with `./config.status Makefile'. + if test -n "$CONFIG_HEADERS"; then +-cat >"$tmp/defines.awk" <<\_ACAWK || ++cat >"$ac_tmp/defines.awk" <<\_ACAWK || + BEGIN { + _ACEOF + +@@ -6232,8 +6275,8 @@ _ACEOF + # handling of long lines. + ac_delim='%!_!# ' + for ac_last_try in false false :; do +- ac_t=`sed -n "/$ac_delim/p" confdefs.h` +- if test -z "$ac_t"; then ++ ac_tt=`sed -n "/$ac_delim/p" confdefs.h` ++ if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 +@@ -6353,7 +6396,7 @@ do + for ac_f + do + case $ac_f in +- -) ac_f="$tmp/stdin";; ++ -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. +@@ -6388,7 +6431,7 @@ $as_echo "$as_me: creating $ac_file" >&6 + esac + + case $ac_tag in +- *:-:* | *:-) cat >"$tmp/stdin" \ ++ *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; +@@ -6514,21 +6557,22 @@ s&@abs_builddir@&$ac_abs_builddir&;t t + s&@abs_top_builddir@&$ac_abs_top_builddir&;t t + $ac_datarootdir_hack + " +-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ++eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ ++ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + + test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && +- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && +- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && ++ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && ++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ ++ "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + which seems to be undefined. Please make sure it is defined" >&5 + $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' + which seems to be undefined. Please make sure it is defined" >&2;} + +- rm -f "$tmp/stdin" ++ rm -f "$ac_tmp/stdin" + case $ac_file in +- -) cat "$tmp/out" && rm -f "$tmp/out";; +- *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; ++ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; ++ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; +@@ -6539,20 +6583,20 @@ which seems to be undefined. Please mak + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" +- } >"$tmp/config.h" \ ++ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" ++ } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then ++ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 + $as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" +- mv "$tmp/config.h" "$ac_file" \ ++ mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ ++ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; +--- autofs-5.0.6.orig/configure.in ++++ autofs-5.0.6/configure.in +@@ -148,6 +148,10 @@ AF_CHECK_PROG(YACC, bison, , $searchpath + AF_CHECK_PROG(RANLIB, ranlib, , $searchpath) + AF_CHECK_PROG(RPCGEN, rpcgen, , $searchpath) + ++AF_CHECK_SSS_LIB(SSS_AUTOFS, libsss_autofs.so) ++AC_SUBST(HAVE_SSS_AUTOFS) ++AC_SUBST(sssldir) ++ + # + # Newer mounts have the -s (sloppy) option to ignore unknown options, + # good for portability +--- autofs-5.0.6.orig/modules/Makefile ++++ autofs-5.0.6/modules/Makefile +@@ -47,6 +47,12 @@ ifeq ($(LDAP), 1) + endif + endif + ++ifeq ($(SSSD), 1) ++ CFLAGS += -DSSS_LIB_DIR=\"$(ssslibdir)\" ++ SRCS += lookup_sss.c ++ MODS += lookup_sss.so ++endif ++ + CFLAGS += -I../include -I../lib -fPIC -D_GNU_SOURCE + CFLAGS += -DAUTOFS_LIB_DIR=\"$(autofslibdir)\" + CFLAGS += -DAUTOFS_MAP_DIR=\"$(autofsmapdir)\" +--- /dev/null ++++ autofs-5.0.6/modules/lookup_sss.c +@@ -0,0 +1,678 @@ ++/* ----------------------------------------------------------------------- * ++ * ++ * lookup_sss.c - module for Linux automount to query sss service ++ * ++ * Copyright 2012 Ian Kent ++ * Copyright 2012 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139, ++ * USA; either version 2 of the License, or (at your option) any later ++ * version; incorporated herein by reference. ++ * ++ * ----------------------------------------------------------------------- */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define MODULE_LOOKUP ++#include "automount.h" ++#include "nsswitch.h" ++ ++#define MAPFMT_DEFAULT "sun" ++ ++#define MODPREFIX "lookup(sss): " ++ ++#define SSS_SO_NAME "libsss_autofs" ++ ++int _sss_setautomntent(const char *, void **); ++int _sss_getautomntent_r(char **, char **, void *); ++int _sss_getautomntbyname_r(char *, char **, void *); ++int _sss_endautomntent(void **); ++ ++typedef int (*setautomntent_t) (const char *, void **); ++typedef int (*getautomntent_t) (char **, char **, void *); ++typedef int (*getautomntbyname_t) (char *, char **, void *); ++typedef int (*endautomntent_t) (void **); ++ ++struct lookup_context { ++ const char *mapname; ++ void *dlhandle; ++ setautomntent_t setautomntent; ++ getautomntent_t getautomntent_r; ++ getautomntbyname_t getautomntbyname_r; ++ endautomntent_t endautomntent; ++ struct parse_mod *parse; ++}; ++ ++int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */ ++ ++int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **context) ++{ ++ struct lookup_context *ctxt; ++ char buf[MAX_ERR_BUF]; ++ char dlbuf[PATH_MAX]; ++ char *estr; ++ void *dh; ++ size_t size; ++ ++ *context = NULL; ++ ++ ctxt = malloc(sizeof(struct lookup_context)); ++ if (!ctxt) { ++ estr = strerror_r(errno, buf, MAX_ERR_BUF); ++ logerr(MODPREFIX "malloc: %s", estr); ++ return 1; ++ } ++ ++ if (argc < 1) { ++ free(ctxt); ++ logerr(MODPREFIX "No map name"); ++ return 1; ++ } ++ ctxt->mapname = argv[0]; ++ ++ if (!mapfmt) ++ mapfmt = MAPFMT_DEFAULT; ++ ++ size = snprintf(dlbuf, sizeof(dlbuf), ++ "%s/%s.so", SSS_LIB_DIR, SSS_SO_NAME); ++ if (size >= sizeof(dlbuf)) { ++ free(ctxt); ++ logmsg(MODPREFIX "sss library path too long"); ++ return 1; ++ } ++ ++ dh = dlopen(dlbuf, RTLD_LAZY); ++ if (!dh) { ++ estr = strerror_r(errno, buf, MAX_ERR_BUF); ++ logerr(MODPREFIX "dlopen: %s", estr); ++ free(ctxt); ++ return 1; ++ } ++ ctxt->dlhandle = dh; ++ ++ ctxt->setautomntent = (setautomntent_t) dlsym(dh, "_sss_setautomntent"); ++ if (!ctxt->setautomntent) ++ goto lib_names_fail; ++ ++ ctxt->getautomntent_r = (getautomntent_t) dlsym(dh, "_sss_getautomntent_r"); ++ if (!ctxt->getautomntent_r) ++ goto lib_names_fail; ++ ++ ctxt->getautomntbyname_r = (getautomntbyname_t) dlsym(dh, "_sss_getautomntbyname_r"); ++ if (!ctxt->getautomntbyname_r) ++ goto lib_names_fail; ++ ++ ctxt->endautomntent = (endautomntent_t) dlsym(dh, "_sss_endautomntent"); ++ if (!ctxt->setautomntent) ++ goto lib_names_fail; ++ ++ ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1); ++ if (!ctxt->parse) { ++ logmsg(MODPREFIX "failed to open parse context"); ++ dlclose(dh); ++ free(ctxt); ++ return 1; ++ } ++ *context = ctxt; ++ ++ return 0; ++ ++lib_names_fail: ++ if ((estr = dlerror()) == NULL) ++ logmsg(MODPREFIX "failed to locate sss library entry points"); ++ else ++ logerr(MODPREFIX "dlsym: %s", estr); ++ dlclose(dh); ++ free(ctxt); ++ return 1; ++} ++ ++static int setautomntent(unsigned int logopt, ++ struct lookup_context *ctxt, const char *mapname, ++ void **sss_ctxt) ++{ ++ int ret = ctxt->setautomntent(mapname, sss_ctxt); ++ if (ret) { ++ char buf[MAX_ERR_BUF]; ++ char *estr = strerror_r(ret, buf, MAX_ERR_BUF); ++ error(logopt, MODPREFIX "setautomntent: %s", estr); ++ if (*sss_ctxt) ++ free(*sss_ctxt); ++ return 0; ++ } ++ return 1; ++} ++ ++static int endautomntent(unsigned int logopt, ++ struct lookup_context *ctxt, void **sss_ctxt) ++{ ++ int ret = ctxt->endautomntent(sss_ctxt); ++ if (ret) { ++ char buf[MAX_ERR_BUF]; ++ char *estr = strerror_r(ret, buf, MAX_ERR_BUF); ++ error(logopt, MODPREFIX "endautomntent: %s", estr); ++ return 0; ++ } ++ return 1; ++} ++ ++int lookup_read_master(struct master *master, time_t age, void *context) ++{ ++ struct lookup_context *ctxt = (struct lookup_context *) context; ++ unsigned int timeout = master->default_timeout; ++ unsigned int logging = master->default_logging; ++ unsigned int logopt = master->logopt; ++ void *sss_ctxt = NULL; ++ char buf[MAX_ERR_BUF]; ++ char *buffer; ++ size_t buffer_len; ++ char *key; ++ char *value = NULL; ++ int count, ret; ++ ++ if (!setautomntent(logopt, ctxt, ctxt->mapname, &sss_ctxt)) ++ return NSS_STATUS_UNAVAIL; ++ ++ count = 0; ++ while (1) { ++ key = NULL; ++ value = NULL; ++ ret = ctxt->getautomntent_r(&key, &value, sss_ctxt); ++ if (ret && ret != ENOENT) { ++ char *estr = strerror_r(ret, buf, MAX_ERR_BUF); ++ error(logopt, MODPREFIX "getautomntent_r: %s", estr); ++ endautomntent(logopt, ctxt, &sss_ctxt); ++ if (key) ++ free(key); ++ if (value) ++ free(value); ++ return NSS_STATUS_UNAVAIL; ++ } ++ if (ret == ENOENT) { ++ if (!count) { ++ char *estr = strerror_r(ret, buf, MAX_ERR_BUF); ++ error(logopt, MODPREFIX "getautomntent_r: %s", estr); ++ endautomntent(logopt, ctxt, &sss_ctxt); ++ if (key) ++ free(key); ++ if (value) ++ free(value); ++ return NSS_STATUS_NOTFOUND; ++ } ++ break; ++ } ++ count++; ++ ++ buffer_len = strlen(key) + 1 + strlen(value) + 2; ++ buffer = malloc(buffer_len); ++ if (!buffer) { ++ char *estr = strerror_r(errno, buf, MAX_ERR_BUF); ++ error(logopt, MODPREFIX "malloc: %s", estr); ++ endautomntent(logopt, ctxt, &sss_ctxt); ++ free(key); ++ free(value); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ /* ++ * TODO: implement sun % hack for key translation for ++ * mixed case keys in schema that are single case only. ++ */ ++ ++ strcpy(buffer, key); ++ strcat(buffer, " "); ++ strcat(buffer, value); ++ ++ /* ++ * TODO: handle cancelation. This almost certainly isn't ++ * handled properly by other lookup modules either so it ++ * should be done when cancelation is reviewed for the ++ * other modules. Ditto for the other lookup module entry ++ * points. ++ */ ++ master_parse_entry(buffer, timeout, logging, age); ++ ++ free(buffer); ++ free(key); ++ free(value); ++ } ++ ++ endautomntent(logopt, ctxt, &sss_ctxt); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++int lookup_read_map(struct autofs_point *ap, time_t age, void *context) ++{ ++ struct lookup_context *ctxt = (struct lookup_context *) context; ++ struct map_source *source; ++ struct mapent_cache *mc; ++ void *sss_ctxt = NULL; ++ char buf[MAX_ERR_BUF]; ++ char *key; ++ char *value = NULL; ++ char *s_key; ++ int count, ret; ++ ++ source = ap->entry->current; ++ ap->entry->current = NULL; ++ master_source_current_signal(ap->entry); ++ ++ mc = source->mc; ++ ++ /* ++ * If we don't need to create directories then there's no use ++ * reading the map. We always need to read the whole map for ++ * direct mounts in order to mount the triggers. ++ */ ++ if (!(ap->flags & MOUNT_FLAG_GHOST) && ap->type != LKP_DIRECT) ++ return NSS_STATUS_SUCCESS; ++ ++ if (!setautomntent(ap->logopt, ctxt, ctxt->mapname, &sss_ctxt)) ++ return NSS_STATUS_UNAVAIL; ++ ++ count = 0; ++ while (1) { ++ key = NULL; ++ value = NULL; ++ ret = ctxt->getautomntent_r(&key, &value, sss_ctxt); ++ if (ret && ret != ENOENT) { ++ char *estr = strerror_r(ret, buf, MAX_ERR_BUF); ++ error(ap->logopt, ++ MODPREFIX "getautomntent_r: %s", estr); ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ if (key) ++ free(key); ++ if (value) ++ free(value); ++ return NSS_STATUS_UNAVAIL; ++ } ++ if (ret == ENOENT) { ++ if (!count) { ++ char *estr = strerror_r(ret, buf, MAX_ERR_BUF); ++ error(ap->logopt, ++ MODPREFIX "getautomntent_r: %s", estr); ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ if (key) ++ free(key); ++ if (value) ++ free(value); ++ return NSS_STATUS_NOTFOUND; ++ } ++ break; ++ } ++ ++ /* ++ * Ignore keys beginning with '+' as plus map ++ * inclusion is only valid in file maps. ++ */ ++ if (*key == '+') { ++ warn(ap->logopt, ++ MODPREFIX "ignoring '+' map entry - not in file map"); ++ free(key); ++ free(value); ++ continue; ++ } ++ ++ /* ++ * TODO: implement sun % hack for key translation for ++ * mixed case keys in schema that are single case only. ++ */ ++ ++ s_key = sanitize_path(key, strlen(key), ap->type, ap->logopt); ++ if (!s_key) { ++ error(ap->logopt, MODPREFIX "invalid path %s", key); ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ free(key); ++ free(value); ++ return NSS_STATUS_NOTFOUND; ++ } ++ ++ count++; ++ ++ cache_writelock(mc); ++ cache_update(mc, source, s_key, value, age); ++ cache_unlock(mc); ++ ++ free(s_key); ++ free(key); ++ free(value); ++ } ++ ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static int lookup_one(struct autofs_point *ap, ++ char *qKey, int qKey_len, struct lookup_context *ctxt) ++{ ++ struct map_source *source; ++ struct mapent_cache *mc; ++ struct mapent *we; ++ void *sss_ctxt = NULL; ++ time_t age = time(NULL); ++ char buf[MAX_ERR_BUF]; ++ char *value = NULL; ++ char *s_key; ++ int ret; ++ ++ source = ap->entry->current; ++ ap->entry->current = NULL; ++ master_source_current_signal(ap->entry); ++ ++ mc = source->mc; ++ ++ if (!setautomntent(ap->logopt, ctxt, ctxt->mapname, &sss_ctxt)) ++ return NSS_STATUS_UNAVAIL; ++ ++ ret = ctxt->getautomntbyname_r(qKey, &value, sss_ctxt); ++ if (ret && ret != ENOENT) { ++ char *estr = strerror_r(ret, buf, MAX_ERR_BUF); ++ error(ap->logopt, ++ MODPREFIX "getautomntbyname_r: %s", estr); ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ if (value) ++ free(value); ++ return NSS_STATUS_UNAVAIL; ++ } ++ if (ret != ENOENT) { ++ /* ++ * TODO: implement sun % hack for key translation for ++ * mixed case keys in schema that are single case only. ++ */ ++ s_key = sanitize_path(qKey, qKey_len, ap->type, ap->logopt); ++ if (!s_key) { ++ free(value); ++ value = NULL; ++ goto wild; ++ } ++ cache_writelock(mc); ++ ret = cache_update(mc, source, s_key, value, age); ++ cache_unlock(mc); ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ free(s_key); ++ free(value); ++ return NSS_STATUS_SUCCESS; ++ } ++ ++wild: ++ ret = ctxt->getautomntbyname_r("/", &value, sss_ctxt); ++ if (ret && ret != ENOENT) { ++ char *estr = strerror_r(ret, buf, MAX_ERR_BUF); ++ error(ap->logopt, ++ MODPREFIX "getautomntbyname_r: %s", estr); ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ if (value) ++ free(value); ++ return NSS_STATUS_UNAVAIL; ++ } ++ if (ret == ENOENT) { ++ ret = ctxt->getautomntbyname_r("*", &value, sss_ctxt); ++ if (ret && ret != ENOENT) { ++ char *estr = strerror_r(ret, buf, MAX_ERR_BUF); ++ error(ap->logopt, ++ MODPREFIX "getautomntbyname_r: %s", estr); ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ if (value) ++ free(value); ++ return NSS_STATUS_UNAVAIL; ++ } ++ } ++ ++ if (ret == ENOENT) { ++ /* Failed to find wild entry, update cache if needed */ ++ cache_writelock(mc); ++ we = cache_lookup_distinct(mc, "*"); ++ if (we) { ++ /* Wildcard entry existed and is now gone */ ++ if (we->source == source) { ++ cache_delete(mc, "*"); ++ source->stale = 1; ++ } ++ } ++ ++ /* Not found in the map but found in the cache */ ++ struct mapent *exists = cache_lookup_distinct(mc, qKey); ++ if (exists && exists->source == source) { ++ if (exists->mapent) { ++ free(exists->mapent); ++ exists->mapent = NULL; ++ source->stale = 1; ++ exists->status = 0; ++ } ++ } ++ cache_unlock(mc); ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ return NSS_STATUS_NOTFOUND; ++ } ++ ++ cache_writelock(mc); ++ /* Wildcard not in map but now is */ ++ we = cache_lookup_distinct(mc, "*"); ++ if (!we) ++ source->stale = 1; ++ ret = cache_update(mc, source, "*", value, age); ++ cache_unlock(mc); ++ ++ endautomntent(ap->logopt, ctxt, &sss_ctxt); ++ free(value); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static int check_map_indirect(struct autofs_point *ap, ++ char *key, int key_len, ++ struct lookup_context *ctxt) ++{ ++ struct map_source *source; ++ struct mapent_cache *mc; ++ struct mapent *me; ++ time_t now = time(NULL); ++ time_t t_last_read; ++ int ret, cur_state; ++ ++ source = ap->entry->current; ++ ap->entry->current = NULL; ++ master_source_current_signal(ap->entry); ++ ++ mc = source->mc; ++ ++ master_source_current_wait(ap->entry); ++ ap->entry->current = source; ++ ++ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); ++ ret = lookup_one(ap, key, key_len, ctxt); ++ if (ret == NSS_STATUS_NOTFOUND) { ++ pthread_setcancelstate(cur_state, NULL); ++ return ret; ++ } else if (ret == NSS_STATUS_UNAVAIL) { ++ /* ++ * If the server is down and the entry exists in the cache ++ * and belongs to this map return success and use the entry. ++ */ ++ struct mapent *exists = cache_lookup(mc, key); ++ if (exists && exists->source == source) { ++ pthread_setcancelstate(cur_state, NULL); ++ return NSS_STATUS_SUCCESS; ++ } ++ pthread_setcancelstate(cur_state, NULL); ++ ++ warn(ap->logopt, ++ MODPREFIX "lookup for %s failed: connection failed", key); ++ ++ return ret; ++ } ++ pthread_setcancelstate(cur_state, NULL); ++ ++ /* ++ * Check for map change and update as needed for ++ * following cache lookup. ++ */ ++ cache_readlock(mc); ++ t_last_read = ap->exp_runfreq + 1; ++ me = cache_lookup_first(mc); ++ while (me) { ++ if (me->source == source) { ++ t_last_read = now - me->age; ++ break; ++ } ++ me = cache_lookup_next(mc, me); ++ } ++ cache_unlock(mc); ++ ++ if (t_last_read > ap->exp_runfreq && ret & CHE_UPDATED) ++ source->stale = 1; ++ ++ cache_readlock(mc); ++ me = cache_lookup_distinct(mc, "*"); ++ if (ret == CHE_MISSING && (!me || me->source != source)) { ++ cache_unlock(mc); ++ return NSS_STATUS_NOTFOUND; ++ } ++ cache_unlock(mc); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++int lookup_mount(struct autofs_point *ap, const char *name, int name_len, void *context) ++{ ++ struct lookup_context *ctxt = (struct lookup_context *) context; ++ struct map_source *source; ++ struct mapent_cache *mc; ++ struct mapent *me; ++ char key[KEY_MAX_LEN + 1]; ++ int key_len; ++ char *mapent = NULL; ++ char mapent_buf[MAPENT_MAX_LEN + 1]; ++ int ret; ++ ++ source = ap->entry->current; ++ ap->entry->current = NULL; ++ master_source_current_signal(ap->entry); ++ ++ mc = source->mc; ++ ++ debug(ap->logopt, MODPREFIX "looking up %s", name); ++ ++ key_len = snprintf(key, KEY_MAX_LEN + 1, "%s", name); ++ if (key_len > KEY_MAX_LEN) ++ return NSS_STATUS_NOTFOUND; ++ ++ /* Check if we recorded a mount fail for this key anywhere */ ++ me = lookup_source_mapent(ap, key, LKP_DISTINCT); ++ if (me) { ++ if (me->status >= time(NULL)) { ++ cache_unlock(me->mc); ++ 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) ++ cache_delete(smc, key); ++ cache_unlock(smc); ++ } ++ } ++ } ++ ++ /* ++ * We can't check the direct mount map as if it's not in ++ * the map cache already we never get a mount lookup, so ++ * we never know about it. ++ */ ++ if (ap->type == LKP_INDIRECT && *key != '/') { ++ int status; ++ char *lkp_key; ++ ++ cache_readlock(mc); ++ me = cache_lookup_distinct(mc, key); ++ if (me && me->multi) ++ lkp_key = strdup(me->multi->key); ++ else ++ lkp_key = strdup(key); ++ cache_unlock(mc); ++ ++ if (!lkp_key) ++ return NSS_STATUS_UNKNOWN; ++ ++ master_source_current_wait(ap->entry); ++ ap->entry->current = source; ++ ++ status = check_map_indirect(ap, lkp_key, strlen(lkp_key), ctxt); ++ free(lkp_key); ++ if (status) ++ return status; ++ } ++ ++ cache_readlock(mc); ++ me = cache_lookup(mc, key); ++ /* Stale mapent => check for entry in alternate source or wildcard */ ++ if (me && !me->mapent) { ++ while ((me = cache_lookup_key_next(me))) ++ if (me->source == source) ++ break; ++ if (!me) ++ me = cache_lookup_distinct(mc, "*"); ++ } ++ if (me && me->mapent && (me->source == source || *me->key == '/')) { ++ strcpy(mapent_buf, me->mapent); ++ mapent = mapent_buf; ++ } ++ cache_unlock(mc); ++ ++ if (!mapent) ++ return NSS_STATUS_TRYAGAIN; ++ ++ master_source_current_wait(ap->entry); ++ ap->entry->current = source; ++ ++ debug(ap->logopt, MODPREFIX "%s -> %s", key, mapent); ++ ret = ctxt->parse->parse_mount(ap, key, key_len, ++ mapent, ctxt->parse->context); ++ if (ret) { ++ time_t now = time(NULL); ++ int rv = CHE_OK; ++ ++ /* Record the the mount fail in the cache */ ++ cache_writelock(mc); ++ me = cache_lookup_distinct(mc, key); ++ if (!me) ++ rv = cache_update(mc, source, key, NULL, now); ++ if (rv != CHE_FAIL) { ++ me = cache_lookup_distinct(mc, key); ++ me->status = now + ap->negative_timeout; ++ } ++ cache_unlock(mc); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++int lookup_done(void *context) ++{ ++ struct lookup_context *ctxt = (struct lookup_context *) context; ++ int rv = close_parse(ctxt->parse); ++ dlclose(ctxt->dlhandle); ++ free(ctxt); ++ return rv; ++} diff --git a/autofs-5.0.6-fix-rpc-build-error.patch b/autofs-5.0.6-fix-rpc-build-error.patch new file mode 100644 index 0000000..13b9057 --- /dev/null +++ b/autofs-5.0.6-fix-rpc-build-error.patch @@ -0,0 +1,35 @@ +autofs-5.0.6 - fix rpc build error + +From: Leonardo Chiquitto + +The compile error looks like a problem in the libtirpc interface code rewrite +(commit f8ea2a5762 - autofs-5.0.6 - fix ipv6 rpc calls). The following patch +should fix it. +--- + + CHANGELOG | 1 + + lib/rpc_subs.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + + +--- autofs-5.0.6.orig/CHANGELOG ++++ autofs-5.0.6/CHANGELOG +@@ -20,6 +20,7 @@ + - add systemd unit support. + - remove empty command line arguments (passed by systemd). + - fix improve mount location error reporting. ++- fix rpc build error. + + 28/06/2011 autofs-5.0.6 + ----------------------- +--- autofs-5.0.6.orig/lib/rpc_subs.c ++++ autofs-5.0.6/lib/rpc_subs.c +@@ -154,7 +154,7 @@ static CLIENT *rpc_do_create_client(stru + { + CLIENT *client = NULL; + struct sockaddr_in in4_laddr; +- struct sockaddr_in in4_raddr; ++ struct sockaddr_in *in4_raddr; + int type, proto; + socklen_t slen; + diff --git a/autofs-5.0.6-teach-automount-about-sss-source.patch b/autofs-5.0.6-teach-automount-about-sss-source.patch new file mode 100644 index 0000000..44df13a --- /dev/null +++ b/autofs-5.0.6-teach-automount-about-sss-source.patch @@ -0,0 +1,93 @@ +autofs-5.0.6 - teach automount about sss source + +From: Ian Kent + +Add parser and conditional checks to automount to handle sss source. +Note, the parsing probably needs more work, both for master map entries +and map entries, to attempt to narrow invalid map names passed down to +lower level modules. For now we have to just handle these failures in +the lookup module. +--- + + CHANGELOG | 1 + + daemon/lookup.c | 1 + + lib/master_tok.l | 2 +- + lib/nss_parse.y | 6 ++++-- + modules/parse_sun.c | 2 +- + 5 files changed, 8 insertions(+), 4 deletions(-) + + +diff --git a/CHANGELOG b/CHANGELOG +index ba6f90c..e276396 100644 +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -24,6 +24,7 @@ + - fix improve mount location error reporting. + - fix fix wait for master source mutex. + - add sss lookup module. ++- teach automount about sss source. + + 28/06/2011 autofs-5.0.6 + ----------------------- +diff --git a/daemon/lookup.c b/daemon/lookup.c +index 098588c..de7c817 100644 +--- a/daemon/lookup.c ++++ b/daemon/lookup.c +@@ -177,6 +177,7 @@ int lookup_nss_read_master(struct master *master, time_t age) + !strncmp(name, "nisplus:", 8) || + !strncmp(name, "ldap:", 5) || + !strncmp(name, "ldaps:", 6) || ++ !strncmp(name, "sss:", 4) || + !strncmp(name, "dir:", 4)) { + strncpy(source, name, tmp - name); + +diff --git a/lib/master_tok.l b/lib/master_tok.l +index 77e9a26..0d6edb7 100644 +--- a/lib/master_tok.l ++++ b/lib/master_tok.l +@@ -118,7 +118,7 @@ DNNAMESTR2 ([[:alnum:]_.\-]+) + INTMAP (-hosts|-null) + MULTI ((multi)(,(sun|hesiod))?(:{OPTWS}|{WS})) + MULTISEP ([\-]{2}[[:blank:]]+) +-MTYPE ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?(:{OPTWS}|{WS})) ++MTYPE ((file|program|sss|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?(:{OPTWS}|{WS})) + + + OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS}) +diff --git a/lib/nss_parse.y b/lib/nss_parse.y +index 3bda6b3..a39fda4 100644 +--- a/lib/nss_parse.y ++++ b/lib/nss_parse.y +@@ -82,7 +82,8 @@ nss_source: SOURCE + { + if (!strcmp($1, "files") || !strcmp($1, "yp") || + !strcmp($1, "nis") || !strcmp($1, "ldap") || +- !strcmp($1, "nisplus") || !strcmp($1, "hesiod")) ++ !strcmp($1, "nisplus") || !strcmp($1, "hesiod") || ++ !strcmp($1, "sss")) + src = add_source(nss_list, $1); + else + nss_ignore($1); +@@ -92,7 +93,8 @@ nss_source: SOURCE + + if (!strcmp($1, "files") || !strcmp($1, "yp") || + !strcmp($1, "nis") || !strcmp($1, "ldap") || +- !strcmp($1, "nisplus") || !strcmp($1, "hesiod")) { ++ !strcmp($1, "nisplus") || !strcmp($1, "hesiod") || ++ !strcmp($1, "sss")) { + src = add_source(nss_list, $1); + for (a = 0; a < NSS_STATUS_MAX; a++) { + if (act[a].action != NSS_ACTION_UNKNOWN) { +diff --git a/modules/parse_sun.c b/modules/parse_sun.c +index e9d94c7..d7e74e2 100644 +--- a/modules/parse_sun.c ++++ b/modules/parse_sun.c +@@ -880,7 +880,7 @@ static int validate_location(unsigned int logopt, char *loc) + !strncmp(ptr, "file:", 5) || !strncmp(ptr, "yp:", 3) || + !strncmp(ptr, "nis:", 4) || !strncmp(ptr, "nisplus:", 8) || + !strncmp(ptr, "ldap:", 5) || !strncmp(ptr, "ldaps:", 6) || +- !strncmp(ptr, "dir:", 4)) ++ !strncmp(ptr, "sss:", 4) || !strncmp(ptr, "dir:", 4)) + return 1; + error(logopt, + "expected colon delimeter not found in location %s", diff --git a/autofs.spec b/autofs.spec index bbfa4cd..7d179ca 100644 --- a/autofs.spec +++ b/autofs.spec @@ -8,7 +8,7 @@ Summary: A tool for automatically mounting and unmounting filesystems Name: autofs Version: 5.0.6 -Release: 9%{?dist} +Release: 10%{?dist} Epoch: 1 License: GPLv2+ Group: System Environment/Daemons @@ -36,6 +36,9 @@ Patch20: autofs-5.0.6-fix-MNT_DETACH-define.patch Patch21: autofs-5.0.6-remove-empty-command-line-arguments.patch Patch22: autofs-5.0.6-fix-fix-wait-for-master-source-mutex.patch Patch23: autofs-5.0.6-fix-improve-mount-location-error-reporting.patch +Patch24: autofs-5.0.6-fix-rpc-build-error.patch +Patch25: autofs-5.0.6-add-sss-lookup-module.patch +Patch26: autofs-5.0.6-teach-automount-about-sss-source.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %if %{with_systemd} BuildRequires: systemd-units @@ -114,6 +117,9 @@ echo %{version}-%{release} > .version %patch21 -p1 %patch22 -p1 %patch23 -p1 +%patch24 -p1 +%patch25 -p1 +%patch26 -p1 %build #CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --libdir=%{_libdir} @@ -197,6 +203,11 @@ fi %dir /etc/auto.master.d %changelog +* Tue Feb 7 2012 Ian Kent - 1:5.0.6-10 +- fix rpc build error. +- add sss lookup module. +- teach automount about sss source. + * Mon Jan 23 2012 Ian Kent - 1:5.0.6-9 - add correct patch for "fix improve mount location error reporting". - add correct patch for "fix fix wait for master source mutex".