]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/options.c
ITS#6254
[openldap] / libraries / libldap / options.c
index 8a46d53d328872b48fd08b4b51950f511921db04..e9ae6d4da240b24569c0b87da999433cb946cdb2 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2007 The OpenLDAP Foundation.
+ * Copyright 1998-2009 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -176,11 +176,21 @@ ldap_get_option(
                return LDAP_OPT_SUCCESS;
 
        case LDAP_OPT_TIMEOUT:
-               *(struct timeval *) outvalue = lo->ldo_tm_api;
+               /* the caller has to free outvalue ! */
+               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:
-               *(struct timeval *) outvalue = lo->ldo_tm_net;
+               /* the caller has to free outvalue ! */
+               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;
 
        case LDAP_OPT_DEREF:
@@ -239,7 +249,22 @@ ldap_get_option(
        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 */
@@ -317,6 +342,18 @@ ldap_get_option(
        case LDAP_OPT_DEBUG_LEVEL:
                * (int *) outvalue = lo->ldo_debug;
                return LDAP_OPT_SUCCESS;
+       
+       case LDAP_OPT_X_KEEPALIVE_IDLE:
+               * (int *) outvalue = lo->ldo_keepalive_idle;
+               return LDAP_OPT_SUCCESS;
+
+       case LDAP_OPT_X_KEEPALIVE_PROBES:
+               * (int *) outvalue = lo->ldo_keepalive_probes;
+               return LDAP_OPT_SUCCESS;
+
+       case LDAP_OPT_X_KEEPALIVE_INTERVAL:
+               * (int *) outvalue = lo->ldo_keepalive_interval;
+               return LDAP_OPT_SUCCESS;
 
        default:
 #ifdef HAVE_TLS
@@ -328,6 +365,11 @@ ldap_get_option(
                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;
@@ -650,6 +692,10 @@ ldap_set_option(
        case LDAP_OPT_DEBUG_LEVEL:
        case LDAP_OPT_TIMEOUT:
        case LDAP_OPT_NETWORK_TIMEOUT:
+       case LDAP_OPT_CONNECT_CB:
+       case LDAP_OPT_X_KEEPALIVE_IDLE:
+       case LDAP_OPT_X_KEEPALIVE_PROBES :
+       case LDAP_OPT_X_KEEPALIVE_INTERVAL :
                if(invalue == NULL) {
                        /* no place to set from */
                        return LDAP_OPT_ERROR;
@@ -664,6 +710,10 @@ ldap_set_option(
 #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;
@@ -724,6 +774,27 @@ ldap_set_option(
        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;
+       case LDAP_OPT_X_KEEPALIVE_IDLE:
+               lo->ldo_keepalive_idle = * (const int *) invalue;
+               return LDAP_OPT_SUCCESS;
+       case LDAP_OPT_X_KEEPALIVE_PROBES :
+               lo->ldo_keepalive_probes = * (const int *) invalue;
+               return LDAP_OPT_SUCCESS;
+       case LDAP_OPT_X_KEEPALIVE_INTERVAL :
+               lo->ldo_keepalive_interval = * (const int *) invalue;
+               return LDAP_OPT_SUCCESS;
+       
        }
        return LDAP_OPT_ERROR;
 }