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