diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-10-08 17:36:05 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-10-08 17:36:05 +0300 |
commit | 9b56a5b05db6630a667ad0c9b16ec45a4e52044d (patch) | |
tree | eca8c25be90428656c24f76f68899c22d0091528 /lib/expand.c | |
parent | 04f58aaf7a6f27e3b79e8f5ccffeb006db56aeaf (diff) | |
download | eclat-9b56a5b05db6630a667ad0c9b16ec45a4e52044d.tar.gz eclat-9b56a5b05db6630a667ad0c9b16ec45a4e52044d.tar.bz2 |
Improve LDAP map.
* lib/expand.c: New file.
* lib/getans.c: New file.
* lib/Makefile.am: Add new files.
* lib/ldapmap.c (ldap_map) <passfile,prompt>: New members.
(ldapmap_kw) <passfile,prompt>: New keywords.
(ldap_map_open): Prompt for undefined credentials if the
"prompt" statement is set to true.
(ldap_map_get): Use eclat_expand_kw to expand the filter.
* lib/libeclat.h (eclat_trimnl,eclat_getans)
(eclat_expand_kw): New protos.
* lib/map.c (eclat_map_get): Use eclat_expand_kw.
* src/eclat.c (read_format): Likewise.
Diffstat (limited to 'lib/expand.c')
-rw-r--r-- | lib/expand.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/expand.c b/lib/expand.c new file mode 100644 index 0000000..2db35e0 --- /dev/null +++ b/lib/expand.c @@ -0,0 +1,75 @@ +/* This file is part of Eclat. + Copyright (C) 2012 Sergey Poznyakoff. + + Eclat 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; either version 3, or (at your option) + any later version. + + Eclat is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eclat. If not, see <http://www.gnu.org/licenses/>. */ + +#include "libeclat.h" +#include "wordsplit.h" +#include <sysexits.h> +#include <termios.h> +#include <unistd.h> +#include <pwd.h> + +char * +eclat_expand_kw(const char *input, const char **ukw) +{ + struct wordsplit ws; + char *ret; + static char **defkw; + static size_t defkwsize = 4; + const char **kw; + size_t kwsize; + int i; + + if (!defkw) { + uid_t uid = getuid(); + struct passwd *pw = getpwuid(uid); + if (!pw) + die(EX_UNAVAILABLE, + "cannot determine user name (uid=%lu)", + (unsigned long) uid); + defkw = grecs_calloc(defkwsize, sizeof(defkw[0])); + defkw[0] = "user"; + defkw[1] = grecs_strdup(pw->pw_name); + defkw[2] = "home"; + defkw[3] = grecs_strdup(pw->pw_dir); + } + + if (ukw) { + for (i = 0; ukw[i]; i++); + kwsize = defkwsize + i + 1; + } else + kwsize = defkwsize + 1; + kw = grecs_calloc(kwsize, sizeof(kw[0])); + i = 0; + if (ukw) + for (; ukw[i]; i++) + kw[i] = ukw[i]; + for (; i < defkwsize; i++) + kw[i] = defkw[i]; + kw[i] = NULL; + + ws.ws_env = kw; + ws.ws_error = err; + if (wordsplit(input, &ws, + WRDSF_NOSPLIT | WRDSF_NOCMD | + WRDSF_ENV | WRDSF_ENV_KV | WRDSF_WARNUNDEF | WRDSF_ERROR)) + die(EX_SOFTWARE, "error expanding pattern %s: %s", + input, wordsplit_strerror(&ws)); + free(kw); + ret = ws.ws_wordv[0]; + ws.ws_wordv[0] = NULL; + wordsplit_free(&ws); + return ret; +} |