#include "ldap_main.h"
static krb5_ldap_server_handle *
krb5_get_ldap_handle(krb5_ldap_context *ldap_context)
{
krb5_ldap_server_handle *ldap_server_handle=NULL;
krb5_ldap_server_info *ldap_server_info=NULL;
int cnt=0;
while (ldap_context->server_info_list[cnt] != NULL) {
ldap_server_info = ldap_context->server_info_list[cnt];
if (ldap_server_info->server_status != OFF) {
if (ldap_server_info->ldap_server_handles != NULL) {
ldap_server_handle = ldap_server_info->ldap_server_handles;
ldap_server_info->ldap_server_handles = ldap_server_handle->next;
break;
}
}
++cnt;
}
return ldap_server_handle;
}
static krb5_ldap_server_handle *
krb5_retry_get_ldap_handle(krb5_ldap_context *ldap_context,
krb5_error_code *st)
{
krb5_ldap_server_handle *ldap_server_handle=NULL;
if ((*st=krb5_ldap_db_single_init(ldap_context)) != 0)
return NULL;
ldap_server_handle = krb5_get_ldap_handle(ldap_context);
return ldap_server_handle;
}
static krb5_error_code
krb5_put_ldap_handle(krb5_ldap_server_handle *ldap_server_handle)
{
if (ldap_server_handle == NULL)
return 0;
ldap_server_handle->next = ldap_server_handle->server_info->ldap_server_handles;
ldap_server_handle->server_info->ldap_server_handles = ldap_server_handle;
return 0;
}
static krb5_error_code
krb5_ldap_cleanup_handles(krb5_ldap_server_info *ldap_server_info)
{
krb5_ldap_server_handle *ldap_server_handle = NULL;
while (ldap_server_info->ldap_server_handles != NULL) {
ldap_server_handle = ldap_server_info->ldap_server_handles;
ldap_server_info->ldap_server_handles = ldap_server_handle->next;
free (ldap_server_handle);
ldap_server_handle = NULL;
}
return 0;
}
krb5_error_code
krb5_ldap_request_handle_from_pool(krb5_ldap_context *ldap_context,
krb5_ldap_server_handle **
ldap_server_handle)
{
krb5_error_code st=0;
*ldap_server_handle = NULL;
HNDL_LOCK(ldap_context);
if (((*ldap_server_handle)=krb5_get_ldap_handle(ldap_context)) == NULL)
(*ldap_server_handle)=krb5_retry_get_ldap_handle(ldap_context, &st);
HNDL_UNLOCK(ldap_context);
return st;
}
krb5_error_code
krb5_ldap_request_next_handle_from_pool(krb5_ldap_context *ldap_context,
krb5_ldap_server_handle **
ldap_server_handle)
{
krb5_error_code st=0;
HNDL_LOCK(ldap_context);
(*ldap_server_handle)->server_info->server_status = OFF;
time(&(*ldap_server_handle)->server_info->downtime);
krb5_put_ldap_handle(*ldap_server_handle);
krb5_ldap_cleanup_handles((*ldap_server_handle)->server_info);
if (((*ldap_server_handle)=krb5_get_ldap_handle(ldap_context)) == NULL)
(*ldap_server_handle)=krb5_retry_get_ldap_handle(ldap_context, &st);
HNDL_UNLOCK(ldap_context);
return st;
}
void
krb5_ldap_put_handle_to_pool(krb5_ldap_context *ldap_context,
krb5_ldap_server_handle *ldap_server_handle)
{
if (ldap_server_handle != NULL) {
HNDL_LOCK(ldap_context);
krb5_put_ldap_handle(ldap_server_handle);
HNDL_UNLOCK(ldap_context);
}
return;
}