Blob Blame History Raw
autofs-5.0.6 - duplicate parent options for included maps

From: Ian Kent <ikent@redhat.com>

Included maps should inherite mount options from their parent mount.
---

 CHANGELOG             |    1 
 modules/lookup_file.c |   61 +++++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 54 insertions(+), 8 deletions(-)


--- autofs-5.0.6.orig/CHANGELOG
+++ autofs-5.0.6/CHANGELOG
@@ -43,6 +43,7 @@
 - fix initialization in rpc create_client().
 - fix libtirpc name clash.
 - report map not read when debug logging.
+- duplicate parent options for included maps.
 
 28/06/2011 autofs-5.0.6
 -----------------------
--- autofs-5.0.6.orig/modules/lookup_file.c
+++ autofs-5.0.6/modules/lookup_file.c
@@ -41,9 +41,10 @@ typedef enum {
 typedef enum { got_nothing, got_star, got_real, got_plus } FOUND_STATE;
 typedef enum { esc_none, esc_char, esc_val, esc_all } ESCAPES;
 
-
 struct lookup_context {
 	const char *mapname;
+	int opts_argc;
+	const char **opts_argv;
 	struct parse_mod *parse;
 };
 
@@ -88,8 +89,20 @@ int lookup_init(const char *mapfmt, int
 	if (!mapfmt)
 		mapfmt = MAPFMT_DEFAULT;
 
-	ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1);
+	argc--;
+	argv++;
+
+	ctxt->opts_argv = copy_argv(argc, (const char **) argv);
+	if (ctxt->opts_argv == NULL) {
+		free(ctxt);
+		warn(LOGOPT_NONE, MODPREFIX "failed to duplicate options");
+		return 1;
+	}
+	ctxt->opts_argc = argc;
+
+	ctxt->parse = open_parse(mapfmt, MODPREFIX, argc, argv);
 	if (!ctxt->parse) {
+		free_argv(ctxt->opts_argc, ctxt->opts_argv);
 		free(ctxt);
 		logmsg(MODPREFIX "failed to open parse context");
 		return 1;
@@ -512,12 +525,15 @@ static int check_self_include(const char
 }
 
 static struct map_source *
-prepare_plus_include(struct autofs_point *ap, time_t age, char *key, unsigned int inc)
+prepare_plus_include(struct autofs_point *ap,
+		     time_t age, char *key, unsigned int inc,
+		     struct lookup_context *ctxt)
 {
 	struct map_source *current;
 	struct map_source *source;
 	struct map_type_info *info;
 	const char *argv[2];
+	char **tmp_argv, **tmp_opts;
 	int argc;
 	char *buf;
 
@@ -551,9 +567,35 @@ prepare_plus_include(struct autofs_point
 	argv[0] = info->map;
 	argv[1] = NULL;
 
+	tmp_argv = (char **) copy_argv(argc, argv);
+	if (!tmp_argv) {
+		error(ap->logopt, MODPREFIX "failed to allocate args vector");
+		free_map_type_info(info);
+		free(buf);
+		return NULL;
+	}
+
+	tmp_opts = (char **) copy_argv(ctxt->opts_argc, ctxt->opts_argv);
+	if (!tmp_opts) {
+		error(ap->logopt, MODPREFIX "failed to allocate options args vector");
+		free_argv(argc, (const char **) tmp_argv);
+		free_map_type_info(info);
+		free(buf);
+		return NULL;
+	}
+
+	tmp_argv = append_argv(argc, tmp_argv, ctxt->opts_argc, tmp_opts);
+	if (!tmp_argv) {
+		error(ap->logopt, MODPREFIX "failed to append options vector");
+		free_map_type_info(info);
+		free(buf);
+		return NULL;
+	}
+	argc += ctxt->opts_argc;
+
 	source = master_find_source_instance(current,
 					     info->type, info->format,
-					     argc, argv);
+					     argc, (const char **) tmp_argv);
 	if (source) {
 		/*
 		 * Make sure included map age is in sync with its owner
@@ -563,15 +605,17 @@ prepare_plus_include(struct autofs_point
 		source->stale = 1;
 	} else {
 		source = master_add_source_instance(current,
-						    info->type, info->format,
-						    age, argc, argv);
+						    info->type, info->format, age,
+						    argc, (const char **) tmp_argv);
 		if (!source) {
+			free_argv(argc, (const char **) tmp_argv);
 			free_map_type_info(info);
 			free(buf);
 			error(ap->logopt, "failed to add included map instance");
 			return NULL;
 		}
 	}
+	free_argv(argc, (const char **) tmp_argv);
 
 	source->depth = current->depth + 1;
 	if (inc)
@@ -645,7 +689,7 @@ int lookup_read_map(struct autofs_point
 			master_source_current_wait(ap->entry);
 			ap->entry->current = source;
 
-			inc_source = prepare_plus_include(ap, age, key, inc);
+			inc_source = prepare_plus_include(ap, age, key, inc, ctxt);
 			if (!inc_source) {
 				debug(ap->logopt,
 				      "failed to select included map %s", key);
@@ -729,7 +773,7 @@ static int lookup_one(struct autofs_poin
 				master_source_current_wait(ap->entry);
 				ap->entry->current = source;
 
-				inc_source = prepare_plus_include(ap, age, mkey, inc);
+				inc_source = prepare_plus_include(ap, age, mkey, inc, ctxt);
 				if (!inc_source) {
 					debug(ap->logopt,
 					      MODPREFIX
@@ -1096,6 +1140,7 @@ int lookup_done(void *context)
 {
 	struct lookup_context *ctxt = (struct lookup_context *) context;
 	int rv = close_parse(ctxt->parse);
+	free_argv(ctxt->opts_argc, ctxt->opts_argv);
 	free(ctxt);
 	return rv;
 }