aboutsummaryrefslogtreecommitdiff
path: root/lib/expand.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2012-10-08 17:36:05 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2012-10-08 17:36:05 +0300
commit9b56a5b05db6630a667ad0c9b16ec45a4e52044d (patch)
treeeca8c25be90428656c24f76f68899c22d0091528 /lib/expand.c
parent04f58aaf7a6f27e3b79e8f5ccffeb006db56aeaf (diff)
downloadeclat-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.c75
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;
+}

Return to:

Send suggestions and report system problems to the System administrator.