Blame SOURCES/autofs-5.1.6-refactor-sss-setautomntent.patch

d702dc
autofs-5.1.6 - refactor sss setautomntent()
d702dc
d702dc
From: Ian Kent <raven@themaw.net>
d702dc
d702dc
Refactor the sss setautomntent() to consolidate the error handling in
d702dc
one location.
d702dc
d702dc
Also move the number of retries calculation into the wait function
d702dc
as it's a much more sensible place for it.
d702dc
d702dc
Signed-off-by: Ian Kent <raven@themaw.net>
d702dc
---
d702dc
 CHANGELOG            |    1 
d702dc
 modules/lookup_sss.c |  106 +++++++++++++++++++++++---------------------------
d702dc
 2 files changed, 49 insertions(+), 58 deletions(-)
d702dc
d702dc
diff --git a/CHANGELOG b/CHANGELOG
d702dc
index b3ffbb6..141658d 100644
d702dc
--- a/CHANGELOG
d702dc
+++ b/CHANGELOG
d702dc
@@ -98,6 +98,7 @@ xx/xx/2018 autofs-5.1.5
d702dc
 - use mapname in sss context for setautomntent().
d702dc
 - add support for new sss autofs proto version call.
d702dc
 - fix retries check in setautomntent_wait().
d702dc
+- refactor sss setautomntent().
d702dc
 
d702dc
 19/12/2017 autofs-5.1.4
d702dc
 - fix spec file url.
d702dc
diff --git a/modules/lookup_sss.c b/modules/lookup_sss.c
d702dc
index d65e71c..011b232 100644
d702dc
--- a/modules/lookup_sss.c
d702dc
+++ b/modules/lookup_sss.c
d702dc
@@ -232,20 +232,6 @@ int lookup_reinit(const char *mapfmt,
d702dc
 	return 0;
d702dc
 }
d702dc
 
d702dc
-static int setautomntent(unsigned int logopt,
d702dc
-			 struct lookup_context *ctxt, void **sss_ctxt)
d702dc
-{
d702dc
-	int ret = ctxt->setautomntent(ctxt->mapname, sss_ctxt);
d702dc
-	if (ret) {
d702dc
-		char buf[MAX_ERR_BUF];
d702dc
-		char *estr = strerror_r(ret, buf, MAX_ERR_BUF);
d702dc
-		error(logopt, MODPREFIX "setautomntent: %s", estr);
d702dc
-		if (*sss_ctxt)
d702dc
-			free(*sss_ctxt);
d702dc
-	}
d702dc
-	return ret;
d702dc
-}
d702dc
-
d702dc
 static unsigned int proto_version(struct lookup_context *ctxt)
d702dc
 {
d702dc
 	unsigned int proto_version = 0;
d702dc
@@ -264,14 +250,18 @@ static unsigned int proto_version(struct lookup_context *ctxt)
d702dc
 }
d702dc
 
d702dc
 static int setautomntent_wait(unsigned int logopt,
d702dc
-			      struct lookup_context *ctxt,
d702dc
-			      void **sss_ctxt, unsigned int retries)
d702dc
+			      struct lookup_context *ctxt, void **sss_ctxt)
d702dc
 {
d702dc
+	unsigned int retries;
d702dc
 	unsigned int retry = 0;
d702dc
 	int ret = 0;
d702dc
 
d702dc
 	*sss_ctxt = NULL;
d702dc
 
d702dc
+	retries = defaults_get_sss_master_map_wait();
d702dc
+	if (retries <= 0)
d702dc
+		return ENOENT;
d702dc
+
d702dc
 	while (++retry <= retries) {
d702dc
 		struct timespec t = { SSS_WAIT_INTERVAL, 0 };
d702dc
 		struct timespec r;
d702dc
@@ -291,9 +281,6 @@ static int setautomntent_wait(unsigned int logopt,
d702dc
 
d702dc
 
d702dc
 	if (ret) {
d702dc
-		char buf[MAX_ERR_BUF];
d702dc
-		char *estr;
d702dc
-
d702dc
 		if (*sss_ctxt) {
d702dc
 			free(*sss_ctxt);
d702dc
 			*sss_ctxt = NULL;
d702dc
@@ -301,14 +288,47 @@ static int setautomntent_wait(unsigned int logopt,
d702dc
 
d702dc
 		if (retry > retries)
d702dc
 			ret = ETIMEDOUT;
d702dc
-
d702dc
-		estr = strerror_r(ret, buf, MAX_ERR_BUF);
d702dc
-		error(logopt, MODPREFIX "setautomntent: %s", estr);
d702dc
 	}
d702dc
 
d702dc
 	return ret;
d702dc
 }
d702dc
 
d702dc
+static int setautomntent(unsigned int logopt,
d702dc
+			 struct lookup_context *ctxt, void **sss_ctxt)
d702dc
+{
d702dc
+	char buf[MAX_ERR_BUF];
d702dc
+	char *estr;
d702dc
+	int ret;
d702dc
+
d702dc
+	ret = ctxt->setautomntent(ctxt->mapname, sss_ctxt);
d702dc
+	if (ret) {
d702dc
+		if (ret == ECONNREFUSED)
d702dc
+			return NSS_STATUS_UNKNOWN;
d702dc
+
d702dc
+		if (ret != ENOENT)
d702dc
+			goto error;
d702dc
+
d702dc
+		ret = setautomntent_wait(logopt, ctxt, sss_ctxt);
d702dc
+		if (ret) {
d702dc
+			if (ret == ECONNREFUSED)
d702dc
+				return NSS_STATUS_UNKNOWN;
d702dc
+			if (ret == ENOENT)
d702dc
+				return NSS_STATUS_NOTFOUND;
d702dc
+			goto error;
d702dc
+		}
d702dc
+	}
d702dc
+	return ret;
d702dc
+
d702dc
+error:
d702dc
+	estr = strerror_r(ret, buf, MAX_ERR_BUF);
d702dc
+	error(logopt, MODPREFIX "setautomntent: %s", estr);
d702dc
+	if (*sss_ctxt) {
d702dc
+		free(*sss_ctxt);
d702dc
+		*sss_ctxt = NULL;
d702dc
+	}
d702dc
+	return NSS_STATUS_UNAVAIL;
d702dc
+}
d702dc
+
d702dc
 static int endautomntent(unsigned int logopt,
d702dc
 			 struct lookup_context *ctxt, void **sss_ctxt)
d702dc
 {
d702dc
@@ -336,28 +356,8 @@ int lookup_read_master(struct master *master, time_t age, void *context)
d702dc
 	int count, ret;
d702dc
 
d702dc
 	ret = setautomntent(logopt, ctxt, &sss_ctxt);
d702dc
-	if (ret) {
d702dc
-		unsigned int retries;
d702dc
-
d702dc
-		if (ret == ECONNREFUSED)
d702dc
-			return NSS_STATUS_UNKNOWN;
d702dc
-
d702dc
-		if (ret != ENOENT)
d702dc
-			return NSS_STATUS_UNAVAIL;
d702dc
-
d702dc
-		retries = defaults_get_sss_master_map_wait();
d702dc
-		if (retries <= 0)
d702dc
-			return NSS_STATUS_NOTFOUND;
d702dc
-
d702dc
-		ret = setautomntent_wait(logopt, ctxt, &sss_ctxt, retries);
d702dc
-		if (ret) {
d702dc
-			if (ret == ECONNREFUSED)
d702dc
-				return NSS_STATUS_UNKNOWN;
d702dc
-			if (ret == ENOENT)
d702dc
-				return NSS_STATUS_NOTFOUND;
d702dc
-			return NSS_STATUS_UNAVAIL;
d702dc
-		}
d702dc
-	}
d702dc
+	if (ret)
d702dc
+		return ret;
d702dc
 
d702dc
 	count = 0;
d702dc
 	while (1) {
d702dc
@@ -459,13 +459,8 @@ int lookup_read_map(struct autofs_point *ap, time_t age, void *context)
d702dc
 	}
d702dc
 
d702dc
 	ret = setautomntent(ap->logopt, ctxt, &sss_ctxt);
d702dc
-	if (ret) {
d702dc
-		if (ret == ECONNREFUSED)
d702dc
-			return NSS_STATUS_UNKNOWN;
d702dc
-		if (ret == ENOENT)
d702dc
-			return NSS_STATUS_NOTFOUND;
d702dc
-		return NSS_STATUS_UNAVAIL;
d702dc
-	}
d702dc
+	if (ret)
d702dc
+		return ret;
d702dc
 
d702dc
 	count = 0;
d702dc
 	while (1) {
d702dc
@@ -571,13 +566,8 @@ static int lookup_one(struct autofs_point *ap,
d702dc
 	mc = source->mc;
d702dc
 
d702dc
 	ret = setautomntent(ap->logopt, ctxt, &sss_ctxt);
d702dc
-	if (ret) {
d702dc
-		if (ret == ECONNREFUSED)
d702dc
-			return NSS_STATUS_UNKNOWN;
d702dc
-		if (ret == ENOENT)
d702dc
-			return NSS_STATUS_NOTFOUND;
d702dc
-		return NSS_STATUS_UNAVAIL;
d702dc
-	}
d702dc
+	if (ret)
d702dc
+		return ret;
d702dc
 
d702dc
 	ret = ctxt->getautomntbyname_r(qKey, &value, sss_ctxt);
d702dc
 	if (ret && ret != ENOENT) {