From 21aa0d0f9f20c978cc1fd7a353e4429af7019bb3 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 1 Mar 2005 18:05:23 +0000 Subject: [PATCH] Added oidm retrieval --- servers/slapd/config.c | 7 ++++-- servers/slapd/oidm.c | 51 ++++++++++++++++++++++++++++++++++---- servers/slapd/proto-slap.h | 1 + servers/slapd/slap.h | 3 ++- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/servers/slapd/config.c b/servers/slapd/config.c index d410851f02..e6fc4ec4ee 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -185,6 +185,7 @@ typedef struct { } OidRec; static OidRec OidMacros[] = { + /* OpenLDAProot:666.11.1 */ { "OLcfg", "1.3.6.1.4.1.4203.666.11.1" }, { "OLcfgAt", "OLcfg:3" }, { "OLcfgOc", "OLcfg:4" }, @@ -1009,8 +1010,10 @@ config_generic(ConfigArgs *c) { case CFG_DEPTH: c->value_int = c->be->be_max_deref_depth; break; - case CFG_OID: /* FIXME */ - rc = 1; + case CFG_OID: + oidm_unparse( &c->rvalue_vals ); + if ( !c->rvalue_vals ) + rc = 1; break; case CFG_CHECK: c->value_int = global_schemacheck; diff --git a/servers/slapd/oidm.c b/servers/slapd/oidm.c index 8e6bdad4cb..6a2e62c078 100644 --- a/servers/slapd/oidm.c +++ b/servers/slapd/oidm.c @@ -23,6 +23,7 @@ #include #include "slap.h" +#include "lutil.h" static LDAP_SLIST_HEAD(OidMacroList, slap_oid_macro) om_list = LDAP_SLIST_HEAD_INITIALIZER(om_list); @@ -42,14 +43,14 @@ oidm_find(char *oid) } LDAP_SLIST_FOREACH( om, &om_list, som_next ) { - char **names = om->som_names; + BerVarray names = om->som_names; if( names == NULL ) { continue; } - for( ; *names != NULL ; names++ ) { - int pos = dscompare(*names, oid, ':'); + for( ; !BER_BVISNULL( names ) ; names++ ) { + int pos = dscompare(names->bv_val, oid, ':'); if( pos ) { int suflen = strlen(oid + pos); @@ -81,7 +82,8 @@ oidm_destroy() om = LDAP_SLIST_FIRST( &om_list ); LDAP_SLIST_REMOVE_HEAD( &om_list, som_next ); - ldap_charray_free(om->som_names); + ber_bvarray_free(om->som_names); + ber_bvarray_free(om->som_subs); free(om->som_oid.bv_val); free(om); @@ -97,6 +99,7 @@ parse_oidm( { char *oid; OidMacro *om; + struct berval bv; if (argc != 3) { fprintf( stderr, "%s: line %d: too many arguments\n", @@ -122,7 +125,11 @@ usage: fprintf( stderr, "\tObjectIdentifier \n"); LDAP_SLIST_NEXT( om, som_next ) = NULL; om->som_names = NULL; - ldap_charray_add( &om->som_names, argv[1] ); + om->som_subs = NULL; + ber_str2bv( argv[1], 0, 1, &bv ); + ber_bvarray_add( &om->som_names, &bv ); + ber_str2bv( argv[2], 0, 1, &bv ); + ber_bvarray_add( &om->som_subs, &bv ); om->som_oid.bv_val = oidm_find( argv[2] ); if (!om->som_oid.bv_val) { @@ -140,3 +147,37 @@ usage: fprintf( stderr, "\tObjectIdentifier \n"); LDAP_SLIST_INSERT_HEAD( &om_list, om, som_next ); return 0; } + +void oidm_unparse( BerVarray *res ) +{ + OidMacro *om; + int i, j, num; + struct berval bv, *bva = NULL, idx; + char ibuf[32], *ptr; + + /* count the result size */ + i = 0; + LDAP_SLIST_FOREACH( om, &om_list, som_next ) { + for ( j=0; !BER_BVISNULL(&om->som_names[j]); j++ ); + i += j; + } + num = i; + bva = ch_malloc( (num+1) * sizeof(struct berval) ); + BER_BVZERO( bva+num ); + idx.bv_val = ibuf; + LDAP_SLIST_FOREACH( om, &om_list, som_next ) { + for ( j=0; !BER_BVISNULL(&om->som_names[j]); j++ ); + for ( i=num-j, j=0; isom_names[j].bv_len + + om->som_subs[j].bv_len + 1; + bva[i].bv_val = ch_malloc( bva[i].bv_len + 1 ); + ptr = lutil_strcopy( bva[i].bv_val, ibuf ); + ptr = lutil_strcopy( ptr, om->som_names[j].bv_val ); + *ptr++ = ' '; + ptr = lutil_strcopy( ptr, om->som_subs[j].bv_val ); + } + num -= j; + } + *res = bva; +} diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 24b4c2e99b..426e5b4b65 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -986,6 +986,7 @@ LDAP_SLAPD_F (int) oc_schema_info( Entry *e ); */ LDAP_SLAPD_F(char *) oidm_find(char *oid); LDAP_SLAPD_F (void) oidm_destroy LDAP_P(( void )); +LDAP_SLAPD_F (void) oidm_unparse LDAP_P(( BerVarray *bva )); LDAP_SLAPD_F (int) parse_oidm LDAP_P(( const char *fname, int lineno, int argc, char **argv )); diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 08e336ef70..7dc81b03f7 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -319,7 +319,8 @@ extern int slap_inet4or6; typedef struct slap_oid_macro { struct berval som_oid; - char **som_names; + BerVarray som_names; + BerVarray som_subs; LDAP_SLIST_ENTRY(slap_oid_macro) som_next; } OidMacro; -- 2.39.2