From: Kurt Zeilenga Date: Thu, 10 Jan 2002 01:46:08 +0000 (+0000) Subject: Another round of operational attribute changes... more to follow. X-Git-Tag: LDBM_PRE_GIANT_RWLOCK~220 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=6ed15e335069a6dd7cd30971066d6be69a4b1e42;p=openldap Another round of operational attribute changes... more to follow. --- diff --git a/servers/slapd/at.c b/servers/slapd/at.c index 90c58551c2..3bffc75ac5 100644 --- a/servers/slapd/at.c +++ b/servers/slapd/at.c @@ -274,7 +274,35 @@ at_add( MatchingRule *mr; Syntax *syn; int code; - char *cname; + char *cname; + char *oid; + + if ( !OID_LEADCHAR( at->at_oid[0] )) { + /* Expand OID macros */ + oid = oidm_find( at->at_oid ); + if ( !oid ) { + *err = at->at_oid; + return SLAP_SCHERR_OIDM; + } + if ( oid != at->at_oid ) { + ldap_memfree( at->at_oid ); + at->at_oid = oid; + } + } + + if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) { + /* Expand OID macros */ + oid = oidm_find( at->at_syntax_oid ); + if ( !oid ) { + *err = at->at_syntax_oid; + return SLAP_SCHERR_OIDM; + } + if ( oid != at->at_syntax_oid ) { + ldap_memfree( at->at_syntax_oid ); + at->at_syntax_oid = oid; + } + + } if ( at->at_names && at->at_names[0] ) { int i; diff --git a/servers/slapd/oidm.c b/servers/slapd/oidm.c new file mode 100644 index 0000000000..d779496a41 --- /dev/null +++ b/servers/slapd/oidm.c @@ -0,0 +1,122 @@ +/* schemaparse.c - routines to parse config file objectclass definitions */ +/* $OpenLDAP$ */ +/* + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ + +#include "portable.h" + +#include + +#include +#include +#include + +#include "slap.h" + +static OidMacro *om_list = NULL; + +/* Replace an OID Macro invocation with its full numeric OID. + * If the macro is used with "macroname:suffix" append ".suffix" + * to the expansion. + */ +char * +oidm_find(char *oid) +{ + OidMacro *om; + + /* OID macros must start alpha */ + if ( OID_LEADCHAR( *oid ) ) { + return oid; + } + + for (om = om_list; om; om=om->som_next) { + char **names = om->som_names; + + if( names == NULL ) { + continue; + } + + for( ; *names != NULL ; names++ ) { + int pos = dscompare(*names, oid, ':'); + + if( pos ) { + int suflen = strlen(oid + pos); + char *tmp = ch_malloc( om->som_oid.bv_len + + suflen + 1); + strcpy(tmp, om->som_oid.bv_val); + if( suflen ) { + suflen = om->som_oid.bv_len; + tmp[suflen++] = '.'; + strcpy(tmp+suflen, oid+pos+1); + } + return tmp; + } + } + } + return NULL; +} + +void +oidm_destroy() +{ + OidMacro *om, *n; + + for (om = om_list; om; om = n) { + n = om->som_next; + charray_free(om->som_names); + free(om->som_oid.bv_val); + free(om); + } +} + +int +parse_oidm( + const char *fname, + int lineno, + int argc, + char **argv +) +{ + char *oid; + OidMacro *om; + + if (argc != 3) { + fprintf( stderr, "%s: line %d: too many arguments\n", + fname, lineno ); +usage: fprintf( stderr, "\tObjectIdentifier \n"); + return 1; + } + + oid = oidm_find( argv[1] ); + if( oid != NULL ) { + fprintf( stderr, + "%s: line %d: " + "ObjectIdentifier \"%s\" previously defined \"%s\"", + fname, lineno, argv[1], oid ); + return 1; + } + + om = (OidMacro *) ch_malloc( sizeof(OidMacro) ); + + om->som_names = NULL; + charray_add( &om->som_names, argv[1] ); + om->som_oid.bv_val = oidm_find( argv[2] ); + + 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] ); + } + + om->som_oid.bv_len = strlen( om->som_oid.bv_val ); + om->som_next = om_list; + om_list = om; + + return 0; +} diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 9f0c70eaed..edd4ae31f7 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -571,6 +571,14 @@ LDAP_SLAPD_F (void) mra_free LDAP_P(( MatchingRuleAssertion *mra, int freeit )); +/* + * oidm.c + */ +LDAP_SLAPD_F(char *) oidm_find(char *oid); +LDAP_SLAPD_F (void) oidm_destroy LDAP_P(( void )); +LDAP_SLAPD_F (int) parse_oidm LDAP_P(( + const char *fname, int lineno, int argc, char **argv )); + /* * operation.c */ @@ -718,7 +726,6 @@ LDAP_SLAPD_F (int) syn_schema_info( Entry *e ); */ LDAP_SLAPD_F (void) oc_destroy LDAP_P(( void )); -LDAP_SLAPD_F (void) oidm_destroy LDAP_P(( void )); LDAP_SLAPD_F (void) at_destroy LDAP_P(( void )); LDAP_SLAPD_F (void) ad_destroy LDAP_P(( AttributeDescription * )); LDAP_SLAPD_F (void) mr_destroy LDAP_P(( void )); @@ -851,8 +858,6 @@ LDAP_SLAPD_F (int) parse_oc LDAP_P(( const char *fname, int lineno, char *line, char **argv )); LDAP_SLAPD_F (int) parse_at LDAP_P(( const char *fname, int lineno, char *line, char **argv )); -LDAP_SLAPD_F (int) parse_oidm LDAP_P(( - const char *fname, int lineno, int argc, char **argv )); LDAP_SLAPD_F (char *) scherr2str LDAP_P((int code)) LDAP_GCCATTR((const)); LDAP_SLAPD_F (int) dscompare LDAP_P(( const char *s1, const char *s2del, char delim )); diff --git a/servers/slapd/schema_prep.c b/servers/slapd/schema_prep.c index 79a7cab1b4..a646c9937f 100644 --- a/servers/slapd/schema_prep.c +++ b/servers/slapd/schema_prep.c @@ -408,6 +408,39 @@ static struct slap_schema_syn_map { int slap_schema_load( void ) { + int i; + for( i=0; ad_map[i].ssam_name; i++ ) { + if( ad_map[i].ssam_defn != NULL ) { + LDAPAttributeType *at; + int code; + const char *err; + + at = ldap_str2attributetype( ad_map[i].ssam_defn, + &code, &err, LDAP_SCHEMA_ALLOW_ALL ); + if ( !at ) { + fprintf( stderr, + "slap_schema_load: %s: %s before %s\n", + ad_map[i].ssam_name, ldap_scherr2str(code), err ); + return code; + } + + if ( at->at_oid == NULL ) { + fprintf( stderr, "slap_schema_load: " + "attributeType \"%s\" has no OID\n", + ad_map[i].ssam_name ); + return LDAP_OTHER; + } + + code = at_add( at, &err ); + if ( code ) { + fprintf( stderr, "slap_schema_load: " + "%s: %s: \"%s\"\n", + ad_map[i].ssam_name, scherr2str(code), err ); + return code; + } + ldap_memfree( at ); + } + } return LDAP_SUCCESS; } diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index 4e596d44e0..991c6504c9 100644 --- a/servers/slapd/schemaparse.c +++ b/servers/slapd/schemaparse.c @@ -21,7 +21,7 @@ int global_schemacheck = 1; /* schemacheck ON is default */ static void oc_usage(void); static void at_usage(void); -static char *const err2text[] = { +static char *const err2text[SLAP_SCHERR_LAST+1] = { "Success", "Out of memory", "ObjectClass not found", @@ -38,7 +38,8 @@ static char *const err2text[] = { "Syntax not found", "Syntax required", "Qualifier not supported", - "Invalid NAME" + "Invalid NAME", + "OID could not be expanded" }; char * @@ -88,111 +89,6 @@ dscompare(const char *s1, const char *s2, char delim) return 0; } -static OidMacro *om_list = NULL; - -/* Replace an OID Macro invocation with its full numeric OID. - * If the macro is used with "macroname:suffix" append ".suffix" - * to the expansion. - */ -static char * -find_oidm(char *oid) -{ - OidMacro *om; - - /* OID macros must start alpha */ - if ( OID_LEADCHAR( *oid ) ) { - return oid; - } - - for (om = om_list; om; om=om->som_next) { - char **names = om->som_names; - - if( names == NULL ) { - continue; - } - - for( ; *names != NULL ; names++ ) { - int pos = dscompare(*names, oid, ':'); - - if( pos ) { - int suflen = strlen(oid + pos); - char *tmp = ch_malloc( om->som_oid.bv_len - + suflen + 1); - strcpy(tmp, om->som_oid.bv_val); - if( suflen ) { - suflen = om->som_oid.bv_len; - tmp[suflen++] = '.'; - strcpy(tmp+suflen, oid+pos+1); - } - return tmp; - } - } - } - return NULL; -} - -void -oidm_destroy() -{ - OidMacro *om, *n; - - for (om = om_list; om; om = n) { - n = om->som_next; - charray_free(om->som_names); - free(om->som_oid.bv_val); - free(om); - } -} - -int -parse_oidm( - const char *fname, - int lineno, - int argc, - char **argv -) -{ - char *oid; - OidMacro *om; - - if (argc != 3) { - fprintf( stderr, "%s: line %d: too many arguments\n", - fname, lineno ); -usage: fprintf( stderr, "\tObjectIdentifier \n"); - return 1; - } - - oid = find_oidm( argv[1] ); - if( oid != NULL ) { - fprintf( stderr, - "%s: line %d: " - "ObjectIdentifier \"%s\" previously defined \"%s\"", - fname, lineno, argv[1], oid ); - return 1; - } - - om = (OidMacro *) ch_malloc( sizeof(OidMacro) ); - - om->som_names = NULL; - charray_add( &om->som_names, argv[1] ); - om->som_oid.bv_val = find_oidm( argv[2] ); - - 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] ); - } - - om->som_oid.bv_len = strlen( om->som_oid.bv_val ); - om->som_next = om_list; - om_list = om; - - return 0; -} int parse_oc( @@ -225,7 +121,7 @@ parse_oc( if ( !OID_LEADCHAR( oc->oc_oid[0] )) { /* Expand OID macros */ - oid = find_oidm( oc->oc_oid ); + oid = oidm_find( oc->oc_oid ); if ( !oid ) { fprintf( stderr, "%s: line %d: OID %s not recognized\n", @@ -306,7 +202,7 @@ parse_at( const char *err; char *oid = NULL; - at = ldap_str2attributetype(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL); + at = ldap_str2attributetype( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); if ( !at ) { fprintf( stderr, "%s: line %d: %s before %s\n", fname, lineno, ldap_scherr2str(code), err ); @@ -322,45 +218,12 @@ parse_at( return 1; } -#if 0 /* operational attributes should be defined internally */ if ( at->at_usage ) { fprintf( stderr, "%s: line %d: attribute type \"%s\" is operational\n", fname, lineno, at->at_oid ); return 1; } -#endif - - if ( !OID_LEADCHAR( at->at_oid[0] )) { - /* Expand OID macros */ - oid = find_oidm( at->at_oid ); - if ( !oid ) { - fprintf( stderr, - "%s: line %d: OID %s not recognized\n", - fname, lineno, at->at_oid); - return 1; - } - if ( oid != at->at_oid ) { - ldap_memfree( at->at_oid ); - at->at_oid = oid; - } - } - - if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) { - /* Expand OID macros */ - oid = find_oidm( at->at_syntax_oid ); - if ( !oid ) { - fprintf(stderr, - "%s: line %d: OID %s not recognized\n", - fname, lineno, at->at_syntax_oid); - return 1; - } - if ( oid != at->at_syntax_oid ) { - ldap_memfree( at->at_syntax_oid ); - at->at_syntax_oid = oid; - } - - } code = at_add(at,&err); if ( code ) { diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 470fbfc513..1ca84c9d2c 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -234,7 +234,9 @@ typedef struct slap_ssf_set { #define SLAP_SCHERR_SYN_NOT_FOUND 13 #define SLAP_SCHERR_MR_INCOMPLETE 14 #define SLAP_SCHERR_NOT_SUPPORTED 15 -#define SLAP_SCHERR_BAD_DESCR 16 +#define SLAP_SCHERR_BAD_DESCR 16 +#define SLAP_SCHERR_OIDM 17 +#define SLAP_SCHERR_LAST SLAP_SCHERR_OIDM typedef union slap_sockaddr { struct sockaddr sa_addr;