Ian Kent 1cd346
autofs-5.1.1 - factor out alloc multi map context
Ian Kent 1cd346
Ian Kent 1cd346
From: Ian Kent <raven@themaw.net>
Ian Kent 1cd346
Ian Kent 1cd346
Seperate out the context allocation function for the multi map module.
Ian Kent 1cd346
Ian Kent 1cd346
Signed-off-by: Ian Kent <raven@themaw.net>
Ian Kent 1cd346
---
Ian Kent 1cd346
 modules/lookup_multi.c |  161 +++++++++++++++++++++++++-----------------------
Ian Kent 1cd346
 1 file changed, 85 insertions(+), 76 deletions(-)
Ian Kent 1cd346
Ian Kent 1cd346
diff --git a/modules/lookup_multi.c b/modules/lookup_multi.c
Ian Kent 1cd346
index 36ace11..433b424 100644
Ian Kent 1cd346
--- a/modules/lookup_multi.c
Ian Kent 1cd346
+++ b/modules/lookup_multi.c
Ian Kent 1cd346
@@ -40,6 +40,84 @@ struct lookup_context {
Ian Kent 1cd346
 
Ian Kent 1cd346
 int lookup_version = AUTOFS_LOOKUP_VERSION;	/* Required by protocol */
Ian Kent 1cd346
 
Ian Kent 1cd346
+static int free_multi_context(struct lookup_context *);
Ian Kent 1cd346
+
Ian Kent 1cd346
+static struct lookup_context *alloc_context(const char *format,
Ian Kent 1cd346
+					    int argc, const char *const *argv)
Ian Kent 1cd346
+{
Ian Kent 1cd346
+	struct lookup_context *ctxt;
Ian Kent 1cd346
+	char buf[MAX_ERR_BUF];
Ian Kent 1cd346
+	char **args;
Ian Kent 1cd346
+	int i, an;
Ian Kent 1cd346
+	char *estr;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	ctxt = malloc(sizeof(struct lookup_context));
Ian Kent 1cd346
+	if (!ctxt)
Ian Kent 1cd346
+		goto nomem;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	memset(ctxt, 0, sizeof(struct lookup_context));
Ian Kent 1cd346
+
Ian Kent 1cd346
+	if (argc < 1) {
Ian Kent 1cd346
+		logerr(MODPREFIX "No map list");
Ian Kent 1cd346
+		goto error_out;
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+
Ian Kent 1cd346
+	ctxt->n = 1;				/* Always at least one map */
Ian Kent 1cd346
+	for (i = 0; i < argc; i++) {
Ian Kent 1cd346
+		if (!strcmp(argv[i], "--"))	/* -- separates maps */
Ian Kent 1cd346
+			ctxt->n++;
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+
Ian Kent 1cd346
+	if (!(ctxt->m = malloc(ctxt->n * sizeof(struct module_info))) ||
Ian Kent 1cd346
+	    !(ctxt->argl = malloc((argc + 1) * sizeof(const char *))))
Ian Kent 1cd346
+		goto nomem;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	memset(ctxt->m, 0, ctxt->n * sizeof(struct module_info));
Ian Kent 1cd346
+
Ian Kent 1cd346
+	memcpy(ctxt->argl, argv, (argc + 1) * sizeof(const char *));
Ian Kent 1cd346
+
Ian Kent 1cd346
+	args = NULL;
Ian Kent 1cd346
+	for (i = an = 0; ctxt->argl[an]; an++) {
Ian Kent 1cd346
+		if (ctxt->m[i].argc == 0)
Ian Kent 1cd346
+			args = (char **) &ctxt->argl[an];
Ian Kent 1cd346
+
Ian Kent 1cd346
+		if (strcmp(ctxt->argl[an], "--"))
Ian Kent 1cd346
+			ctxt->m[i].argc++;
Ian Kent 1cd346
+		else {
Ian Kent 1cd346
+			ctxt->argl[an] = NULL;
Ian Kent 1cd346
+			if (!args) {
Ian Kent 1cd346
+				logerr(MODPREFIX "error assigning map args");
Ian Kent 1cd346
+				goto error_out;
Ian Kent 1cd346
+			}
Ian Kent 1cd346
+			ctxt->m[i].argv = copy_argv(ctxt->m[i].argc,
Ian Kent 1cd346
+						    (const char **) args);
Ian Kent 1cd346
+			if (!ctxt->m[i].argv)
Ian Kent 1cd346
+				goto nomem;
Ian Kent 1cd346
+			args = NULL;
Ian Kent 1cd346
+			i++;
Ian Kent 1cd346
+		}
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+
Ian Kent 1cd346
+	/* catch the last one */
Ian Kent 1cd346
+	if (args) {
Ian Kent 1cd346
+		ctxt->m[i].argv = copy_argv(ctxt->m[i].argc, (const char **) args);
Ian Kent 1cd346
+		if (!ctxt->m[i].argv)
Ian Kent 1cd346
+			goto nomem;
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+
Ian Kent 1cd346
+	return ctxt;
Ian Kent 1cd346
+
Ian Kent 1cd346
+nomem:
Ian Kent 1cd346
+	estr = strerror_r(errno, buf, MAX_ERR_BUF);
Ian Kent 1cd346
+	logerr(MODPREFIX "error: %s", estr);
Ian Kent 1cd346
+
Ian Kent 1cd346
+error_out:
Ian Kent 1cd346
+	free_multi_context(ctxt);
Ian Kent 1cd346
+	free(ctxt);
Ian Kent 1cd346
+
Ian Kent 1cd346
+	return NULL;
Ian Kent 1cd346
+}
Ian Kent 1cd346
+
Ian Kent 1cd346
 static int free_multi_context(struct lookup_context *ctxt)
Ian Kent 1cd346
 {
Ian Kent 1cd346
 	int rv;
Ian Kent 1cd346
@@ -180,95 +258,26 @@ int lookup_init(const char *my_mapfmt,
Ian Kent 1cd346
 		int argc, const char *const *argv, void **context)
Ian Kent 1cd346
 {
Ian Kent 1cd346
 	struct lookup_context *ctxt;
Ian Kent 1cd346
-	char buf[MAX_ERR_BUF];
Ian Kent 1cd346
-	char **args;
Ian Kent 1cd346
-	int i, an;
Ian Kent 1cd346
-	char *estr;
Ian Kent 1cd346
+	int i;
Ian Kent 1cd346
 
Ian Kent 1cd346
-	ctxt = malloc(sizeof(struct lookup_context));
Ian Kent 1cd346
+	ctxt = alloc_context(my_mapfmt, argc, argv);
Ian Kent 1cd346
 	if (!ctxt)
Ian Kent 1cd346
-		goto nomem;
Ian Kent 1cd346
-
Ian Kent 1cd346
-	memset(ctxt, 0, sizeof(struct lookup_context));
Ian Kent 1cd346
-
Ian Kent 1cd346
-	if (argc < 1) {
Ian Kent 1cd346
-		logerr(MODPREFIX "No map list");
Ian Kent 1cd346
-		goto error_out;
Ian Kent 1cd346
-	}
Ian Kent 1cd346
-
Ian Kent 1cd346
-	ctxt->n = 1;				/* Always at least one map */
Ian Kent 1cd346
-	for (i = 0; i < argc; i++) {
Ian Kent 1cd346
-		if (!strcmp(argv[i], "--"))	/* -- separates maps */
Ian Kent 1cd346
-			ctxt->n++;
Ian Kent 1cd346
-	}
Ian Kent 1cd346
-
Ian Kent 1cd346
-	if (!(ctxt->m = malloc(ctxt->n * sizeof(struct module_info))) ||
Ian Kent 1cd346
-	    !(ctxt->argl = malloc((argc + 1) * sizeof(const char *))))
Ian Kent 1cd346
-		goto nomem;
Ian Kent 1cd346
-
Ian Kent 1cd346
-	memset(ctxt->m, 0, ctxt->n * sizeof(struct module_info));
Ian Kent 1cd346
-
Ian Kent 1cd346
-	memcpy(ctxt->argl, argv, (argc + 1) * sizeof(const char *));
Ian Kent 1cd346
-
Ian Kent 1cd346
-	args = NULL;
Ian Kent 1cd346
-	for (i = an = 0; ctxt->argl[an]; an++) {
Ian Kent 1cd346
-		if (ctxt->m[i].argc == 0) {
Ian Kent 1cd346
-			args = (char **) &ctxt->argl[an];
Ian Kent 1cd346
-		}
Ian Kent 1cd346
-		if (!strcmp(ctxt->argl[an], "--")) {
Ian Kent 1cd346
-			ctxt->argl[an] = NULL;
Ian Kent 1cd346
-			if (!args) {
Ian Kent 1cd346
-				logerr(MODPREFIX "error assigning map args");
Ian Kent 1cd346
-				goto error_out;
Ian Kent 1cd346
-			}
Ian Kent 1cd346
-			ctxt->m[i].argv = copy_argv(ctxt->m[i].argc, (const char **) args);
Ian Kent 1cd346
-			if (!ctxt->m[i].argv)
Ian Kent 1cd346
-				goto nomem;
Ian Kent 1cd346
-			args = NULL;
Ian Kent 1cd346
-			i++;
Ian Kent 1cd346
-		} else {
Ian Kent 1cd346
-			ctxt->m[i].argc++;
Ian Kent 1cd346
-		}
Ian Kent 1cd346
-	}
Ian Kent 1cd346
-
Ian Kent 1cd346
-	/* catch the last one */
Ian Kent 1cd346
-	if (args) {
Ian Kent 1cd346
-		ctxt->m[i].argv = copy_argv(ctxt->m[i].argc, (const char **) args);
Ian Kent 1cd346
-		if (!ctxt->m[i].argv)
Ian Kent 1cd346
-			goto nomem;
Ian Kent 1cd346
-	}
Ian Kent 1cd346
+		return 1;
Ian Kent 1cd346
 
Ian Kent 1cd346
 	for (i = 0; i < ctxt->n; i++) {
Ian Kent 1cd346
 		ctxt->m[i].mod = nss_open_lookup(my_mapfmt,
Ian Kent 1cd346
 				 ctxt->m[i].argc, ctxt->m[i].argv);
Ian Kent 1cd346
 		if (!ctxt->m[i].mod) {
Ian Kent 1cd346
 			logerr(MODPREFIX "error opening module");
Ian Kent 1cd346
-			goto error_out;
Ian Kent 1cd346
+			free_multi_context(ctxt);
Ian Kent 1cd346
+			free(ctxt);
Ian Kent 1cd346
+			return 1;
Ian Kent 1cd346
 		}
Ian Kent 1cd346
 	}
Ian Kent 1cd346
 
Ian Kent 1cd346
 	*context = ctxt;
Ian Kent 1cd346
-	return 0;
Ian Kent 1cd346
 
Ian Kent 1cd346
-nomem:
Ian Kent 1cd346
-	estr = strerror_r(errno, buf, MAX_ERR_BUF);
Ian Kent 1cd346
-	logerr(MODPREFIX "error: %s", estr);
Ian Kent 1cd346
-error_out:
Ian Kent 1cd346
-	if (ctxt) {
Ian Kent 1cd346
-		if (ctxt->m) {
Ian Kent 1cd346
-			for (i = 0; i < ctxt->n; i++) {
Ian Kent 1cd346
-				if (ctxt->m[i].mod)
Ian Kent 1cd346
-					close_lookup(ctxt->m[i].mod);
Ian Kent 1cd346
-				if (ctxt->m[i].argv)
Ian Kent 1cd346
-					free_argv(ctxt->m[i].argc, ctxt->m[i].argv);
Ian Kent 1cd346
-			}
Ian Kent 1cd346
-			free(ctxt->m);
Ian Kent 1cd346
-		}
Ian Kent 1cd346
-		if (ctxt->argl)
Ian Kent 1cd346
-			free(ctxt->argl);
Ian Kent 1cd346
-		free(ctxt);
Ian Kent 1cd346
-	}
Ian Kent 1cd346
-	return 1;
Ian Kent 1cd346
+	return 0;
Ian Kent 1cd346
 }
Ian Kent 1cd346
 
Ian Kent 1cd346
 int lookup_reinit(const char *my_mapfmt,