aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac25
-rw-r--r--libpam_internal/pam_econf.c28
2 files changed, 52 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index fc5cc085..1fd06b6f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -578,6 +578,31 @@ if test "$WITH_ECONF" = "check"; then
elif test "$WITH_ECONF" = "yes"; then
PKG_CHECK_MODULES([ECONF], [libeconf >= 0.5.0], [ECONF_CFLAGS="-DUSE_ECONF=1 $ECONF_CFLAGS"], [])
fi
+if test -n "$ECONF_CFLAGS"; then
+ AC_MSG_CHECKING(for econf_readConfigWithCallback)
+ saved_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS $ECONF_CFLAGS"
+ saved_LIBS=$LIBS
+ LIBS="$LIBS $ECONF_LIBS"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+ #include <libeconf.h>
+ ]],
+ [[
+ econf_file *key_file = NULL;
+ econf_err error = ECONF_SUCCESS;
+ error = econf_newKeyFile_with_options(&key_file, "PYTHON_STYLE=1");
+ error = econf_readConfigWithCallback (&key_file, "foo", "/usr/lib", "test", "conf", "=", "#", NULL, NULL);
+ ]])],
+ [econf_readConfigWithCallback=yes], [econf_readConfigWithCallback=no])
+ AC_MSG_RESULT($econf_readConfigWithCallback)
+ if test "$econf_readConfigWithCallback" = yes; then
+ AC_DEFINE([HAVE_ECONF_READCONFIG], [1], [Define if econf_readConfigWithCallback is available])
+ fi
+ LIBS=$saved_LIBS
+ CFLAGS=$saved_CFLAGS
+fi
AC_SUBST([ECONF_CFLAGS])
AC_SUBST([ECONF_LIBS])
diff --git a/libpam_internal/pam_econf.c b/libpam_internal/pam_econf.c
index 595c122a..b3b9874d 100644
--- a/libpam_internal/pam_econf.c
+++ b/libpam_internal/pam_econf.c
@@ -18,8 +18,31 @@ econf_err pam_econf_readconfig(econf_file **key_file,
bool (*callback)(const char *filename, const void *data),
const void *callback_data)
{
- econf_err ret;
+ econf_err ret = ECONF_SUCCESS;
D(("Read configuration from directory %s and %s", etc_conf_dir, usr_conf_dir));
+
+#ifdef HAVE_ECONF_READCONFIG
+
+ char *parsing_dirs = NULL;
+ if (asprintf(&parsing_dirs, "PARSING_DIRS=%s:%s", usr_conf_dir, etc_conf_dir) < 0) {
+ ret = ECONF_NOMEM;
+ parsing_dirs = NULL;
+ }
+ if (ret == ECONF_SUCCESS)
+ ret = econf_newKeyFile_with_options(key_file, parsing_dirs);
+ if (ret == ECONF_SUCCESS)
+ ret = econf_readConfigWithCallback(key_file,
+ NULL,
+ usr_conf_dir,
+ config_name,
+ config_suffix,
+ delim,
+ comment,
+ callback, callback_data);
+ free(parsing_dirs);
+
+#else
+
ret = econf_readDirsWithCallback(key_file,
usr_conf_dir,
etc_conf_dir,
@@ -28,6 +51,9 @@ econf_err pam_econf_readconfig(econf_file **key_file,
delim,
comment,
callback, callback_data);
+
+#endif
+
return ret;
}