1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-04 08:22:08 +03:00

Remove the tortured logic in another_ldap_try() and turn it into

get_cached_ldap_connect(), which much better describes it's function.

Now we always break at the right places in the loop, we can replace
the while (another_ldap_try(ldap_state, &rc, &attempts, abs_endtime))
construct with simply while (1).
This commit is contained in:
Jeremy Allison
2011-08-19 21:40:54 -07:00
parent ce8a1a29ad
commit 6c3779c80b

View File

@ -1407,57 +1407,44 @@ static void get_ldap_errs(struct smbldap_state *ldap_state, char **pp_ld_error,
LDAP_OPT_ERROR_STRING, pp_ld_error);
}
static int another_ldap_try(struct smbldap_state *ldap_state, int *rc,
int *attempts, time_t abs_endtime)
static int get_cached_ldap_connect(struct smbldap_state *ldap_state)
{
time_t now = time_mono(NULL);
int open_rc = LDAP_SERVER_DOWN;
if (*rc != LDAP_SERVER_DOWN)
goto no_next;
if (abs_endtime && now >= abs_endtime) {
smbldap_close(ldap_state);
*rc = LDAP_TIMEOUT;
goto no_next;
}
int attempts = 0;
while (1) {
int rc;
if (*attempts != 0)
smb_msleep(1000);
rc = smbldap_open(ldap_state);
*attempts += 1;
ldap_state->last_use = time_mono(NULL);
open_rc = smbldap_open(ldap_state);
if (open_rc == LDAP_SUCCESS) {
ldap_state->last_use = now;
return True;
if (rc == LDAP_SUCCESS) {
return LDAP_SUCCESS;
}
if (open_rc == LDAP_INSUFFICIENT_ACCESS) {
attempts++;
DEBUG(1, ("Connection to LDAP server failed for the "
"%d try!\n", attempts));
if (rc == LDAP_INSUFFICIENT_ACCESS) {
/* The fact that we are non-root or any other
* access-denied condition will not change in the next
* round of trying */
*rc = open_rc;
break;
return rc;
}
if (got_alarm) {
*rc = LDAP_TIMEOUT;
break;
smbldap_close(ldap_state);
return LDAP_TIMEOUT;
}
if (open_rc != LDAP_SUCCESS) {
DEBUG(1, ("Connection to LDAP server failed for the "
"%d try!\n", *attempts));
smb_msleep(1000);
if (got_alarm) {
smbldap_close(ldap_state);
return LDAP_TIMEOUT;
}
}
no_next:
ldap_state->last_use = now;
return False;
}
/*********************************************************************
@ -1470,7 +1457,6 @@ static int smbldap_search_ext(struct smbldap_state *ldap_state,
int sizelimit, LDAPMessage **res)
{
int rc = LDAP_SERVER_DOWN;
int attempts = 0;
char *utf8_filter;
int to = lp_ldap_timeout();
time_t abs_endtime = calc_ldap_abs_endtime(to);
@ -1521,10 +1507,15 @@ static int smbldap_search_ext(struct smbldap_state *ldap_state,
setup_ldap_local_alarm(ldap_state, abs_endtime);
while (another_ldap_try(ldap_state, &rc, &attempts, abs_endtime)) {
while (1) {
char *ld_error = NULL;
int ld_errno;
rc = get_cached_ldap_connect(ldap_state);
if (rc != LDAP_SUCCESS) {
break;
}
rc = ldap_search_ext_s(ldap_state->ldap_struct, base, scope,
utf8_filter,
discard_const_p(char *, attrs),
@ -1542,10 +1533,11 @@ static int smbldap_search_ext(struct smbldap_state *ldap_state,
ld_error ? ld_error : "unknown"));
SAFE_FREE(ld_error);
if (ld_errno == LDAP_SERVER_DOWN) {
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
if (ld_errno != LDAP_SERVER_DOWN) {
break;
}
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
}
TALLOC_FREE(utf8_filter);
@ -1655,7 +1647,6 @@ done:
int smbldap_modify(struct smbldap_state *ldap_state, const char *dn, LDAPMod *attrs[])
{
int rc = LDAP_SERVER_DOWN;
int attempts = 0;
char *utf8_dn;
time_t abs_endtime = calc_ldap_abs_endtime(lp_ldap_timeout());
size_t converted_size;
@ -1670,10 +1661,15 @@ int smbldap_modify(struct smbldap_state *ldap_state, const char *dn, LDAPMod *at
setup_ldap_local_alarm(ldap_state, abs_endtime);
while (another_ldap_try(ldap_state, &rc, &attempts, abs_endtime)) {
while (1) {
char *ld_error = NULL;
int ld_errno;
rc = get_cached_ldap_connect(ldap_state);
if (rc != LDAP_SUCCESS) {
break;
}
rc = ldap_modify_s(ldap_state->ldap_struct, utf8_dn, attrs);
if (rc == LDAP_SUCCESS) {
break;
@ -1687,10 +1683,11 @@ int smbldap_modify(struct smbldap_state *ldap_state, const char *dn, LDAPMod *at
ld_error ? ld_error : "unknown"));
SAFE_FREE(ld_error);
if (ld_errno == LDAP_SERVER_DOWN) {
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
if (ld_errno != LDAP_SERVER_DOWN) {
break;
}
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
}
TALLOC_FREE(utf8_dn);
@ -1700,7 +1697,6 @@ int smbldap_modify(struct smbldap_state *ldap_state, const char *dn, LDAPMod *at
int smbldap_add(struct smbldap_state *ldap_state, const char *dn, LDAPMod *attrs[])
{
int rc = LDAP_SERVER_DOWN;
int attempts = 0;
char *utf8_dn;
time_t abs_endtime = calc_ldap_abs_endtime(lp_ldap_timeout());
size_t converted_size;
@ -1715,10 +1711,15 @@ int smbldap_add(struct smbldap_state *ldap_state, const char *dn, LDAPMod *attrs
setup_ldap_local_alarm(ldap_state, abs_endtime);
while (another_ldap_try(ldap_state, &rc, &attempts, abs_endtime)) {
while (1) {
char *ld_error = NULL;
int ld_errno;
rc = get_cached_ldap_connect(ldap_state);
if (rc != LDAP_SUCCESS) {
break;
}
rc = ldap_add_s(ldap_state->ldap_struct, utf8_dn, attrs);
if (rc == LDAP_SUCCESS) {
break;
@ -1732,10 +1733,11 @@ int smbldap_add(struct smbldap_state *ldap_state, const char *dn, LDAPMod *attrs
ld_error ? ld_error : "unknown"));
SAFE_FREE(ld_error);
if (ld_errno == LDAP_SERVER_DOWN) {
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
if (ld_errno != LDAP_SERVER_DOWN) {
break;
}
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
}
TALLOC_FREE(utf8_dn);
@ -1745,7 +1747,6 @@ int smbldap_add(struct smbldap_state *ldap_state, const char *dn, LDAPMod *attrs
int smbldap_delete(struct smbldap_state *ldap_state, const char *dn)
{
int rc = LDAP_SERVER_DOWN;
int attempts = 0;
char *utf8_dn;
time_t abs_endtime = calc_ldap_abs_endtime(lp_ldap_timeout());
size_t converted_size;
@ -1760,10 +1761,15 @@ int smbldap_delete(struct smbldap_state *ldap_state, const char *dn)
setup_ldap_local_alarm(ldap_state, abs_endtime);
while (another_ldap_try(ldap_state, &rc, &attempts, abs_endtime)) {
while (1) {
char *ld_error = NULL;
int ld_errno;
rc = get_cached_ldap_connect(ldap_state);
if (rc != LDAP_SUCCESS) {
break;
}
rc = ldap_delete_s(ldap_state->ldap_struct, utf8_dn);
if (rc == LDAP_SUCCESS) {
break;
@ -1777,10 +1783,11 @@ int smbldap_delete(struct smbldap_state *ldap_state, const char *dn)
ld_error ? ld_error : "unknown"));
SAFE_FREE(ld_error);
if (ld_errno == LDAP_SERVER_DOWN) {
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
if (ld_errno != LDAP_SERVER_DOWN) {
break;
}
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
}
TALLOC_FREE(utf8_dn);
@ -1793,7 +1800,6 @@ int smbldap_extended_operation(struct smbldap_state *ldap_state,
char **retoidp, struct berval **retdatap)
{
int rc = LDAP_SERVER_DOWN;
int attempts = 0;
time_t abs_endtime = calc_ldap_abs_endtime(lp_ldap_timeout());
if (!ldap_state)
@ -1801,10 +1807,15 @@ int smbldap_extended_operation(struct smbldap_state *ldap_state,
setup_ldap_local_alarm(ldap_state, abs_endtime);
while (another_ldap_try(ldap_state, &rc, &attempts, abs_endtime)) {
while (1) {
char *ld_error = NULL;
int ld_errno;
rc = get_cached_ldap_connect(ldap_state);
if (rc != LDAP_SUCCESS) {
break;
}
rc = ldap_extended_operation_s(ldap_state->ldap_struct, reqoid,
reqdata, serverctrls,
clientctrls, retoidp, retdatap);
@ -1820,10 +1831,11 @@ int smbldap_extended_operation(struct smbldap_state *ldap_state,
ld_error ? ld_error : "unknown"));
SAFE_FREE(ld_error);
if (ld_errno == LDAP_SERVER_DOWN) {
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
if (ld_errno != LDAP_SERVER_DOWN) {
break;
}
ldap_unbind(ldap_state->ldap_struct);
ldap_state->ldap_struct = NULL;
}
return end_ldap_local_alarm(abs_endtime, rc);