Blame SOURCES/autofs-5.1.1-factor-out-alloc-multi-map-context.patch

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