autofs-5.1.1 - make find_dc_server() return a status From: Ian Kent In the ldap lookup module the do_reconnect() call doesn't distinguish between no entry found and service unavailable. If service unavailable gets returned from a master map read it results in autofs not updating the mounts. A notfound return doesn't because it indicates the map doesn't exist so updating the mounts isn't a problem as it can be when the source is unavailable. Next step in the update of do_reconnect() is to make find_dc_server() return a status instead of an LDAP handle and pass back the LDAP handle via a function parameter. Signed-off-by: Ian Kent --- CHANGELOG | 1 + modules/lookup_ldap.c | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 12 deletions(-) --- autofs-5.0.7.orig/CHANGELOG +++ autofs-5.0.7/CHANGELOG @@ -175,6 +175,7 @@ - move query dn calculation from do_bind() to do_connect(). - make do_connect() return a status. - make connect_to_server() return a status. +- make find_dc_server() return a status. 25/07/2012 autofs-5.0.7 ======================= --- autofs-5.0.7.orig/modules/lookup_ldap.c +++ autofs-5.0.7/modules/lookup_ldap.c @@ -839,33 +839,36 @@ static int connect_to_server(unsigned lo return ret; } -static LDAP *find_dc_server(unsigned logopt, const char *uri, struct lookup_context *ctxt) +static int find_dc_server(unsigned logopt, LDAP **ldap, + const char *uri, struct lookup_context *ctxt) { char *str, *tok, *ptr = NULL; - LDAP *ldap = NULL; + int ret = NSS_STATUS_UNAVAIL; str = strdup(uri); if (!str) - return NULL; + return ret; tok = strtok_r(str, " ", &ptr); while (tok) { const char *this = (const char *) tok; - int ret; + int rv; debug(logopt, "trying server uri %s", this); - ret = connect_to_server(logopt, &ldap, this, ctxt); - if (ret == NSS_STATUS_SUCCESS) { + rv = connect_to_server(logopt, ldap, this, ctxt); + if (rv == NSS_STATUS_SUCCESS) { info(logopt, "connected to uri %s", this); free(str); - return ldap; + return rv; } + if (rv == NSS_STATUS_NOTFOUND) + ret = NSS_STATUS_NOTFOUND; tok = strtok_r(NULL, " ", &ptr); } free(str); - return NULL; + return ret; } static LDAP *find_server(unsigned logopt, struct lookup_context *ctxt) @@ -917,8 +920,8 @@ static LDAP *find_server(unsigned logopt dclist = tmp; uri = strdup(dclist->uri); } - ldap = find_dc_server(logopt, uri, ctxt); - if (ldap) { + ret = find_dc_server(logopt, &ldap, uri, ctxt); + if (ret == NSS_STATUS_SUCCESS) { free(uri); break; } @@ -972,8 +975,8 @@ static LDAP *do_reconnect(unsigned logop } if (ctxt->dclist) { - ldap = find_dc_server(logopt, ctxt->dclist->uri, ctxt); - if (ldap) + ret = find_dc_server(logopt, &ldap, ctxt->dclist->uri, ctxt); + if (ret == NSS_STATUS_SUCCESS) return ldap; }