X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschemaparse.c;h=fbfd93a59bd49d527b0772c356e630b73aacbf47;hb=4325d05ebc5ca096ee4a0d0177e7651c028c7449;hp=991c6504c9b68c787d665e612c02da97fbf4e3f9;hpb=cadecfaae15530566a2220b11dc9a5a7016b7c06;p=openldap diff --git a/servers/slapd/schemaparse.c b/servers/slapd/schemaparse.c index 991c6504c9..fbfd93a59b 100644 --- a/servers/slapd/schemaparse.c +++ b/servers/slapd/schemaparse.c @@ -1,7 +1,7 @@ /* schemaparse.c - routines to parse config file objectclass definitions */ /* $OpenLDAP$ */ /* - * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -21,31 +21,38 @@ int global_schemacheck = 1; /* schemacheck ON is default */ static void oc_usage(void); static void at_usage(void); -static char *const err2text[SLAP_SCHERR_LAST+1] = { +static char *const err2text[] = { "Success", "Out of memory", "ObjectClass not found", - "ObjectClass inappropriate SUPerior", + "user-defined ObjectClass includes operational attributes", + "user-defined ObjectClass has inappropriate SUPerior", + "Duplicate objectClass", "AttributeType not found", + "AttributeType inappropriate matching rule", "AttributeType inappropriate USAGE", - "Duplicate objectClass", + "AttributeType inappropriate SUPerior", + "AttributeType SYNTAX or SUPerior required", "Duplicate attributeType", - "Duplicate ldapSyntax", - "Duplicate matchingRule", - "OID or name required", - "SYNTAX or SUPerior required", "MatchingRule not found", + "MatchingRule incomplete", + "Duplicate matchingRule", "Syntax not found", - "Syntax required", + "Duplicate ldapSyntax", + "OID or name required", "Qualifier not supported", "Invalid NAME", - "OID could not be expanded" + "OID could not be expanded", + "Duplicate Content Rule", + "Content Rule not for STRUCTURAL object class", + "Content Rule AUX contains non-AUXILIARY object class" + "Content Rule attribute type list contains duplicate" }; char * scherr2str(int code) { - if ( code < 0 || code >= (sizeof(err2text)/sizeof(char *)) ) { + if ( code < 0 || SLAP_SCHERR_LAST <= code ) { return "Unknown error"; } else { return err2text[code]; @@ -89,6 +96,64 @@ dscompare(const char *s1, const char *s2, char delim) return 0; } +#ifdef SLAP_EXTENDED_SCHEMA + +static void +cr_usage( void ) +{ + fprintf( stderr, + "DITContentRuleDescription = \"(\" whsp\n" + " numericoid whsp ; StructuralObjectClass identifier\n" + " [ \"NAME\" qdescrs ]\n" + " [ \"DESC\" qdstring ]\n" + " [ \"OBSOLETE\" whsp ]\n" + " [ \"AUX\" oids ] ; Auxiliary ObjectClasses\n" + " [ \"MUST\" oids ] ; AttributeTypes\n" + " [ \"MAY\" oids ] ; AttributeTypes\n" + " [ \"NOT\" oids ] ; AttributeTypes\n" + " whsp \")\"\n" ); +} + +int +parse_cr( + const char *fname, + int lineno, + char *line, + char **argv +) +{ + LDAPContentRule *cr; + int code; + const char *err; + + cr = ldap_str2contentrule(line, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); + if ( !cr ) { + fprintf( stderr, "%s: line %d: %s before %s\n", + fname, lineno, ldap_scherr2str(code), err ); + cr_usage(); + return 1; + } + + if ( cr->cr_oid == NULL ) { + fprintf( stderr, + "%s: line %d: Content rule has no OID\n", + fname, lineno ); + cr_usage(); + return 1; + } + + code = cr_add(cr,1,&err); + if ( code ) { + fprintf( stderr, "%s: line %d: %s: \"%s\"\n", + fname, lineno, scherr2str(code), err); + return 1; + } + + ldap_memfree(cr); + return 0; +} + +#endif int parse_oc( @@ -101,9 +166,8 @@ parse_oc( LDAPObjectClass *oc; int code; const char *err; - char *oid = NULL; - oc = ldap_str2objectclass(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL); + oc = ldap_str2objectclass(line, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); if ( !oc ) { fprintf( stderr, "%s: line %d: %s before %s\n", fname, lineno, ldap_scherr2str(code), err ); @@ -119,22 +183,7 @@ parse_oc( return 1; } - if ( !OID_LEADCHAR( oc->oc_oid[0] )) { - /* Expand OID macros */ - oid = oidm_find( oc->oc_oid ); - if ( !oid ) { - fprintf( stderr, - "%s: line %d: OID %s not recognized\n", - fname, lineno, oc->oc_oid); - return 1; - } - if ( oid != oc->oc_oid ) { - ldap_memfree( oc->oc_oid ); - oc->oc_oid = oid; - } - } - - code = oc_add(oc,&err); + code = oc_add(oc,1,&err); if ( code ) { fprintf( stderr, "%s: line %d: %s: \"%s\"\n", fname, lineno, scherr2str(code), err); @@ -162,7 +211,6 @@ oc_usage( void ) " whsp \")\"\n" ); } - static void at_usage( void ) { @@ -200,7 +248,6 @@ parse_at( LDAPAttributeType *at; int code; const char *err; - char *oid = NULL; at = ldap_str2attributetype( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); if ( !at ) {