diff options
author | Stefan Schubert <schubi@suse.de> | 2024-06-05 12:13:05 +0200 |
---|---|---|
committer | Dmitry V. Levin <ldv@strace.io> | 2024-07-02 08:00:00 +0000 |
commit | fa3295e079dbbc241906f29bde5fb71bc4172771 (patch) | |
tree | 77b6560f234c4234fade4e7a23908c492b30d05d | |
parent | bc461898448a1bf306fc094cdf6a5a197c4e2753 (diff) | |
download | pam-fa3295e079dbbc241906f29bde5fb71bc4172771.tar.gz pam-fa3295e079dbbc241906f29bde5fb71bc4172771.tar.bz2 pam-fa3295e079dbbc241906f29bde5fb71bc4172771.zip |
pam_econf_readconfig: add econf_readConfigWithCallback support
Check for econf_readConfigWithCallback() and use it if available.
Co-authored-by: Dmitry V. Levin <ldv@strace.io>
-rw-r--r-- | configure.ac | 25 | ||||
-rw-r--r-- | libpam_internal/pam_econf.c | 28 |
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; } |