Ian Kent 1cd346
autofs-5.1.1 - implement reinit in sss lookup module
Ian Kent 1cd346
Ian Kent 1cd346
From: Ian Kent <raven@themaw.net>
Ian Kent 1cd346
Ian Kent 1cd346
Refactor the sss lookup module to add an implementation for the newly
Ian Kent 1cd346
added reinit entry point.
Ian Kent 1cd346
Ian Kent 1cd346
Signed-off-by: Ian Kent <raven@themaw.net>
Ian Kent 1cd346
---
Ian Kent 1cd346
 modules/lookup_sss.c |  130 +++++++++++++++++++++++++++++++++++++-------------
Ian Kent 1cd346
 1 file changed, 95 insertions(+), 35 deletions(-)
Ian Kent 1cd346
Ian Kent 1cd346
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
Ian Kent 1cd346
index c58a272..2f32e94 100644
Ian Kent 1cd346
--- a/modules/lookup_sss.c
Ian Kent 1cd346
+++ b/modules/lookup_sss.c
Ian Kent 1cd346
@@ -56,39 +56,16 @@ struct lookup_context {
Ian Kent 1cd346
 
Ian Kent 1cd346
 int lookup_version = AUTOFS_LOOKUP_VERSION;	/* Required by protocol */
Ian Kent 1cd346
 
Ian Kent 1cd346
-int lookup_init(const char *mapfmt,
Ian Kent 1cd346
-		int argc, const char *const *argv, void **context)
Ian Kent 1cd346
+static int open_sss_lib(struct lookup_context *ctxt)
Ian Kent 1cd346
 {
Ian Kent 1cd346
-	struct lookup_context *ctxt;
Ian Kent 1cd346
-	char buf[MAX_ERR_BUF];
Ian Kent 1cd346
 	char dlbuf[PATH_MAX];
Ian Kent 1cd346
 	char *estr;
Ian Kent 1cd346
 	void *dh;
Ian Kent 1cd346
 	size_t size;
Ian Kent 1cd346
 
Ian Kent 1cd346
-	*context = NULL;
Ian Kent 1cd346
-
Ian Kent 1cd346
-	ctxt = malloc(sizeof(struct lookup_context));
Ian Kent 1cd346
-	if (!ctxt) {
Ian Kent 1cd346
-		estr = strerror_r(errno, buf, MAX_ERR_BUF);
Ian Kent 1cd346
-		logerr(MODPREFIX "malloc: %s", estr);
Ian Kent 1cd346
-		return 1;
Ian Kent 1cd346
-	}
Ian Kent 1cd346
-
Ian Kent 1cd346
-	if (argc < 1) {
Ian Kent 1cd346
-		free(ctxt);
Ian Kent 1cd346
-		logerr(MODPREFIX "No map name");
Ian Kent 1cd346
-		return 1;
Ian Kent 1cd346
-	}
Ian Kent 1cd346
-	ctxt->mapname = argv[0];
Ian Kent 1cd346
-
Ian Kent 1cd346
-	if (!mapfmt)
Ian Kent 1cd346
-		mapfmt = MAPFMT_DEFAULT;
Ian Kent 1cd346
-
Ian Kent 1cd346
 	size = snprintf(dlbuf, sizeof(dlbuf),
Ian Kent 1cd346
 			"%s/%s.so", SSS_LIB_DIR, SSS_SO_NAME);
Ian Kent 1cd346
 	if (size >= sizeof(dlbuf)) {
Ian Kent 1cd346
-		free(ctxt);
Ian Kent 1cd346
 		logmsg(MODPREFIX "sss library path too long");
Ian Kent 1cd346
 		return 1;
Ian Kent 1cd346
 	}
Ian Kent 1cd346
@@ -96,7 +73,6 @@ int lookup_init(const char *mapfmt,
Ian Kent 1cd346
 	dh = dlopen(dlbuf, RTLD_LAZY);
Ian Kent 1cd346
 	if (!dh) {
Ian Kent 1cd346
 		logerr(MODPREFIX "failed to open %s: %s", dlbuf, dlerror());
Ian Kent 1cd346
-		free(ctxt);
Ian Kent 1cd346
 		return 1;
Ian Kent 1cd346
 	}
Ian Kent 1cd346
 	ctxt->dlhandle = dh;
Ian Kent 1cd346
@@ -117,15 +93,6 @@ int lookup_init(const char *mapfmt,
Ian Kent 1cd346
 	if (!ctxt->setautomntent)
Ian Kent 1cd346
 		goto lib_names_fail;
Ian Kent 1cd346
 
Ian Kent 1cd346
-	ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1);
Ian Kent 1cd346
-	if (!ctxt->parse) {
Ian Kent 1cd346
-		logmsg(MODPREFIX "failed to open parse context");
Ian Kent 1cd346
-		dlclose(dh);
Ian Kent 1cd346
-		free(ctxt);
Ian Kent 1cd346
-		return 1;
Ian Kent 1cd346
-	}
Ian Kent 1cd346
-	*context = ctxt;
Ian Kent 1cd346
-
Ian Kent 1cd346
 	return 0;
Ian Kent 1cd346
 
Ian Kent 1cd346
 lib_names_fail:
Ian Kent 1cd346
@@ -134,13 +101,106 @@ lib_names_fail:
Ian Kent 1cd346
 	else
Ian Kent 1cd346
 		logerr(MODPREFIX "dlsym: %s", estr);
Ian Kent 1cd346
 	dlclose(dh);
Ian Kent 1cd346
-	free(ctxt);
Ian Kent 1cd346
+
Ian Kent 1cd346
 	return 1;
Ian Kent 1cd346
 }
Ian Kent 1cd346
 
Ian Kent 1cd346
+static int do_init(const char *mapfmt,
Ian Kent 1cd346
+		   int argc, const char *const *argv,
Ian Kent 1cd346
+		   struct lookup_context *ctxt, unsigned int reinit)
Ian Kent 1cd346
+{
Ian Kent 1cd346
+	int ret = 0;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	if (argc < 1) {
Ian Kent 1cd346
+		logerr(MODPREFIX "No map name");
Ian Kent 1cd346
+		ret = 1;
Ian Kent 1cd346
+		goto out;
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+	ctxt->mapname = argv[0];
Ian Kent 1cd346
+
Ian Kent 1cd346
+	if (!mapfmt)
Ian Kent 1cd346
+		mapfmt = MAPFMT_DEFAULT;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	if (!reinit) {
Ian Kent 1cd346
+		ret = open_sss_lib(ctxt);
Ian Kent 1cd346
+		if (ret)
Ian Kent 1cd346
+			goto out;
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+
Ian Kent 1cd346
+	if (reinit) {
Ian Kent 1cd346
+		ret = reinit_parse(ctxt->parse, mapfmt, MODPREFIX, argc - 1, argv + 1);
Ian Kent 1cd346
+		if (ret)
Ian Kent 1cd346
+			logmsg(MODPREFIX "failed to reinit parse context");
Ian Kent 1cd346
+	} else {
Ian Kent 1cd346
+		ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1);
Ian Kent 1cd346
+		if (!ctxt->parse) {
Ian Kent 1cd346
+			logmsg(MODPREFIX "failed to open parse context");
Ian Kent 1cd346
+			dlclose(ctxt->dlhandle);
Ian Kent 1cd346
+			ret = 1;
Ian Kent 1cd346
+		}
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+out:
Ian Kent 1cd346
+	return ret;
Ian Kent 1cd346
+}
Ian Kent 1cd346
+
Ian Kent 1cd346
+int lookup_init(const char *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 *estr;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	*context = NULL;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	ctxt = malloc(sizeof(struct lookup_context));
Ian Kent 1cd346
+	if (!ctxt) {
Ian Kent 1cd346
+		estr = strerror_r(errno, buf, MAX_ERR_BUF);
Ian Kent 1cd346
+		logerr(MODPREFIX "malloc: %s", estr);
Ian Kent 1cd346
+		return 1;
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+
Ian Kent 1cd346
+	if (do_init(mapfmt, argc, argv, ctxt, 0)) {
Ian Kent 1cd346
+		free(ctxt);
Ian Kent 1cd346
+		return 1;
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+
Ian Kent 1cd346
+	*context = ctxt;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	return 0;
Ian Kent 1cd346
+}
Ian Kent 1cd346
+
Ian Kent 1cd346
 int lookup_reinit(const char *mapfmt,
Ian Kent 1cd346
 		  int argc, const char *const *argv, void **context)
Ian Kent 1cd346
 {
Ian Kent 1cd346
+	struct lookup_context *ctxt = (struct lookup_context *) *context;
Ian Kent 1cd346
+	struct lookup_context *new;
Ian Kent 1cd346
+	char buf[MAX_ERR_BUF];
Ian Kent 1cd346
+	int ret;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	new = malloc(sizeof(struct lookup_context));
Ian Kent 1cd346
+	if (!new) {
Ian Kent 1cd346
+		char *estr = strerror_r(errno, buf, MAX_ERR_BUF);
Ian Kent 1cd346
+		logerr(MODPREFIX "malloc: %s", estr);
Ian Kent 1cd346
+		return 1;
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+
Ian Kent 1cd346
+	new->parse = ctxt->parse;
Ian Kent 1cd346
+	ret = do_init(mapfmt, argc, argv, new, 1);
Ian Kent 1cd346
+	if (ret) {
Ian Kent 1cd346
+		free(new);
Ian Kent 1cd346
+		return 1;
Ian Kent 1cd346
+	}
Ian Kent 1cd346
+
Ian Kent 1cd346
+	new->dlhandle = ctxt->dlhandle;
Ian Kent 1cd346
+	new->setautomntent = ctxt->setautomntent;
Ian Kent 1cd346
+	new->getautomntent_r = ctxt->getautomntent_r;
Ian Kent 1cd346
+	new->getautomntbyname_r = ctxt->getautomntbyname_r;
Ian Kent 1cd346
+	new->endautomntent = ctxt->endautomntent;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	*context = new;
Ian Kent 1cd346
+
Ian Kent 1cd346
+	free(ctxt);
Ian Kent 1cd346
+
Ian Kent 1cd346
 	return 0;
Ian Kent 1cd346
 }
Ian Kent 1cd346