1 diff --git a/CHANGELOG b/CHANGELOG
2 index 6b16b0f..d66b8fc 100644
6 - include krb5.h in lookup_ldap.h (some openssl doesn't implicitly include it).
7 - correct initialization of local var in parse_server_string.
8 - add missing "multi" map support.
9 +- add multi nsswitch lookup.
11 18/06/2007 autofs-5.0.2
12 -----------------------
13 diff --git a/lib/master_parse.y b/lib/master_parse.y
14 index f9cba05..ab2895d 100644
15 --- a/lib/master_parse.y
16 +++ b/lib/master_parse.y
17 @@ -45,6 +45,7 @@ extern void master_set_scan_buffer(const char *);
18 static char *master_strdup(char *);
19 static void local_init_vars(void);
20 static void local_free_vars(void);
21 +static void trim_maptype(char *);
22 static int add_multi_mapstr(void);
24 static int master_error(const char *s);
25 @@ -141,21 +142,9 @@ line:
27 | PATH MULTITYPE maplist
31 - tmp = strchr($2, ':');
35 - int len = strlen($2);
36 - while (len-- && isblank($2[len]))
48 path = master_strdup($1);
50 @@ -312,81 +301,93 @@ map: PATH
54 - | MAPTYPE COLON PATH
61 if ((tmp = strchr($1, ',')))
64 type = master_strdup($1);
66 + master_error("memory allocation error");
71 format = master_strdup(tmp);
73 + master_error("memory allocation error");
79 - tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
80 + tmp_argv = add_argv(tmp_argc, tmp_argv, $2);
82 master_error("memory allocation error");
87 - | MAPTYPE COLON MAPNAME
94 if ((tmp = strchr($1, ',')))
97 type = master_strdup($1);
99 + master_error("memory allocation error");
104 format = master_strdup(tmp);
106 + master_error("memory allocation error");
112 - tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
113 + tmp_argv = add_argv(tmp_argc, tmp_argv, $2);
115 master_error("memory allocation error");
127 if ((tmp = strchr($1, ',')))
130 type = master_strdup($1);
132 + master_error("memory allocation error");
137 format = master_strdup(tmp);
139 + master_error("memory allocation error");
145 - tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
146 + tmp_argv = add_argv(tmp_argc, tmp_argv, $2);
148 master_error("memory allocation error");
150 @@ -396,6 +397,7 @@ map: PATH
152 tmp = malloc(strlen(type) + strlen(tmp_argv[0]) + 2);
154 + master_error("memory allocation error");
158 @@ -628,33 +630,47 @@ static void local_free_vars(void)
162 -static int add_multi_mapstr(void)
163 +static void trim_maptype(char *type)
165 - /* We need the individual map types for a multi map */
167 - if (tmp_argc > 0 && *tmp_argv[0] == '/')
168 - type = strdup("file");
173 + tmp = strchr(type, ':');
177 + int len = strlen(type);
178 + while (len-- && isblank(type[len]))
184 +static int add_multi_mapstr(void)
187 + /* If type given and format is non-null add it back */
189 + int len = strlen(type) + strlen(format) + 2;
190 + char *tmp = realloc(type, len);
195 + strcat(type, format);
201 - char *tmp = realloc(type, strlen(type) + strlen(format) + 2);
204 + local_argv = add_argv(local_argc, local_argv, type);
211 - strcat(type, format);
218 - local_argv = add_argv(local_argc, local_argv, type);
225 local_argv = append_argv(local_argc, local_argv, tmp_argc, tmp_argv);
226 @@ -667,8 +683,6 @@ static int add_multi_mapstr(void)
235 diff --git a/lib/master_tok.l b/lib/master_tok.l
236 index 0548de1..9bfeefa 100644
237 --- a/lib/master_tok.l
238 +++ b/lib/master_tok.l
239 @@ -111,9 +111,9 @@ DNATTRSTR {AT_CN}|{AT_NMN}|{AT_AMN}|{AT_OU}|{AT_DC}|{AT_O}|{AT_C}
240 DNNAMESTR ([[:alnum:]_.\-]+)
242 INTMAP (-hosts|-null)
243 -MULTI ((multi)(,(sun|hesiod))?[\:]?{OPTWS})
244 +MULTI ((multi)(,(sun|hesiod))?(:{OPTWS}|{WS}))
245 MULTISEP ([\-]{2}[[:blank:]]+)
246 -MTYPE ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?)
247 +MTYPE ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?(:{OPTWS}|{WS}))
250 OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
251 @@ -192,7 +192,7 @@ OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
257 strcpy(master_lval.strtype, master_text);
260 diff --git a/man/auto.master.5.in b/man/auto.master.5.in
261 index 0e36a6f..98afaa9 100644
262 --- a/man/auto.master.5.in
263 +++ b/man/auto.master.5.in
264 @@ -103,6 +103,10 @@ entries are used for maps.
265 .B ldap \fPor\fB ldaps
266 The map is stored in an LDAP directory. If \fBldaps\fP is used the
267 appropriate certificate must be configured in the LDAP client.
270 +This map type allows the specification of multiple maps separated
271 +by "--". These maps are searched in order to resolve key lookups.
275 diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c
276 index 38ca36c..8fa94ae 100644
277 --- a/modules/lookup_multi.c
278 +++ b/modules/lookup_multi.c
283 +#include <sys/stat.h>
285 #define MODULE_LOOKUP
286 #include "automount.h"
291 - const char *const *argv;
293 struct lookup_mod *mod;
296 @@ -40,11 +41,105 @@ struct lookup_context {
298 int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */
300 +static struct lookup_mod *nss_open_lookup(const char *format, int argc, const char **argv)
302 + struct list_head nsslist;
303 + struct list_head *head, *p;
304 + struct lookup_mod *mod;
305 + char buf[MAX_ERR_BUF], *estr;
307 + if (!argv || !argv[0])
310 + if (*argv[0] == '/')
311 + return open_lookup("file", MODPREFIX, format, argc, argv);
313 + if (!strncmp(argv[0], "file", 4) ||
314 + !strncmp(argv[0], "yp", 2) ||
315 + !strncmp(argv[0], "nisplus", 7) ||
316 + !strncmp(argv[0], "nis", 3) ||
317 + !strncmp(argv[0], "ldaps", 5) ||
318 + !strncmp(argv[0], "ldap", 4)) {
319 + const char *fmt = strchr(argv[0], ',');
324 + return open_lookup(argv[0], MODPREFIX, fmt, argc -1, argv + 1);
327 + INIT_LIST_HEAD(&nsslist);
329 + if (nsswitch_parse(&nsslist)) {
330 + if (!list_empty(&nsslist))
331 + free_sources(&nsslist);
332 + error(LOGOPT_ANY, "can't to read name service switch config.");
337 + list_for_each(p, head) {
338 + struct nss_source *this;
340 + this = list_entry(p, struct nss_source, list);
342 + if (!strcmp(this->source, "files")) {
343 + char src_file[] = "file";
344 + char src_prog[] = "program";
346 + char *type, *path, *save_argv0;
348 + path = malloc(strlen(AUTOFS_MAP_DIR) + strlen(argv[0]) + 2);
350 + estr = strerror_r(errno, buf, MAX_ERR_BUF);
351 + crit(LOGOPT_ANY, MODPREFIX "error: %s", estr);
352 + free_sources(&nsslist);
355 + strcpy(path, AUTOFS_MAP_DIR);
357 + strcat(path, argv[0]);
359 + if (stat(path, &st) == -1 || !S_ISREG(st.st_mode)) {
364 + if (st.st_mode & __S_IEXEC)
369 + save_argv0 = (char *) argv[0];
372 + mod = open_lookup(type, MODPREFIX, format, argc, argv);
374 + free_sources(&nsslist);
379 + argv[0] = save_argv0;
383 + mod = open_lookup(this->source, MODPREFIX, format, argc, argv);
385 + free_sources(&nsslist);
389 + free_sources(&nsslist);
394 int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void **context)
396 struct lookup_context *ctxt;
397 char buf[MAX_ERR_BUF];
398 - char *map, *mapfmt;
403 @@ -73,39 +168,42 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
405 memcpy(ctxt->argl, argv, (argc + 1) * sizeof(const char *));
408 for (i = an = 0; ctxt->argl[an]; an++) {
409 if (ctxt->m[i].argc == 0) {
410 - ctxt->m[i].argv = &ctxt->argl[an];
411 + args = (char **) &ctxt->argl[an];
413 if (!strcmp(ctxt->argl[an], "--")) {
414 ctxt->argl[an] = NULL;
417 + MODPREFIX "error assigning map args");
420 + ctxt->m[i].argv = copy_argv(ctxt->m[i].argc, (const char **) args);
421 + if (!ctxt->m[i].argv)
430 - for (i = 0; i < ctxt->n; i++) {
431 - if (!ctxt->m[i].argv[0]) {
432 - crit(LOGOPT_ANY, MODPREFIX "missing module name");
435 - map = strdup(ctxt->m[i].argv[0]);
437 + /* catch the last one */
439 + ctxt->m[i].argv = copy_argv(ctxt->m[i].argc, (const char **) args);
440 + if (!ctxt->m[i].argv)
444 - if ((mapfmt = strchr(map, ',')))
445 - *(mapfmt++) = '\0';
447 - if (!(ctxt->m[i].mod = open_lookup(map, MODPREFIX,
448 - mapfmt ? mapfmt : my_mapfmt,
449 - ctxt->m[i].argc - 1,
450 - ctxt->m[i].argv + 1))) {
451 + for (i = 0; i < ctxt->n; i++) {
452 + ctxt->m[i].mod = nss_open_lookup(my_mapfmt,
453 + ctxt->m[i].argc, ctxt->m[i].argv);
454 + if (!ctxt->m[i].mod) {
455 error(LOGOPT_ANY, MODPREFIX "error opening module");
463 @@ -116,9 +214,12 @@ nomem:
464 crit(LOGOPT_ANY, MODPREFIX "error: %s", estr);
467 - for (i = 0; i < ctxt->n; i++)
468 + for (i = 0; i < ctxt->n; i++) {
470 close_lookup(ctxt->m[i].mod);
471 + if (ctxt->m[i].argv)
472 + free_argv(ctxt->m[i].argc, ctxt->m[i].argv);
477 @@ -188,6 +289,8 @@ int lookup_done(void *context)
478 for (i = 0; i < ctxt->n; i++) {
480 rv = rv || close_lookup(ctxt->m[i].mod);
481 + if (ctxt->m[i].argv)
482 + free_argv(ctxt->m[i].argc, ctxt->m[i].argv);