Skip to content
Snippets Groups Projects
Commit 2d39f617 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

Add LDAP_OPT_API_FEATURE_INFO to obtain feature info (ie: version)

at runtime.
parent 811cfab9
No related branches found
No related tags found
No related merge requests found
...@@ -51,6 +51,13 @@ LDAP_BEGIN_DECL ...@@ -51,6 +51,13 @@ LDAP_BEGIN_DECL
/* #define LDAP_API_OPERATION_SESSION_SAFE 1 */ /* #define LDAP_API_OPERATION_SESSION_SAFE 1 */
#endif #endif
#define LDAP_API_FEATURE_INFO 1
typedef struct ldap_apifeature_info {
char* ldapaif_name; /* matches LDAP_API_FEATURE_... less the prefix */
int ldapaif_version; /* matches the value LDAP_API_FEATURE_... */
} LDAPAPIFeatureInfo;
#define LDAP_PORT 389 #define LDAP_PORT 389
#define LDAP_ROOT_DSE "" #define LDAP_ROOT_DSE ""
...@@ -81,6 +88,9 @@ LDAP_BEGIN_DECL ...@@ -81,6 +88,9 @@ LDAP_BEGIN_DECL
#define LDAP_OPT_ERROR_NUMBER 0x0031 #define LDAP_OPT_ERROR_NUMBER 0x0031
#define LDAP_OPT_ERROR_STRING 0x0032 #define LDAP_OPT_ERROR_STRING 0x0032
/* LDAP_OPTions under IETF discussion */
#define LDAP_OPT_API_FEATURE_INFO 0x0100
/* not defined by current draft */ /* not defined by current draft */
/* for LDAPv2 compatibility */ /* for LDAPv2 compatibility */
#define LDAP_OPT_DNS 0x1001 /* use DN & DNS */ #define LDAP_OPT_DNS 0x1001 /* use DN & DNS */
......
...@@ -80,8 +80,19 @@ main(int argc, char **argv) ...@@ -80,8 +80,19 @@ main(int argc, char **argv)
for(i=0; api.ldapai_extensions[i] != NULL; i++) /* empty */; for(i=0; api.ldapai_extensions[i] != NULL; i++) /* empty */;
printf(" Extensions: %d\n", i); printf(" Extensions: %d\n", i);
for(i=0; api.ldapai_extensions[i] != NULL; i++) { for(i=0; api.ldapai_extensions[i] != NULL; i++) {
#ifndef LDAP_API_FEATURE_INFO
printf(" %s\n", printf(" %s\n",
api.ldapai_extensions[i]); api.ldapai_extensions[i]);
#else
LDAPAPIFeatureInfo fi;
fi.ldapaif_name = api.ldapai_extensions[i];
fi.ldapaif_version = 0;
ldap_get_option(NULL, LDAP_OPT_API_FEATURE_INFO, &fi);
printf(" %s (%d)\n",
api.ldapai_extensions[i], fi.ldapaif_version);
#endif
} }
} }
......
...@@ -8,30 +8,33 @@ ...@@ -8,30 +8,33 @@
#include "ldap-int.h" #include "ldap-int.h"
static const char* features[] = { static const LDAPAPIFeatureInfo features[] = {
#ifdef LDAP_API_FEATURE_INFO
{"INFO", LDAP_API_FEATURE_INFO},
#endif
#ifdef LDAP_API_FEATURE_THREAD_SAFE #ifdef LDAP_API_FEATURE_THREAD_SAFE
"THREAD_SAFE", {"THREAD_SAFE", LDAP_API_FEATURE_THREAD_SAFE},
#endif #endif
#ifdef LDAP_API_FEATURE_SESSION_THREAD_SAFE #ifdef LDAP_API_FEATURE_SESSION_THREAD_SAFE
"SESSION_THREAD_SAFE", {"SESSION_THREAD_SAFE", LDAP_API_FEATURE_SESSION_THREAD_SAFE},
#endif #endif
#ifdef LDAP_API_FEATURE_OPERATION_THREAD_SAFE #ifdef LDAP_API_FEATURE_OPERATION_THREAD_SAFE
"OPERATION_THREAD_SAFE", {"OPERATION_THREAD_SAFE", LDAP_API_FEATURE_OPERATION_THREAD_SAFE},
#endif #endif
#ifdef LDAP_API_FEATURE_X_OPENLDAP_REEENTRANT #ifdef LDAP_API_FEATURE_X_OPENLDAP_REEENTRANT
"X_OPENLDAP_REENTRANT", {"X_OPENLDAP_REENTRANT", LDAP_API_FEATURE_X_OPENLDAP_REENTRANT},
#endif #endif
#if defined( LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE ) && \ #if defined( LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE ) && \
defined( LDAP_THREAD_SAFE ) defined( LDAP_THREAD_SAFE )
"X_OPENLDAP_THREAD_SAFE", {"X_OPENLDAP_THREAD_SAFE", LDAP_API_FEATURE_X_OPENLDAP_THREAD_SAFE},
#endif #endif
#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_DNS
"X_OPENLDAP_V2_DNS", {"X_OPENLDAP_V2_DNS", LDAP_API_FEATURE_X_OPENLDAP_V2_DNS},
#endif #endif
#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
"X_OPENLDAP_V2_REFERRALS", {"X_OPENLDAP_V2_REFERRALS", LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS},
#endif #endif
NULL {NULL, 0}
}; };
int int
...@@ -75,15 +78,17 @@ ldap_get_option( ...@@ -75,15 +78,17 @@ ldap_get_option(
info->ldapai_api_version = LDAP_API_VERSION; info->ldapai_api_version = LDAP_API_VERSION;
info->ldapai_api_version = LDAP_API_VERSION; info->ldapai_api_version = LDAP_API_VERSION;
info->ldapai_protocol_version = LDAP_VERSION_MAX; info->ldapai_protocol_version = LDAP_VERSION_MAX;
if(features[0] == NULL) {
if(features[0].ldapaif_name == NULL) {
info->ldapai_extensions = NULL; info->ldapai_extensions = NULL;
} else { } else {
int i; int i;
info->ldapai_extensions = malloc(sizeof(features)); info->ldapai_extensions = malloc(sizeof(char *) *
sizeof(features)/sizeof(LDAPAPIFeatureInfo));
for(i=0; features[i] != NULL; i++) { for(i=0; features[i].ldapaif_name != NULL; i++) {
info->ldapai_extensions[i] = info->ldapai_extensions[i] =
ldap_strdup(features[i]); ldap_strdup(features[i].ldapaif_name);
} }
info->ldapai_extensions[i] = NULL; info->ldapai_extensions[i] = NULL;
...@@ -178,6 +183,23 @@ ldap_get_option( ...@@ -178,6 +183,23 @@ ldap_get_option(
} }
break; break;
case LDAP_OPT_API_FEATURE_INFO: {
LDAPAPIFeatureInfo *info = (LDAPAPIFeatureInfo *) outvalue;
int i;
if(info == NULL) return -1;
if(info->ldapaif_name == NULL) return -1;
for(i=0; features[i].ldapaif_name != NULL; i++) {
if(!strcmp(info->ldapaif_name, features[i].ldapaif_name)) {
info->ldapaif_version =
features[i].ldapaif_version;
return 0;
}
}
}
break;
case LDAP_OPT_DEBUG_LEVEL: case LDAP_OPT_DEBUG_LEVEL:
* (int *) outvalue = lo->ldo_debug; * (int *) outvalue = lo->ldo_debug;
break; break;
...@@ -325,6 +347,10 @@ ldap_set_option( ...@@ -325,6 +347,10 @@ ldap_set_option(
ld->ld_error = err; ld->ld_error = err;
} return 0; } return 0;
case LDAP_OPT_API_FEATURE_INFO:
/* read-only */
break;
case LDAP_OPT_DEBUG_LEVEL: case LDAP_OPT_DEBUG_LEVEL:
lo->ldo_debug = * (int *) invalue; lo->ldo_debug = * (int *) invalue;
return 0; return 0;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment