X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Foidm.c;h=6a2e62c0780acf4addf685fffad151cc8af9ef81;hb=4a8d8eb78a610baefde7f5b3e0a371961dafff84;hp=a244d18b9b223fbf51cb6db0b33d6bc0f82c10c4;hpb=23efa07a994c94c4e78a9495ac6e2981b87b4ba0;p=openldap diff --git a/servers/slapd/oidm.c b/servers/slapd/oidm.c index a244d18b9b..6a2e62c078 100644 --- a/servers/slapd/oidm.c +++ b/servers/slapd/oidm.c @@ -1,8 +1,17 @@ -/* schemaparse.c - routines to parse config file objectclass definitions */ +/* oidm.c - object identifier macro routines */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2005 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -14,8 +23,10 @@ #include #include "slap.h" +#include "lutil.h" -static OidMacro *om_list = NULL; +static LDAP_SLIST_HEAD(OidMacroList, slap_oid_macro) om_list + = LDAP_SLIST_HEAD_INITIALIZER(om_list); /* Replace an OID Macro invocation with its full numeric OID. * If the macro is used with "macroname:suffix" append ".suffix" @@ -31,20 +42,25 @@ oidm_find(char *oid) return oid; } - for (om = om_list; om; om=om->som_next) { - char **names = om->som_names; + LDAP_SLIST_FOREACH( om, &om_list, som_next ) { + 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); - char *tmp = ch_malloc( om->som_oid.bv_len + char *tmp = SLAP_MALLOC( om->som_oid.bv_len + suflen + 1); + if( tmp == NULL ) { + Debug( LDAP_DEBUG_ANY, + "oidm_find: SLAP_MALLOC failed", 0, 0, 0 ); + return NULL; + } strcpy(tmp, om->som_oid.bv_val); if( suflen ) { suflen = om->som_oid.bv_len; @@ -61,13 +77,16 @@ oidm_find(char *oid) void oidm_destroy() { - OidMacro *om, *n; + OidMacro *om; + while( !LDAP_SLIST_EMPTY( &om_list )) { + om = LDAP_SLIST_FIRST( &om_list ); + LDAP_SLIST_REMOVE_HEAD( &om_list, som_next ); - for (om = om_list; om; om = n) { - n = om->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); + } } @@ -76,11 +95,11 @@ parse_oidm( const char *fname, int lineno, int argc, - char **argv -) + char **argv ) { char *oid; OidMacro *om; + struct berval bv; if (argc != 3) { fprintf( stderr, "%s: line %d: too many arguments\n", @@ -98,10 +117,19 @@ usage: fprintf( stderr, "\tObjectIdentifier \n"); return 1; } - om = (OidMacro *) ch_malloc( sizeof(OidMacro) ); + om = (OidMacro *) SLAP_MALLOC( sizeof(OidMacro) ); + if( om == NULL ) { + Debug( LDAP_DEBUG_ANY, "parse_oidm: SLAP_MALLOC failed", 0, 0, 0 ); + return 1; + } + 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) { @@ -115,8 +143,41 @@ usage: fprintf( stderr, "\tObjectIdentifier \n"); } om->som_oid.bv_len = strlen( om->som_oid.bv_val ); - om->som_next = om_list; - om_list = om; + 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; +}