/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2008 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
case LDAP_OPT_TIMEOUT:
/* the caller has to free outvalue ! */
- if ( ldap_int_timeval_dup( outvalue, lo->ldo_tm_api) != 0 ) {
+ if ( lo->ldo_tm_api.tv_sec < 0 ) {
+ *(void **)outvalue = NULL;
+ } else if ( ldap_int_timeval_dup( outvalue, &lo->ldo_tm_api ) != 0 ) {
return LDAP_OPT_ERROR;
}
return LDAP_OPT_SUCCESS;
case LDAP_OPT_NETWORK_TIMEOUT:
/* the caller has to free outvalue ! */
- if ( ldap_int_timeval_dup( outvalue, lo->ldo_tm_net ) != 0 ) {
+ if ( lo->ldo_tm_net.tv_sec < 0 ) {
+ *(void **)outvalue = NULL;
+ } else if ( ldap_int_timeval_dup( outvalue, &lo->ldo_tm_net ) != 0 ) {
return LDAP_OPT_ERROR;
}
return LDAP_OPT_SUCCESS;
return LDAP_OPT_SUCCESS;
- case LDAP_OPT_ERROR_NUMBER:
+ case LDAP_OPT_CONNECT_ASYNC:
+ * (int *) outvalue = (int) LDAP_BOOL_GET(lo, LDAP_BOOL_CONNECT_ASYNC);
+ return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_CONNECT_CB:
+ {
+ /* Getting deletes the specified callback */
+ ldaplist **ll = &lo->ldo_conn_cbs;
+ for (;*ll;ll = &(*ll)->ll_next) {
+ if ((*ll)->ll_data == outvalue) {
+ ldaplist *lc = *ll;
+ *ll = lc->ll_next;
+ LDAP_FREE(lc);
+ break;
+ }
+ }
+ }
+ return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_RESULT_CODE:
if(ld == NULL) {
/* bad param */
break;
* (int *) outvalue = ld->ld_errno;
return LDAP_OPT_SUCCESS;
- case LDAP_OPT_ERROR_STRING:
+ case LDAP_OPT_DIAGNOSTIC_MESSAGE:
if(ld == NULL) {
/* bad param */
break;
if ( ldap_int_sasl_get_option( ld, option, outvalue ) == 0 ) {
return LDAP_OPT_SUCCESS;
}
+#endif
+#ifdef HAVE_GSSAPI
+ if ( ldap_int_gssapi_get_option( ld, option, outvalue ) == 0 ) {
+ return LDAP_OPT_SUCCESS;
+ }
#endif
/* bad param */
break;
LDAP_BOOL_SET(lo, LDAP_BOOL_RESTART);
}
return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_CONNECT_ASYNC:
+ if(invalue == LDAP_OPT_OFF) {
+ LDAP_BOOL_CLR(lo, LDAP_BOOL_CONNECT_ASYNC);
+ } else {
+ LDAP_BOOL_SET(lo, LDAP_BOOL_CONNECT_ASYNC);
+ }
+ return LDAP_OPT_SUCCESS;
}
/* options which can withstand invalue == NULL */
}
} return LDAP_OPT_SUCCESS;
- case LDAP_OPT_TIMEOUT: {
- const struct timeval *tv =
- (const struct timeval *) invalue;
-
- if ( lo->ldo_tm_api != NULL ) {
- LDAP_FREE( lo->ldo_tm_api );
- lo->ldo_tm_api = NULL;
- }
-
- if ( ldap_int_timeval_dup( &lo->ldo_tm_api, tv ) != 0 ) {
- return LDAP_OPT_ERROR;
- }
- } return LDAP_OPT_SUCCESS;
-
- case LDAP_OPT_NETWORK_TIMEOUT: {
- const struct timeval *tv =
- (const struct timeval *) invalue;
-
- if ( lo->ldo_tm_net != NULL ) {
- LDAP_FREE( lo->ldo_tm_net );
- lo->ldo_tm_net = NULL;
- }
-
- if ( ldap_int_timeval_dup( &lo->ldo_tm_net, tv ) != 0 ) {
- return LDAP_OPT_ERROR;
- }
- } return LDAP_OPT_SUCCESS;
case LDAP_OPT_HOST_NAME: {
const char *host = (const char *) invalue;
lo->ldo_defbase = defbase;
} return LDAP_OPT_SUCCESS;
- case LDAP_OPT_ERROR_STRING: {
+ case LDAP_OPT_DIAGNOSTIC_MESSAGE: {
const char *err = (const char *) invalue;
if(ld == NULL) {
/* read-only options */
case LDAP_OPT_API_INFO:
case LDAP_OPT_DESC:
+ case LDAP_OPT_SOCKBUF:
case LDAP_OPT_API_FEATURE_INFO:
return LDAP_OPT_ERROR;
case LDAP_OPT_SIZELIMIT:
case LDAP_OPT_TIMELIMIT:
case LDAP_OPT_PROTOCOL_VERSION:
- case LDAP_OPT_ERROR_NUMBER:
+ case LDAP_OPT_RESULT_CODE:
case LDAP_OPT_DEBUG_LEVEL:
+ case LDAP_OPT_TIMEOUT:
+ case LDAP_OPT_NETWORK_TIMEOUT:
+ case LDAP_OPT_CONNECT_CB:
if(invalue == NULL) {
/* no place to set from */
return LDAP_OPT_ERROR;
#ifdef HAVE_CYRUS_SASL
if ( ldap_int_sasl_set_option( ld, option, (void *)invalue ) == 0 )
return LDAP_OPT_SUCCESS;
+#endif
+#ifdef HAVE_GSSAPI
+ if ( ldap_int_gssapi_set_option( ld, option, (void *)invalue ) == 0 )
+ return LDAP_OPT_SUCCESS;
#endif
/* bad param */
return LDAP_OPT_ERROR;
switch(option) {
case LDAP_OPT_DEREF:
+ /* FIXME: check value for protocol compliance? */
lo->ldo_deref = * (const int *) invalue;
return LDAP_OPT_SUCCESS;
case LDAP_OPT_SIZELIMIT:
+ /* FIXME: check value for protocol compliance? */
lo->ldo_sizelimit = * (const int *) invalue;
return LDAP_OPT_SUCCESS;
case LDAP_OPT_TIMELIMIT:
+ /* FIXME: check value for protocol compliance? */
lo->ldo_timelimit = * (const int *) invalue;
return LDAP_OPT_SUCCESS;
+ case LDAP_OPT_TIMEOUT: {
+ const struct timeval *tv =
+ (const struct timeval *) invalue;
+
+ lo->ldo_tm_api = *tv;
+ } return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_NETWORK_TIMEOUT: {
+ const struct timeval *tv =
+ (const struct timeval *) invalue;
+
+ lo->ldo_tm_net = *tv;
+ } return LDAP_OPT_SUCCESS;
+
case LDAP_OPT_PROTOCOL_VERSION: {
int vers = * (const int *) invalue;
if (vers < LDAP_VERSION_MIN || vers > LDAP_VERSION_MAX) {
lo->ldo_version = vers;
} return LDAP_OPT_SUCCESS;
- case LDAP_OPT_ERROR_NUMBER: {
+ case LDAP_OPT_RESULT_CODE: {
int err = * (const int *) invalue;
if(ld == NULL) {
case LDAP_OPT_DEBUG_LEVEL:
lo->ldo_debug = * (const int *) invalue;
return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_CONNECT_CB:
+ {
+ /* setting pushes the callback */
+ ldaplist *ll;
+ ll = LDAP_MALLOC( sizeof( *ll ));
+ ll->ll_data = (void *)invalue;
+ ll->ll_next = lo->ldo_conn_cbs;
+ lo->ldo_conn_cbs = ll;
+ }
+ return LDAP_OPT_SUCCESS;
}
return LDAP_OPT_ERROR;
}