Ian Kent 64001b
diff --git a/daemon/lookup.c b/daemon/lookup.c
Ian Kent 64001b
index 06fcecc..70b9e02 100644
Ian Kent 64001b
--- a/daemon/lookup.c
Ian Kent 64001b
+++ b/daemon/lookup.c
Ian Kent 64001b
@@ -456,8 +456,12 @@ int lookup_nss_read_map(struct autofs_point *ap, struct map_source *source, time
Ian Kent 64001b
 		}
Ian Kent 64001b
 
Ian Kent 64001b
 		if (map->type) {
Ian Kent 64001b
-			debug(ap->logopt,
Ian Kent 64001b
-			      "reading map %s %s", map->type, map->argv[0]);
Ian Kent 64001b
+			if (!strncmp(map->type, "multi", 5))
Ian Kent 64001b
+				debug(ap->logopt, "reading multi map");
Ian Kent 64001b
+			else
Ian Kent 64001b
+				debug(ap->logopt,
Ian Kent 64001b
+				      "reading map %s %s",
Ian Kent 64001b
+				       map->type, map->argv[0]);
Ian Kent 64001b
 			result = do_read_map(ap, map, age);
Ian Kent 64001b
 			map = map->next;
Ian Kent 64001b
 			continue;
Ian Kent 64001b
diff --git a/include/automount.h b/include/automount.h
Ian Kent 64001b
index 85e6e9c..106ed0a 100644
Ian Kent 64001b
--- a/include/automount.h
Ian Kent 64001b
+++ b/include/automount.h
Ian Kent 64001b
@@ -192,6 +192,7 @@ char *cache_get_offset(const char *prefix, char *offset, int start, struct list_
Ian Kent 64001b
 /* Utility functions */
Ian Kent 64001b
 
Ian Kent 64001b
 char **add_argv(int argc, char **argv, char *str);
Ian Kent 64001b
+char **append_argv(int argc1, char **argv1, int argc2, char **argv2);
Ian Kent 64001b
 const char **copy_argv(int argc, const char **argv);
Ian Kent 64001b
 int compare_argv(int argc1, const char **argv1, int argc2, const char **argv2);
Ian Kent 64001b
 int free_argv(int argc, const char **argv);
Ian Kent 64001b
diff --git a/lib/args.c b/lib/args.c
Ian Kent 64001b
index 9e35388..fbfb004 100644
Ian Kent 64001b
--- a/lib/args.c
Ian Kent 64001b
+++ b/lib/args.c
Ian Kent 64001b
@@ -62,6 +62,45 @@ char **add_argv(int argc, char **argv, char *str)
Ian Kent 64001b
 	return vector;
Ian Kent 64001b
 }
Ian Kent 64001b
 
Ian Kent 64001b
+char **append_argv(int argc1, char **argv1, int argc2, char **argv2)
Ian Kent 64001b
+{
Ian Kent 64001b
+	char **vector;
Ian Kent 64001b
+	size_t vector_size;
Ian Kent 64001b
+	int len, i, j;
Ian Kent 64001b
+
Ian Kent 64001b
+	len = argc1 + argc2;
Ian Kent 64001b
+	vector_size = (len + 1) * sizeof(char *);
Ian Kent 64001b
+	vector = (char **) realloc(argv1, vector_size);
Ian Kent 64001b
+	if (!vector) {
Ian Kent 64001b
+		free_argv(argc1, (const char **) argv1);
Ian Kent 64001b
+		free_argv(argc2, (const char **) argv2);
Ian Kent 64001b
+		return NULL;
Ian Kent 64001b
+	}
Ian Kent 64001b
+
Ian Kent 64001b
+	for (i = argc1, j = 0; i <= len; i++, j++) {
Ian Kent 64001b
+		if (argv2[j]) {
Ian Kent 64001b
+			vector[i] = strdup(argv2[j]);
Ian Kent 64001b
+			if (!vector[i]) {
Ian Kent 64001b
+				error(LOGOPT_ANY, "failed to strdup arg");
Ian Kent 64001b
+				break;
Ian Kent 64001b
+			}
Ian Kent 64001b
+		} else
Ian Kent 64001b
+			vector[i] = NULL;
Ian Kent 64001b
+	}
Ian Kent 64001b
+
Ian Kent 64001b
+	if (i < len) {
Ian Kent 64001b
+		free_argv(len, (const char **) vector);
Ian Kent 64001b
+		free_argv(argc2, (const char **) argv2);
Ian Kent 64001b
+		return NULL;
Ian Kent 64001b
+	}
Ian Kent 64001b
+
Ian Kent 64001b
+	vector[len] = NULL;
Ian Kent 64001b
+
Ian Kent 64001b
+	free_argv(argc2, (const char **) argv2);
Ian Kent 64001b
+
Ian Kent 64001b
+	return vector;
Ian Kent 64001b
+}
Ian Kent 64001b
+
Ian Kent 64001b
 const char **copy_argv(int argc, const char **argv)
Ian Kent 64001b
 {
Ian Kent 64001b
 	char **vector;
Ian Kent 64001b
diff --git a/lib/master_parse.y b/lib/master_parse.y
Ian Kent 64001b
index 8d2be02..f9cba05 100644
Ian Kent 64001b
--- a/lib/master_parse.y
Ian Kent 64001b
+++ b/lib/master_parse.y
Ian Kent 64001b
@@ -22,6 +22,7 @@
Ian Kent 64001b
 #include <string.h>
Ian Kent 64001b
 #include <stdlib.h>
Ian Kent 64001b
 #include <stdarg.h>
Ian Kent 64001b
+#include <ctype.h>
Ian Kent 64001b
 #include <sys/ioctl.h>
Ian Kent 64001b
 
Ian Kent 64001b
 #include "automount.h"
Ian Kent 64001b
@@ -44,6 +45,7 @@ extern void master_set_scan_buffer(const char *);
Ian Kent 64001b
 static char *master_strdup(char *);
Ian Kent 64001b
 static void local_init_vars(void);
Ian Kent 64001b
 static void local_free_vars(void);
Ian Kent 64001b
+static int add_multi_mapstr(void);
Ian Kent 64001b
 
Ian Kent 64001b
 static int master_error(const char *s);
Ian Kent 64001b
 static int master_notify(const char *s);
Ian Kent 64001b
@@ -53,6 +55,8 @@ static char *type;
Ian Kent 64001b
 static char *format;
Ian Kent 64001b
 static long timeout;
Ian Kent 64001b
 static unsigned ghost;
Ian Kent 64001b
+static char **tmp_argv;
Ian Kent 64001b
+static int tmp_argc;
Ian Kent 64001b
 static char **local_argv;
Ian Kent 64001b
 static int local_argc;
Ian Kent 64001b
 
Ian Kent 64001b
@@ -89,7 +93,7 @@ static int master_fprintf(FILE *, char *, ...);
Ian Kent 64001b
 %token COMMENT
Ian Kent 64001b
 %token MAP
Ian Kent 64001b
 %token OPT_TIMEOUT OPT_NOGHOST OPT_GHOST OPT_VERBOSE OPT_DEBUG
Ian Kent 64001b
-%token COLON COMMA NL
Ian Kent 64001b
+%token COLON COMMA NL DDASH
Ian Kent 64001b
 %type <strtype> map
Ian Kent 64001b
 %type <strtype> options
Ian Kent 64001b
 %type <strtype> dn
Ian Kent 64001b
@@ -103,6 +107,7 @@ static int master_fprintf(FILE *, char *, ...);
Ian Kent 64001b
 %token <strtype> NILL
Ian Kent 64001b
 %token <strtype> SPACE
Ian Kent 64001b
 %token <strtype> EQUAL
Ian Kent 64001b
+%token <strtype> MULTITYPE
Ian Kent 64001b
 %token <strtype> MAPTYPE
Ian Kent 64001b
 %token <strtype> DNSERVER
Ian Kent 64001b
 %token <strtype> DNATTR
Ian Kent 64001b
@@ -126,7 +131,7 @@ file: {
Ian Kent 64001b
 	;
Ian Kent 64001b
 
Ian Kent 64001b
 line:
Ian Kent 64001b
-	| PATH map
Ian Kent 64001b
+	| PATH mapspec
Ian Kent 64001b
 	{
Ian Kent 64001b
 		path = master_strdup($1);
Ian Kent 64001b
 		if (!path) {
Ian Kent 64001b
@@ -134,14 +139,49 @@ line:
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
 		}
Ian Kent 64001b
 	}
Ian Kent 64001b
-	| PATH map options
Ian Kent 64001b
+	| PATH MULTITYPE maplist
Ian Kent 64001b
 	{
Ian Kent 64001b
+		char *tmp;
Ian Kent 64001b
+
Ian Kent 64001b
+		tmp = strchr($2, ':');
Ian Kent 64001b
+		if (tmp)
Ian Kent 64001b
+			*tmp = '\0';
Ian Kent 64001b
+		else {
Ian Kent 64001b
+			int len = strlen($2);
Ian Kent 64001b
+			while (len-- && isblank($2[len]))
Ian Kent 64001b
+				$2[len] = '\0';
Ian Kent 64001b
+			if (len < 4) {
Ian Kent 64001b
+				master_notify($2);
Ian Kent 64001b
+				local_free_vars();
Ian Kent 64001b
+				YYABORT;
Ian Kent 64001b
+			}
Ian Kent 64001b
+		}
Ian Kent 64001b
+
Ian Kent 64001b
 		path = master_strdup($1);
Ian Kent 64001b
 		if (!path) {
Ian Kent 64001b
+			master_error("memory allocation error");
Ian Kent 64001b
 			local_free_vars();
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
 		}
Ian Kent 64001b
-	} 
Ian Kent 64001b
+
Ian Kent 64001b
+		if ((tmp = strchr($2, ',')))
Ian Kent 64001b
+			*tmp++ = '\0';
Ian Kent 64001b
+
Ian Kent 64001b
+		type = master_strdup($2);
Ian Kent 64001b
+		if (!type) {
Ian Kent 64001b
+			master_error("memory allocation error");
Ian Kent 64001b
+			local_free_vars();
Ian Kent 64001b
+			YYABORT;
Ian Kent 64001b
+		}
Ian Kent 64001b
+		if (tmp) {
Ian Kent 64001b
+			format = master_strdup(tmp);
Ian Kent 64001b
+			if (!format) {
Ian Kent 64001b
+				master_error("memory allocation error");
Ian Kent 64001b
+				local_free_vars();
Ian Kent 64001b
+				YYABORT;
Ian Kent 64001b
+			}
Ian Kent 64001b
+		}
Ian Kent 64001b
+	}
Ian Kent 64001b
 	| PATH COLON { master_notify($1); YYABORT; }
Ian Kent 64001b
 	| PATH OPTION { master_notify($2); YYABORT; }
Ian Kent 64001b
 	| PATH NILL { master_notify($2); YYABORT; }
Ian Kent 64001b
@@ -157,25 +197,89 @@ line:
Ian Kent 64001b
 	| COMMENT { YYABORT; }
Ian Kent 64001b
 	;
Ian Kent 64001b
 
Ian Kent 64001b
-map:	PATH
Ian Kent 64001b
+mapspec: map
Ian Kent 64001b
+	{
Ian Kent 64001b
+		local_argc = tmp_argc;
Ian Kent 64001b
+		local_argv = tmp_argv;
Ian Kent 64001b
+		tmp_argc = 0;
Ian Kent 64001b
+		tmp_argv = NULL;
Ian Kent 64001b
+	}
Ian Kent 64001b
+	| map options
Ian Kent 64001b
+	{
Ian Kent 64001b
+		local_argc = tmp_argc;
Ian Kent 64001b
+		local_argv = tmp_argv;
Ian Kent 64001b
+		tmp_argc = 0;
Ian Kent 64001b
+		tmp_argv = NULL;
Ian Kent 64001b
+	}
Ian Kent 64001b
+	;
Ian Kent 64001b
+
Ian Kent 64001b
+maplist: map
Ian Kent 64001b
+	{
Ian Kent 64001b
+		if (!add_multi_mapstr()) {
Ian Kent 64001b
+			master_error("memory allocation error");
Ian Kent 64001b
+			local_free_vars();
Ian Kent 64001b
+			YYABORT;
Ian Kent 64001b
+		}
Ian Kent 64001b
+	}
Ian Kent 64001b
+	| map options
Ian Kent 64001b
+	{
Ian Kent 64001b
+		if (!add_multi_mapstr()) {
Ian Kent 64001b
+			master_error("memory allocation error");
Ian Kent 64001b
+			local_free_vars();
Ian Kent 64001b
+			YYABORT;
Ian Kent 64001b
+		}
Ian Kent 64001b
+	}
Ian Kent 64001b
+	| maplist DDASH map
Ian Kent 64001b
 	{
Ian Kent 64001b
 		local_argc++;
Ian Kent 64001b
-		local_argv = add_argv(local_argc, local_argv, $1);
Ian Kent 64001b
+		local_argv = add_argv(local_argc, local_argv, "--");
Ian Kent 64001b
 		if (!local_argv) {
Ian Kent 64001b
 			master_error("memory allocation error");
Ian Kent 64001b
 			local_free_vars();
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
 		}
Ian Kent 64001b
+		if (!add_multi_mapstr()) {
Ian Kent 64001b
+			master_error("memory allocation error");
Ian Kent 64001b
+			local_free_vars();
Ian Kent 64001b
+			YYABORT;
Ian Kent 64001b
+		}
Ian Kent 64001b
 	}
Ian Kent 64001b
-	| MAPNAME
Ian Kent 64001b
+	| maplist DDASH map options
Ian Kent 64001b
 	{
Ian Kent 64001b
 		local_argc++;
Ian Kent 64001b
-		local_argv = add_argv(local_argc, local_argv, $1);
Ian Kent 64001b
+		local_argv = add_argv(local_argc, local_argv, "--");
Ian Kent 64001b
 		if (!local_argv) {
Ian Kent 64001b
 			master_error("memory allocation error");
Ian Kent 64001b
 			local_free_vars();
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
 		}
Ian Kent 64001b
+		if (!add_multi_mapstr()) {
Ian Kent 64001b
+			master_error("memory allocation error");
Ian Kent 64001b
+			local_free_vars();
Ian Kent 64001b
+			YYABORT;
Ian Kent 64001b
+		}
Ian Kent 64001b
+	}
Ian Kent 64001b
+	;
Ian Kent 64001b
+
Ian Kent 64001b
+map:	PATH
Ian Kent 64001b
+	{
Ian Kent 64001b
+		tmp_argc++;
Ian Kent 64001b
+		tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
Ian Kent 64001b
+		if (!tmp_argv) {
Ian Kent 64001b
+			master_error("memory allocation error");
Ian Kent 64001b
+			local_free_vars();
Ian Kent 64001b
+			YYABORT;
Ian Kent 64001b
+		}
Ian Kent 64001b
+	}
Ian Kent 64001b
+	| MAPNAME
Ian Kent 64001b
+	{
Ian Kent 64001b
+		tmp_argc++;
Ian Kent 64001b
+		tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
Ian Kent 64001b
+		if (!tmp_argv) {
Ian Kent 64001b
+			master_error("memory allocation error");
Ian Kent 64001b
+			local_free_vars();
Ian Kent 64001b
+			YYABORT;
Ian Kent 64001b
+		}
Ian Kent 64001b
 	}
Ian Kent 64001b
 	| MAPHOSTS
Ian Kent 64001b
 	{
Ian Kent 64001b
@@ -200,9 +304,9 @@ map:	PATH
Ian Kent 64001b
 			local_free_vars();
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
 		}
Ian Kent 64001b
-		local_argc++;
Ian Kent 64001b
-		local_argv = add_argv(local_argc, local_argv, $1);
Ian Kent 64001b
-		if (!local_argv) {
Ian Kent 64001b
+		tmp_argc++;
Ian Kent 64001b
+		tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
Ian Kent 64001b
+		if (!tmp_argv) {
Ian Kent 64001b
 			master_error("memory allocation error");
Ian Kent 64001b
 			local_free_vars();
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
@@ -227,9 +331,9 @@ map:	PATH
Ian Kent 64001b
 				YYABORT;
Ian Kent 64001b
 			}
Ian Kent 64001b
 		}
Ian Kent 64001b
-		local_argc++;
Ian Kent 64001b
-		local_argv = add_argv(local_argc, local_argv, $3);
Ian Kent 64001b
-		if (!local_argv) {
Ian Kent 64001b
+		tmp_argc++;
Ian Kent 64001b
+		tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
Ian Kent 64001b
+		if (!tmp_argv) {
Ian Kent 64001b
 			master_error("memory allocation error");
Ian Kent 64001b
 			local_free_vars();
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
@@ -254,9 +358,9 @@ map:	PATH
Ian Kent 64001b
 				YYABORT;
Ian Kent 64001b
 			}
Ian Kent 64001b
 		}
Ian Kent 64001b
-		local_argc++;
Ian Kent 64001b
-		local_argv = add_argv(local_argc, local_argv, $3);
Ian Kent 64001b
-		if (!local_argv) {
Ian Kent 64001b
+		tmp_argc++;
Ian Kent 64001b
+		tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
Ian Kent 64001b
+		if (!tmp_argv) {
Ian Kent 64001b
 			master_error("memory allocation error");
Ian Kent 64001b
 			local_free_vars();
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
@@ -281,25 +385,25 @@ map:	PATH
Ian Kent 64001b
 				YYABORT;
Ian Kent 64001b
 			}
Ian Kent 64001b
 		}
Ian Kent 64001b
-		local_argc++;
Ian Kent 64001b
-		local_argv = add_argv(local_argc, local_argv, $3);
Ian Kent 64001b
-		if (!local_argv) {
Ian Kent 64001b
+		tmp_argc++;
Ian Kent 64001b
+		tmp_argv = add_argv(tmp_argc, tmp_argv, $3);
Ian Kent 64001b
+		if (!tmp_argv) {
Ian Kent 64001b
 			master_error("memory allocation error");
Ian Kent 64001b
 			local_free_vars();
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
 		}
Ian Kent 64001b
 		/* Add back the type for lookup_ldap.c to handle ldaps */
Ian Kent 64001b
-		if (*local_argv[0]) {
Ian Kent 64001b
-			tmp = malloc(strlen(type) + strlen(local_argv[0]) + 2);
Ian Kent 64001b
+		if (*tmp_argv[0]) {
Ian Kent 64001b
+			tmp = malloc(strlen(type) + strlen(tmp_argv[0]) + 2);
Ian Kent 64001b
 			if (!tmp) {
Ian Kent 64001b
 				local_free_vars();
Ian Kent 64001b
 				YYABORT;
Ian Kent 64001b
 			}
Ian Kent 64001b
 			strcpy(tmp, type);
Ian Kent 64001b
 			strcat(tmp, ":");
Ian Kent 64001b
-			strcat(tmp, local_argv[0]);
Ian Kent 64001b
-			free(local_argv[0]);
Ian Kent 64001b
-			local_argv[0] = tmp;
Ian Kent 64001b
+			strcat(tmp, tmp_argv[0]);
Ian Kent 64001b
+			free(tmp_argv[0]);
Ian Kent 64001b
+			tmp_argv[0] = tmp;
Ian Kent 64001b
 		}
Ian Kent 64001b
 	}
Ian Kent 64001b
 	;
Ian Kent 64001b
@@ -441,9 +545,9 @@ daemon_option: OPT_TIMEOUT NUMBER { timeout = $2; }
Ian Kent 64001b
 
Ian Kent 64001b
 mount_option: OPTION
Ian Kent 64001b
 	{
Ian Kent 64001b
-		local_argc++;
Ian Kent 64001b
-		local_argv = add_argv(local_argc, local_argv, $1);
Ian Kent 64001b
-		if (!local_argv) {
Ian Kent 64001b
+		tmp_argc++;
Ian Kent 64001b
+		tmp_argv = add_argv(tmp_argc, tmp_argv, $1);
Ian Kent 64001b
+		if (!tmp_argv) {
Ian Kent 64001b
 			master_error("memory allocation error");
Ian Kent 64001b
 			local_free_vars();
Ian Kent 64001b
 			YYABORT;
Ian Kent 64001b
@@ -494,6 +598,8 @@ static void local_init_vars(void)
Ian Kent 64001b
 	debug = 0;
Ian Kent 64001b
 	timeout = -1;
Ian Kent 64001b
 	ghost = defaults_get_browse_mode();
Ian Kent 64001b
+	tmp_argv = NULL;
Ian Kent 64001b
+	tmp_argc = 0;
Ian Kent 64001b
 	local_argv = NULL;
Ian Kent 64001b
 	local_argc = 0;
Ian Kent 64001b
 }
Ian Kent 64001b
@@ -509,8 +615,62 @@ static void local_free_vars(void)
Ian Kent 64001b
 	if (format)
Ian Kent 64001b
 		free(format);
Ian Kent 64001b
 
Ian Kent 64001b
-	if (local_argv)
Ian Kent 64001b
+	if (local_argv) {
Ian Kent 64001b
 		free_argv(local_argc, (const char **) local_argv);
Ian Kent 64001b
+		local_argv = NULL;
Ian Kent 64001b
+		local_argc = 0;
Ian Kent 64001b
+	}
Ian Kent 64001b
+
Ian Kent 64001b
+	if (tmp_argv) {
Ian Kent 64001b
+		free_argv(tmp_argc, (const char **) tmp_argv);
Ian Kent 64001b
+		tmp_argv = NULL;
Ian Kent 64001b
+		tmp_argc = 0;
Ian Kent 64001b
+	}
Ian Kent 64001b
+}
Ian Kent 64001b
+
Ian Kent 64001b
+static int add_multi_mapstr(void)
Ian Kent 64001b
+{
Ian Kent 64001b
+	/* We need the individual map types for a multi map */
Ian Kent 64001b
+	if (!type) {
Ian Kent 64001b
+		if (tmp_argc > 0 && *tmp_argv[0] == '/')
Ian Kent 64001b
+			type = strdup("file");
Ian Kent 64001b
+		else
Ian Kent 64001b
+			return 0;
Ian Kent 64001b
+	}
Ian Kent 64001b
+
Ian Kent 64001b
+	if (format) {
Ian Kent 64001b
+		char *tmp = realloc(type, strlen(type) + strlen(format) + 2);
Ian Kent 64001b
+		if (!tmp)
Ian Kent 64001b
+			return 0;
Ian Kent 64001b
+		type = tmp;
Ian Kent 64001b
+		strcat(type, ",");
Ian Kent 64001b
+		strcat(type, format);
Ian Kent 64001b
+		free(format);
Ian Kent 64001b
+		format = NULL;
Ian Kent 64001b
+	}
Ian Kent 64001b
+
Ian Kent 64001b
+	local_argc++;
Ian Kent 64001b
+	local_argv = add_argv(local_argc, local_argv, type);
Ian Kent 64001b
+	if (!local_argv) {
Ian Kent 64001b
+		free(type);
Ian Kent 64001b
+		type = NULL;
Ian Kent 64001b
+		return 0;
Ian Kent 64001b
+	}
Ian Kent 64001b
+
Ian Kent 64001b
+	local_argv = append_argv(local_argc, local_argv, tmp_argc, tmp_argv);
Ian Kent 64001b
+	if (!local_argv) {
Ian Kent 64001b
+		free(type);
Ian Kent 64001b
+		type = NULL;
Ian Kent 64001b
+		return 0;
Ian Kent 64001b
+	}
Ian Kent 64001b
+	local_argc += tmp_argc;
Ian Kent 64001b
+
Ian Kent 64001b
+	tmp_argc = 0;
Ian Kent 64001b
+	tmp_argv = NULL;
Ian Kent 64001b
+	free(type);
Ian Kent 64001b
+	type = NULL;
Ian Kent 64001b
+
Ian Kent 64001b
+	return 1;
Ian Kent 64001b
 }
Ian Kent 64001b
 
Ian Kent 64001b
 void master_init_scan(void)
Ian Kent 64001b
diff --git a/lib/master_tok.l b/lib/master_tok.l
Ian Kent 64001b
index ee2a4eb..0548de1 100644
Ian Kent 64001b
--- a/lib/master_tok.l
Ian Kent 64001b
+++ b/lib/master_tok.l
Ian Kent 64001b
@@ -27,6 +27,7 @@ static void master_echo(void);	/* forward definition */
Ian Kent 64001b
 #include <stdio.h>
Ian Kent 64001b
 #include <stdlib.h>
Ian Kent 64001b
 #include <string.h>
Ian Kent 64001b
+#include <ctype.h>
Ian Kent 64001b
 #include "master_parse.tab.h"
Ian Kent 64001b
 
Ian Kent 64001b
 /*
Ian Kent 64001b
@@ -110,7 +111,9 @@ DNATTRSTR	{AT_CN}|{AT_NMN}|{AT_AMN}|{AT_OU}|{AT_DC}|{AT_O}|{AT_C}
Ian Kent 64001b
 DNNAMESTR	([[:alnum:]_.\-]+)
Ian Kent 64001b
 
Ian Kent 64001b
 INTMAP		(-hosts|-null)
Ian Kent 64001b
-MTYPE           ((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?)
Ian Kent 64001b
+MULTI		((multi)(,(sun|hesiod))?[\:]?{OPTWS})
Ian Kent 64001b
+MULTISEP	([\-]{2}[[:blank:]]+)
Ian Kent 64001b
+MTYPE		((file|program|yp|nis|nisplus|ldap|ldaps|hesiod|userdir)(,(sun|hesiod))?)
Ian Kent 64001b
 
Ian Kent 64001b
 
Ian Kent 64001b
 OPTTOUT		(-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
Ian Kent 64001b
@@ -184,11 +187,18 @@ OPTTOUT		(-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
Ian Kent 64001b
 <MAPSTR>{
Ian Kent 64001b
 	{OPTWS}\\\n{OPTWS} {}
Ian Kent 64001b
 
Ian Kent 64001b
+	{MULTI} {
Ian Kent 64001b
+		strcpy(master_lval.strtype, master_text);
Ian Kent 64001b
+		return(MULTITYPE);
Ian Kent 64001b
+	}
Ian Kent 64001b
+
Ian Kent 64001b
 	{MTYPE}/":" {
Ian Kent 64001b
 		strcpy(master_lval.strtype, master_text);
Ian Kent 64001b
 		return(MAPTYPE);
Ian Kent 64001b
 	}
Ian Kent 64001b
 
Ian Kent 64001b
+	{MULTISEP} { return(DDASH); }
Ian Kent 64001b
+
Ian Kent 64001b
 	":"	{ return(COLON); }
Ian Kent 64001b
 
Ian Kent 64001b
 	"-hosts" {
Ian Kent 64001b
@@ -298,6 +308,11 @@ OPTTOUT		(-t{OPTWS}|-t{OPTWS}={OPTWS}|--timeout{OPTWS}|--timeout{OPTWS}={OPTWS})
Ian Kent 64001b
 <OPTSTR>{
Ian Kent 64001b
 	{OPTWS}\\\n{OPTWS} {}
Ian Kent 64001b
 
Ian Kent 64001b
+	{MULTISEP} {
Ian Kent 64001b
+		BEGIN(MAPSTR);
Ian Kent 64001b
+		return(DDASH);
Ian Kent 64001b
+	}
Ian Kent 64001b
+
Ian Kent 64001b
 	{OPTTOUT} { return(OPT_TIMEOUT); }
Ian Kent 64001b
 
Ian Kent 64001b
 	{NUMBER} {
Ian Kent 64001b
diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c
Ian Kent 64001b
index 00ab28e..38ca36c 100644
Ian Kent 64001b
--- a/modules/lookup_multi.c
Ian Kent 64001b
+++ b/modules/lookup_multi.c
Ian Kent 64001b
@@ -45,7 +45,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
Ian Kent 64001b
 	struct lookup_context *ctxt;
Ian Kent 64001b
 	char buf[MAX_ERR_BUF];
Ian Kent 64001b
 	char *map, *mapfmt;
Ian Kent 64001b
-	int i, j, an;
Ian Kent 64001b
+	int i, an;
Ian Kent 64001b
 	char *estr;
Ian Kent 64001b
 
Ian Kent 64001b
 	ctxt = malloc(sizeof(struct lookup_context));
Ian Kent 64001b
@@ -73,7 +73,7 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
Ian Kent 64001b
 
Ian Kent 64001b
 	memcpy(ctxt->argl, argv, (argc + 1) * sizeof(const char *));
Ian Kent 64001b
 
Ian Kent 64001b
-	for (i = j = an = 0; ctxt->argl[an]; an++) {
Ian Kent 64001b
+	for (i = an = 0; ctxt->argl[an]; an++) {
Ian Kent 64001b
 		if (ctxt->m[i].argc == 0) {
Ian Kent 64001b
 			ctxt->m[i].argv = &ctxt->argl[an];
Ian Kent 64001b
 		}
Ian Kent 64001b
@@ -100,9 +100,12 @@ int lookup_init(const char *my_mapfmt, int argc, const char *const *argv, void *
Ian Kent 64001b
 		if (!(ctxt->m[i].mod = open_lookup(map, MODPREFIX,
Ian Kent 64001b
 						   mapfmt ? mapfmt : my_mapfmt,
Ian Kent 64001b
 						   ctxt->m[i].argc - 1,
Ian Kent 64001b
-						   ctxt->m[i].argv + 1)))
Ian Kent 64001b
+						   ctxt->m[i].argv + 1))) {
Ian Kent 64001b
 			error(LOGOPT_ANY, MODPREFIX "error opening module");
Ian Kent 64001b
+			free(map);
Ian Kent 64001b
 			goto error_out;
Ian Kent 64001b
+		}
Ian Kent 64001b
+		free(map);
Ian Kent 64001b
 	}
Ian Kent 64001b
 
Ian Kent 64001b
 	*context = ctxt;