/* call-seq: * conn.get_option(opt) => String * * Return the value associated with the option, +opt+. */ VALUE rb_ldap_conn_get_option (VALUE self, VALUE opt) { #ifdef HAVE_LDAP_GET_OPTION RB_LDAP_DATA *ldapdata; static RB_LDAP_DATA dummy = { NULL, 0, 0 }; long *data; int copt; VALUE val; if (NIL_P (self)) { if (dummy.ldap == NULL) dummy.ldap = ldap_init ("", 0); ldapdata = &dummy; } else GET_LDAP_DATA (self, ldapdata); copt = NUM2INT (opt); #if defined(LDAP_OPT_API_INFO) && defined(LDAP_API_INFO_VERSION) if (copt == LDAP_OPT_API_INFO) { LDAPAPIInfo *info; info = ALLOCA_N (LDAPAPIInfo, 1); /* This is from the Netscape SDK docs for 4.1* */ info->ldapai_info_version = LDAP_API_INFO_VERSION; ldapdata->err = ldap_get_option (NULL, copt, (void *) info); data = (long *) info; } else { data = (void *) ALLOCA_N (char, LDAP_GET_OPT_MAX_BUFFER_SIZE); ldapdata->err = ldap_get_option (ldapdata->ldap, copt, (void *) data); } #else data = (void *) ALLOCA_N (char, LDAP_GET_OPT_MAX_BUFFER_SIZE); ldapdata->err = ldap_get_option (ldapdata->ldap, copt, (void *) data); #endif if (ldapdata->err == LDAP_OPT_SUCCESS) { switch (copt) { case LDAP_OPT_DEREF: case LDAP_OPT_SIZELIMIT: case LDAP_OPT_TIMELIMIT: case LDAP_OPT_REFERRALS: case LDAP_OPT_RESTART: case LDAP_OPT_PROTOCOL_VERSION: case LDAP_OPT_ERROR_NUMBER: #ifdef USE_OPENLDAP2 #ifdef LDAP_OPT_X_TLS case LDAP_OPT_X_TLS: #endif #ifdef LDAP_OPT_X_TLS_REQUIRE_CERT case LDAP_OPT_X_TLS_REQUIRE_CERT: #endif #endif val = INT2NUM ((int) (*data)); break; case LDAP_OPT_HOST_NAME: case LDAP_OPT_ERROR_STRING: #ifdef LDAP_OPT_MATCHED_DN case LDAP_OPT_MATCHED_DN: #endif #ifdef USE_OPENLDAP2 #ifdef LDAP_OPT_X_TLS_CACERTFILE case LDAP_OPT_X_TLS_CACERTFILE: #endif #ifdef LDAP_OPT_X_TLS_CACERTDIR case LDAP_OPT_X_TLS_CACERTDIR: #endif #ifdef LDAP_OPT_X_TLS_CERT case LDAP_OPT_X_TLS_CERT: #endif #ifdef LDAP_OPT_X_TLS_CERTFILE case LDAP_OPT_X_TLS_CERTFILE: #endif #ifdef LDAP_OPT_X_TLS_KEYFILE case LDAP_OPT_X_TLS_KEYFILE: #endif #ifdef LDAP_OPT_X_TLS_PROTOCOL case LDAP_OPT_X_TLS_PROTOCOL: #endif #ifdef LDAP_OPT_X_TLS_CIPHER_SUITE case LDAP_OPT_X_TLS_CIPHER_SUITE: #endif #ifdef LDAP_OPT_X_TLS_RANDOM_FILE case LDAP_OPT_X_TLS_RANDOM_FILE: #endif #endif val = (data && *data) ? rb_tainted_str_new2 ((char *) (*data)) : Qnil; break; #ifdef LDAP_OPT_API_INFO case LDAP_OPT_API_INFO: val = rb_ldap_apiinfo_new ((LDAPAPIInfo *) data); break; #endif default: rb_notimplement (); }; return val; } else { rb_raise (rb_eLDAP_Error, ldap_err2string (ldapdata->err)); }; #else rb_notimplement (); #endif }