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