1 diff --git a/CHANGELOG b/CHANGELOG
2 index 91903e9..6b16b0f 100644
6 -----------------------
7 - include krb5.h in lookup_ldap.h (some openssl doesn't implicitly include it).
8 - correct initialization of local var in parse_server_string.
9 +- add missing "multi" map support.
11 18/06/2007 autofs-5.0.2
12 -----------------------
13 diff --git a/daemon/lookup.c b/daemon/lookup.c
14 index 06fcecc..70b9e02 100644
17 @@ -456,8 +456,12 @@ int lookup_nss_read_map(struct autofs_point *ap, struct map_source *source, time
22 - "reading map %s %s", map->type, map->argv[0]);
23 + if (!strncmp(map->type, "multi", 5))
24 + debug(ap->logopt, "reading multi map");
27 + "reading map %s %s",
28 + map->type, map->argv[0]);
29 result = do_read_map(ap, map, age);
32 diff --git a/include/automount.h b/include/automount.h
33 index 85e6e9c..106ed0a 100644
34 --- a/include/automount.h
35 +++ b/include/automount.h
36 @@ -192,6 +192,7 @@ char *cache_get_offset(const char *prefix, char *offset, int start, struct list_
37 /* Utility functions */
39 char **add_argv(int argc, char **argv, char *str);
40 +char **append_argv(int argc1, char **argv1, int argc2, char **argv2);
41 const char **copy_argv(int argc, const char **argv);
42 int compare_argv(int argc1, const char **argv1, int argc2, const char **argv2);
43 int free_argv(int argc, const char **argv);
44 diff --git a/lib/args.c b/lib/args.c
45 index 9e35388..fbfb004 100644
48 @@ -62,6 +62,45 @@ char **add_argv(int argc, char **argv, char *str)
52 +char **append_argv(int argc1, char **argv1, int argc2, char **argv2)
58 + len = argc1 + argc2;
59 + vector_size = (len + 1) * sizeof(char *);
60 + vector = (char **) realloc(argv1, vector_size);
62 + free_argv(argc1, (const char **) argv1);
63 + free_argv(argc2, (const char **) argv2);
67 + for (i = argc1, j = 0; i <= len; i++, j++) {
69 + vector[i] = strdup(argv2[j]);
71 + error(LOGOPT_ANY, "failed to strdup arg");
79 + free_argv(len, (const char **) vector);
80 + free_argv(argc2, (const char **) argv2);
86 + free_argv(argc2, (const char **) argv2);
91 const char **copy_argv(int argc, const char **argv)
94 diff --git a/lib/master_parse.y b/lib/master_parse.y
95 index 8d2be02..f9cba05 100644
96 --- a/lib/master_parse.y
97 +++ b/lib/master_parse.y
103 #include <sys/ioctl.h>
105 #include "automount.h"
106 @@ -44,6 +45,7 @@ extern void master_set_scan_buffer(const char *);
107 static char *master_strdup(char *);
108 static void local_init_vars(void);
109 static void local_free_vars(void);
110 +static int add_multi_mapstr(void);
112 static int master_error(const char *s);
113 static int master_notify(const char *s);
114 @@ -53,6 +55,8 @@ static char *type;
117 static unsigned ghost;
118 +static char **tmp_argv;
119 +static int tmp_argc;
120 static char **local_argv;
121 static int local_argc;
123 @@ -89,7 +93,7 @@ static int master_fprintf(FILE *, char *, ...);
126 %token OPT_TIMEOUT OPT_NOGHOST OPT_GHOST OPT_VERBOSE OPT_DEBUG
127 -%token COLON COMMA NL
128 +%token COLON COMMA NL DDASH
130 %type <strtype> options
132 @@ -103,6 +107,7 @@ static int master_fprintf(FILE *, char *, ...);
133 %token <strtype> NILL
134 %token <strtype> SPACE
135 %token <strtype> EQUAL
136 +%token <strtype> MULTITYPE
137 %token <strtype> MAPTYPE
138 %token <strtype> DNSERVER
139 %token <strtype> DNATTR
140 @@ -126,7 +131,7 @@ file: {
147 path = master_strdup($1);
149 @@ -134,14 +139,49 @@ line:
154 + | PATH MULTITYPE maplist
158 + tmp = strchr($2, ':');
162 + int len = strlen($2);
163 + while (len-- && isblank($2[len]))
172 path = master_strdup($1);
174 + master_error("memory allocation error");
180 + if ((tmp = strchr($2, ',')))
183 + type = master_strdup($2);
185 + master_error("memory allocation error");
190 + format = master_strdup(tmp);
192 + master_error("memory allocation error");
198 | PATH COLON { master_notify($1); YYABORT; }
199 | PATH OPTION { master_notify($2); YYABORT; }
200 | PATH NILL { master_notify($2); YYABORT; }
201 @@ -157,25 +197,89 @@ line:
202 | COMMENT { YYABORT; }
208 + local_argc = tmp_argc;
209 + local_argv = tmp_argv;
215 + local_argc = tmp_argc;
216 + local_argv = tmp_argv;
224 + if (!add_multi_mapstr()) {
225 + master_error("memory allocation error");
232 + if (!add_multi_mapstr()) {
233 + master_error("memory allocation error");
238 + | maplist DDASH map
241 - local_argv = add_argv(local_argc, local_argv, $1);
242 + local_argv = add_argv(local_argc, local_argv, "--");
244 master_error("memory allocation error");
248 + if (!add_multi_mapstr()) {
249 + master_error("memory allocation error");
255 + | maplist DDASH map options
258 - local_argv = add_argv(local_argc, local_argv, $1);
259 + local_argv = add_argv(local_argc, local_argv, "--");
261 master_error("memory allocation error");
265 + if (!add_multi_mapstr()) {
266 + master_error("memory allocation error");
276 + tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
278 + master_error("memory allocation error");
286 + tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
288 + master_error("memory allocation error");
295 @@ -200,9 +304,9 @@ map: PATH
300 - local_argv = add_argv(local_argc, local_argv, $1);
303 + tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
305 master_error("memory allocation error");
308 @@ -227,9 +331,9 @@ map: PATH
313 - local_argv = add_argv(local_argc, local_argv, $3);
316 + tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
318 master_error("memory allocation error");
321 @@ -254,9 +358,9 @@ map: PATH
326 - local_argv = add_argv(local_argc, local_argv, $3);
329 + tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
331 master_error("memory allocation error");
334 @@ -281,25 +385,25 @@ map: PATH
339 - local_argv = add_argv(local_argc, local_argv, $3);
342 + tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
344 master_error("memory allocation error");
348 /* Add back the type for lookup_ldap.c to handle ldaps */
349 - if (*local_argv[0]) {
350 - tmp = malloc(strlen(type) + strlen(local_argv[0]) + 2);
351 + if (*tmp_argv[0]) {
352 + tmp = malloc(strlen(type) + strlen(tmp_argv[0]) + 2);
359 - strcat(tmp, local_argv[0]);
360 - free(local_argv[0]);
361 - local_argv[0] = tmp;
362 + strcat(tmp, tmp_argv[0]);
368 @@ -441,9 +545,9 @@ daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; }
373 - local_argv = add_argv(local_argc, local_argv, $1);
376 + tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
378 master_error("memory allocation error");
381 @@ -494,6 +598,8 @@ static void local_init_vars(void)
384 ghost = defaults_get_browse_mode();
390 @@ -509,8 +615,62 @@ static void local_free_vars(void)
396 free_argv(local_argc, (const char **) local_argv);
402 + free_argv(tmp_argc, (const char **) tmp_argv);
408 +static int add_multi_mapstr(void)
410 + /* We need the individual map types for a multi map */
412 + if (tmp_argc > 0 && *tmp_argv[0] == '/')
413 + type = strdup("file");
419 + char *tmp = realloc(type, strlen(type) + strlen(format) + 2);
424 + strcat(type, format);
430 + local_argv = add_argv(local_argc, local_argv, type);
437 + local_argv = append_argv(local_argc, local_argv, tmp_argc, tmp_argv);
443 + local_argc += tmp_argc;
453 void master_init_scan(void)
454 diff --git a/lib/master_tok.l b/lib/master_tok.l
455 index ee2a4eb..0548de1 100644
456 --- a/lib/master_tok.l
457 +++ b/lib/master_tok.l
458 @@ -27,6 +27,7 @@ static void master_echo(void); /* forward definition */
463 #include "master_parse.tab.h"
466 @@ -110,7 +111,9 @@ DNATTRSTR {AT_CN}|{AT_NMN}|{AT_AMN}|{AT_OU}|{AT_DC}|{AT_O}|{AT_C}
467 DNNAMESTR ([[:alnum:]_.\-]+)
469 INTMAP (-hosts|-null)
470 -MTYPE ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?)
471 +MULTI ((multi)(,(sun|hesiod))?[\:]?{OPTWS})
472 +MULTISEP ([\-]{2}[[:blank:]]+)
473 +MTYPE ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?)
476 OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
477 @@ -184,11 +187,18 @@ OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
479 {OPTWS}\\\n{OPTWS} {}
482 + strcpy(master_lval.strtype, master_text);
487 strcpy(master_lval.strtype, master_text);
491 + {MULTISEP} { return(DDASH); }
493 ":" { return(COLON); }
496 @@ -298,6 +308,11 @@ OPTTOUT (-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
498 {OPTWS}\\\n{OPTWS} {}
505 {OPTTOUT} { return(OPT_TIMEOUT); }
508 diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c
509 index 00ab28e..38ca36c 100644
510 --- a/modules/lookup_multi.c
511 +++ b/modules/lookup_multi.c
512 @@ -45,7 +45,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
513 struct lookup_context *ctxt;
514 char buf[MAX_ERR_BUF];
520 ctxt = malloc(sizeof(struct lookup_context));
521 @@ -73,7 +73,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
523 memcpy(ctxt->argl, argv, (argc + 1) * sizeof(const char *));
525 - for (i = j = an = 0; ctxt->argl[an]; an++) {
526 + for (i = an = 0; ctxt->argl[an]; an++) {
527 if (ctxt->m[i].argc == 0) {
528 ctxt->m[i].argv = &ctxt->argl[an];
530 @@ -100,9 +100,12 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
531 if (!(ctxt->m[i].mod = open_lookup(map, MODPREFIX,
532 mapfmt ? mapfmt : my_mapfmt,
534 - ctxt->m[i].argv + 1)))
535 + ctxt->m[i].argv + 1))) {
536 error(LOGOPT_ANY, MODPREFIX "error opening module");