X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Foidm.c;h=287937f03c3d1a8cb53c0765fae50d4dee84ed60;hb=a2badc7c3c6245dad7f8fb22923969fcc57643f7;hp=99df108cdaaf0585db00cb1999dd48cffa714325;hpb=119cbcaba43185e483b74b359e56fcf5d921404f;p=openldap diff --git a/servers/slapd/oidm.c b/servers/slapd/oidm.c index 99df108cda..287937f03c 100644 --- a/servers/slapd/oidm.c +++ b/servers/slapd/oidm.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2007 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,10 +24,13 @@ #include "slap.h" #include "lutil.h" +#include "config.h" -static LDAP_STAILQ_HEAD(OidMacroList, slap_oid_macro) om_list +static LDAP_STAILQ_HEAD(OidMacroList, OidMacro) om_list = LDAP_STAILQ_HEAD_INITIALIZER(om_list); +OidMacro *om_sys_tail; + /* Replace an OID Macro invocation with its full numeric OID. * If the macro is used with "macroname:suffix" append ".suffix" * to the expansion. @@ -92,62 +95,75 @@ oidm_destroy() int parse_oidm( - const char *fname, - int lineno, - int argc, - char **argv, + struct config_args_s *c, int user, OidMacro **rom) { - char *oid; - OidMacro *om; + char *oid, *oidv; + OidMacro *om = NULL, *prev = NULL; struct berval bv; - if (argc != 3) { - fprintf( stderr, "%s: line %d: too many arguments\n", - fname, lineno ); -usage: fprintf( stderr, "\tObjectIdentifier \n"); + oidv = oidm_find( c->argv[2] ); + if( !oidv ) { + snprintf( c->cr_msg, sizeof( c->cr_msg ), + "%s: OID %s not recognized", + c->argv[0], c->argv[2] ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); return 1; } - oid = oidm_find( argv[1] ); + oid = oidm_find( c->argv[1] ); if( oid != NULL ) { - fprintf( stderr, - "%s: line %d: " - "ObjectIdentifier \"%s\" previously defined \"%s\"", - fname, lineno, argv[1], oid ); - return 1; + int rc; + snprintf( c->cr_msg, sizeof( c->cr_msg ), + "%s: \"%s\" previously defined \"%s\"", + c->argv[0], c->argv[1], oid ); + Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, + "%s %s\n", c->log, c->cr_msg, 0 ); + /* Allow duplicate if the definition is identical */ + rc = strcmp( oid, oidv ) != 0; + SLAP_FREE( oid ); + if ( oidv != c->argv[2] ) + SLAP_FREE( oidv ); + return rc; } - om = (OidMacro *) SLAP_MALLOC( sizeof(OidMacro) ); + om = (OidMacro *) SLAP_CALLOC( sizeof(OidMacro), 1 ); if( om == NULL ) { - Debug( LDAP_DEBUG_ANY, "parse_oidm: SLAP_MALLOC failed", 0, 0, 0 ); + snprintf( c->cr_msg, sizeof( c->cr_msg ), + "%s: SLAP_CALLOC failed", c->argv[0] ); + Debug( LDAP_DEBUG_ANY, + "%s %s\n", c->log, c->cr_msg, 0 ); + if ( oidv != c->argv[2] ) + SLAP_FREE( oidv ); return 1; } om->som_names = NULL; om->som_subs = NULL; - ber_str2bv( argv[1], 0, 1, &bv ); + ber_str2bv( c->argv[1], 0, 1, &bv ); ber_bvarray_add( &om->som_names, &bv ); - ber_str2bv( argv[2], 0, 1, &bv ); + ber_str2bv( c->argv[2], 0, 1, &bv ); ber_bvarray_add( &om->som_subs, &bv ); - om->som_oid.bv_val = oidm_find( argv[2] ); + om->som_oid.bv_val = oidv; - if (!om->som_oid.bv_val) { - fprintf( stderr, "%s: line %d: OID %s not recognized\n", - fname, lineno, argv[2] ); - goto usage; - } - - if (om->som_oid.bv_val == argv[2]) { - om->som_oid.bv_val = ch_strdup( argv[2] ); + if (om->som_oid.bv_val == c->argv[2]) { + om->som_oid.bv_val = ch_strdup( c->argv[2] ); } om->som_oid.bv_len = strlen( om->som_oid.bv_val ); - if ( !user ) + if ( !user ) { om->som_flags |= SLAP_OM_HARDCODE; + prev = om_sys_tail; + om_sys_tail = om; + } - LDAP_STAILQ_INSERT_TAIL( &om_list, om, som_next ); + if ( prev ) { + LDAP_STAILQ_INSERT_AFTER( &om_list, prev, om, som_next ); + } else { + LDAP_STAILQ_INSERT_TAIL( &om_list, om, som_next ); + } if ( rom ) *rom = om; return 0; } @@ -156,7 +172,7 @@ void oidm_unparse( BerVarray *res, OidMacro *start, OidMacro *end, int sys ) { OidMacro *om; int i, j, num; - struct berval bv, *bva = NULL, idx; + struct berval *bva = NULL, idx; char ibuf[32], *ptr; if ( !start ) @@ -164,10 +180,11 @@ void oidm_unparse( BerVarray *res, OidMacro *start, OidMacro *end, int sys ) /* count the result size */ i = 0; - for ( om=start; om && om!=end; om=LDAP_STAILQ_NEXT(om, som_next)) { - if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) continue; + for ( om=start; om; om=LDAP_STAILQ_NEXT(om, som_next)) { + if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) break; for ( j=0; !BER_BVISNULL(&om->som_names[j]); j++ ); i += j; + if ( om == end ) break; } num = i; if (!i) return; @@ -179,11 +196,11 @@ void oidm_unparse( BerVarray *res, OidMacro *start, OidMacro *end, int sys ) idx.bv_len = 0; ibuf[0] = '\0'; } - for ( i=0,om=start; om && om!=end; om=LDAP_STAILQ_NEXT(om, som_next)) { - if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) continue; + for ( i=0,om=start; om; om=LDAP_STAILQ_NEXT(om, som_next)) { + if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) break; for ( j=0; !BER_BVISNULL(&om->som_names[j]); i++,j++ ) { if ( !sys ) { - idx.bv_len = sprintf(idx.bv_val, "{%02d}", i ); + idx.bv_len = sprintf(idx.bv_val, "{%d}", i ); } bva[i].bv_len = idx.bv_len + om->som_names[j].bv_len + om->som_subs[j].bv_len + 1; @@ -194,6 +211,7 @@ void oidm_unparse( BerVarray *res, OidMacro *start, OidMacro *end, int sys ) strcpy( ptr, om->som_subs[j].bv_val ); } if ( i>=num ) break; + if ( om == end ) break; } *res = bva; }