Re: Options from auto.master are not passed to included maps

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2012-04-20 at 21:17 +0800, Ian Kent wrote:
> On Thu, 2012-04-19 at 07:27 +0800, Ian Kent wrote:
> > On Wed, 2012-04-18 at 17:37 +0200, Leonardo Chiquitto wrote:
> > > On Thu, Mar 29, 2012 at 2:05 AM, Ian Kent <raven@xxxxxxxxxx> wrote:
> > > > On Tue, 2012-03-27 at 15:10 -0400, Leonardo Chiquitto wrote:
> > > >> Ian, list
> > > >>
> > > >> I'm debugging a problem in AutoFS where map options defined in
> > > >> auto.master are not being passed over to included maps. Please
> > > >> consider the following AutoFS configuration:
> > > >
> > > > fyi, I started working on this but found that, after an update, mounts
> > > > are not expiring on my system any more. That's bad so I have to work on
> > > > that. I'll get back to this when I can.
> > > 
> > > Hi Ian,
> > > 
> > > Did you have time to get back to this issue? Could you perhaps share
> > > your patch so I could run some tests here as well?
> > 
> > Not yet.
> > I'm just now starting to get the backlog of several time constrained
> > jobs under control.
> > 
> > Give me a little longer, please.
> 
> I'll try and get to this on the weekend and at least post the wip patch
> once I've had another look at it, assuming it is actually sane.

The patch I was working on wasn't finished at all so it took a bit
longer.

Check this carefully it has had virtually no testing.

autofs-5.0.6 - duplicate parent options for included maps

From: Ian Kent <ikent@xxxxxxxxxx>


---

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


diff --git a/modules/lookup_file.c b/modules/lookup_file.c
index 63b5ae7..facb305 100644
--- a/modules/lookup_file.c
+++ b/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 argc, const char *const *argv, void **co
 	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 *key, struct lookup_context *ctxt)
 }
 
 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 *ap, time_t age, char *key, unsigned in
 	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 *ap, time_t age, char *key, unsigned in
 		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 *ap, time_t age, void *context)
 			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_point *ap,
 				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;
 }


--
To unsubscribe from this list: send the line "unsubscribe autofs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux Ext4]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux