+ case LDAP_OPT_SERVER_CONTROLS: {
+ LDAPControl **controls = (LDAPControl **) invalue;
+
+ ldap_controls_free( lo->ldo_sctrls );
+
+ if( controls == NULL || *controls == NULL ) {
+ lo->ldo_sctrls = NULL;
+ return LDAP_OPT_SUCCESS;
+ }
+
+ lo->ldo_sctrls =
+ ldap_controls_dup( (LDAPControl **) invalue );
+
+ if(lo->ldo_sctrls == NULL) {
+ /* memory allocation error ? */
+ break;
+ }
+ } return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_CLIENT_CONTROLS: {
+ LDAPControl **controls = (LDAPControl **) invalue;
+
+ ldap_controls_free( lo->ldo_cctrls );
+
+ if( controls == NULL || *controls == NULL ) {
+ lo->ldo_cctrls = NULL;
+ return LDAP_OPT_SUCCESS;
+ }
+
+ lo->ldo_cctrls =
+ ldap_controls_dup( (LDAPControl **) invalue );
+
+ if(lo->ldo_cctrls == NULL) {
+ /* memory allocation error ? */
+ break;
+ }
+ } return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_HOST_NAME: {
+ char* host = (char *) invalue;
+
+ if(lo->ldo_defhost != NULL) {
+ LDAP_FREE(lo->ldo_defhost);
+ lo->ldo_defhost = NULL;
+ }
+
+ if(host != NULL) {
+ lo->ldo_defhost = LDAP_STRDUP(host);
+ return LDAP_OPT_SUCCESS;
+ }
+
+ if(ld == NULL) {
+ /*
+ * must want global default returned
+ * to initial condition.
+ */
+ lo->ldo_defhost = LDAP_STRDUP("localhost");
+
+ } else {
+ /*
+ * must want the session default
+ * updated to the current global default
+ */
+ lo->ldo_defhost = LDAP_STRDUP(
+ ldap_int_global_options.ldo_defhost);
+ }
+ } return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_ERROR_NUMBER: {
+ int err = * (int *) invalue;
+
+ if(ld == NULL) {
+ /* need a struct ldap */
+ break;
+ }
+
+ ld->ld_errno = err;
+ } return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_ERROR_STRING: {
+ char* err = (char *) invalue;
+
+ if(ld == NULL) {
+ /* need a struct ldap */
+ break;
+ }
+
+ if( ld->ld_error ) {
+ LDAP_FREE(ld->ld_error);
+ }
+
+ ld->ld_error = LDAP_STRDUP(err);
+ } return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_MATCHED_DN: {
+ char* err = (char *) invalue;
+
+ if(ld == NULL) {
+ /* need a struct ldap */
+ break;
+ }
+
+ if( ld->ld_matched ) {
+ LDAP_FREE(ld->ld_matched);
+ }
+
+ ld->ld_matched = LDAP_STRDUP(err);
+ } return LDAP_OPT_SUCCESS;
+
+ case LDAP_OPT_API_FEATURE_INFO:
+ /* read-only */