1 /* schemaparse.c - routines to parse config file objectclass definitions */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
13 #include <ac/string.h>
14 #include <ac/socket.h>
17 #include "ldap_schema.h"
19 int global_schemacheck = 1; /* schemacheck on is default */
21 static void oc_usage(void);
22 static void at_usage(void);
24 static char *const err2text[] = {
27 "ObjectClass not found",
28 "ObjectClass inappropriate SUPerior",
29 "AttributeType not found",
30 "AttributeType inappropriate USAGE",
31 "Duplicate objectClass",
32 "Duplicate attributeType",
33 "Duplicate ldapSyntax",
34 "Duplicate matchingRule",
35 "OID or name required",
36 "SYNTAX or SUPerior required",
37 "MatchingRule not found",
40 "Qualifier not supported",
47 if ( code < 0 || code >= (sizeof(err2text)/sizeof(char *)) ) {
48 return "Unknown error";
50 return err2text[code];
54 /* check schema descr validity */
55 int slap_valid_descr( const char *descr )
59 if( !DESC_LEADCHAR( descr[i] ) ) {
64 if( !DESC_CHAR( descr[i] ) ) {
75 /* String compare with delimiter check. Return 0 if not
76 * matched, otherwise return length matched.
79 dscompare(const char *s1, const char *s2, char delim)
81 const char *orig = s1;
82 while (*s1++ == *s2++)
86 if (!*s1 && (!*s2 || *s2 == delim))
91 static OidMacro *om_list = NULL;
93 /* Replace an OID Macro invocation with its full numeric OID.
94 * If the macro is used with "macroname:suffix" append ".suffix"
102 /* OID macros must start alpha */
103 if ( OID_LEADCHAR( *oid ) ) {
107 for (om = om_list; om; om=om->som_next) {
108 char **names = om->som_names;
110 if( names == NULL ) {
114 for( ; *names != NULL ; names++ ) {
115 int pos = dscompare(*names, oid, ':');
118 int suflen = strlen(oid + pos);
119 char *new = ch_malloc( om->som_oid.bv_len
121 strcpy(new, om->som_oid.bv_val);
124 suflen = om->som_oid.bv_len;
126 strcpy(new+suflen, oid+pos+1);
140 for (om = om_list; om; om = n) {
142 charray_free(om->som_names);
143 free(om->som_oid.bv_val);
160 fprintf( stderr, "%s: line %d: too many arguments\n",
162 usage: fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");
166 oid = find_oidm( argv[1] );
170 "ObjectIdentifier \"%s\" previously defined \"%s\"",
171 fname, lineno, argv[1], oid );
175 om = (OidMacro *) ch_malloc( sizeof(OidMacro) );
177 om->som_names = NULL;
178 charray_add( &om->som_names, argv[1] );
179 om->som_oid.bv_val = find_oidm( argv[2] );
181 if (!om->som_oid.bv_val) {
182 fprintf( stderr, "%s: line %d: OID %s not recognized\n",
183 fname, lineno, argv[2] );
187 if (om->som_oid.bv_val == argv[2]) {
188 om->som_oid.bv_val = ch_strdup( argv[2] );
191 om->som_oid.bv_len = strlen( om->som_oid.bv_val );
192 om->som_next = om_list;
211 oc = ldap_str2objectclass(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL);
213 fprintf( stderr, "%s: line %d: %s before %s\n",
214 fname, lineno, ldap_scherr2str(code), err );
219 if ( oc->oc_oid == NULL ) {
221 "%s: line %d: objectclass has no OID\n",
227 if ( !OID_LEADCHAR( oc->oc_oid[0] )) {
228 /* Expand OID macros */
229 oid = find_oidm( oc->oc_oid );
232 "%s: line %d: OID %s not recognized\n",
233 fname, lineno, oc->oc_oid);
236 if ( oid != oc->oc_oid ) {
237 ldap_memfree( oc->oc_oid );
242 code = oc_add(oc,&err);
244 fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
245 fname, lineno, scherr2str(code), err);
257 "ObjectClassDescription = \"(\" whsp\n"
258 " numericoid whsp ; ObjectClass identifier\n"
259 " [ \"NAME\" qdescrs ]\n"
260 " [ \"DESC\" qdstring ]\n"
261 " [ \"OBSOLETE\" whsp ]\n"
262 " [ \"SUP\" oids ] ; Superior ObjectClasses\n"
263 " [ ( \"ABSTRACT\" / \"STRUCTURAL\" / \"AUXILIARY\" ) whsp ]\n"
264 " ; default structural\n"
265 " [ \"MUST\" oids ] ; AttributeTypes\n"
266 " [ \"MAY\" oids ] ; AttributeTypes\n"
275 "AttributeTypeDescription = \"(\" whsp\n"
276 " numericoid whsp ; AttributeType identifier\n"
277 " [ \"NAME\" qdescrs ] ; name used in AttributeType\n"
278 " [ \"DESC\" qdstring ] ; description\n"
279 " [ \"OBSOLETE\" whsp ]\n"
280 " [ \"SUP\" woid ] ; derived from this other\n"
282 " [ \"EQUALITY\" woid ] ; Matching Rule name\n"
283 " [ \"ORDERING\" woid ] ; Matching Rule name\n"
284 " [ \"SUBSTR\" woid ] ; Matching Rule name\n"
285 " [ \"SYNTAX\" whsp noidlen whsp ] ; see section 4.3\n"
286 " [ \"SINGLE-VALUE\" whsp ] ; default multi-valued\n"
287 " [ \"COLLECTIVE\" whsp ] ; default not collective\n"
288 " [ \"NO-USER-MODIFICATION\" whsp ]; default user modifiable\n"
289 " [ \"USAGE\" whsp AttributeUsage ]; default userApplications\n"
290 " ; userApplications\n"
291 " ; directoryOperation\n"
292 " ; distributedOperation\n"
305 LDAPAttributeType *at;
310 at = ldap_str2attributetype(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL);
312 fprintf( stderr, "%s: line %d: %s before %s\n",
313 fname, lineno, ldap_scherr2str(code), err );
318 if ( at->at_oid == NULL ) {
320 "%s: line %d: attributeType has no OID\n",
326 if ( !OID_LEADCHAR( at->at_oid[0] )) {
327 /* Expand OID macros */
328 oid = find_oidm( at->at_oid );
331 "%s: line %d: OID %s not recognized\n",
332 fname, lineno, at->at_oid);
335 if ( oid != at->at_oid ) {
336 ldap_memfree( at->at_oid );
341 if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) {
342 /* Expand OID macros */
343 oid = find_oidm( at->at_syntax_oid );
346 "%s: line %d: OID %s not recognized\n",
347 fname, lineno, at->at_syntax_oid);
350 if ( oid != at->at_syntax_oid ) {
351 ldap_memfree( at->at_syntax_oid );
352 at->at_syntax_oid = oid;
356 code = at_add(at,&err);
358 fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
359 fname, lineno, scherr2str(code), err);