1 /* schemaparse.c - routines to parse config file objectclass definitions */
4 * Copyright 1998-2002 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 *tmp = ch_malloc( om->som_oid.bv_len
121 strcpy(tmp, om->som_oid.bv_val);
123 suflen = om->som_oid.bv_len;
125 strcpy(tmp+suflen, oid+pos+1);
139 for (om = om_list; om; om = n) {
141 charray_free(om->som_names);
142 free(om->som_oid.bv_val);
159 fprintf( stderr, "%s: line %d: too many arguments\n",
161 usage: fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");
165 oid = find_oidm( argv[1] );
169 "ObjectIdentifier \"%s\" previously defined \"%s\"",
170 fname, lineno, argv[1], oid );
174 om = (OidMacro *) ch_malloc( sizeof(OidMacro) );
176 om->som_names = NULL;
177 charray_add( &om->som_names, argv[1] );
178 om->som_oid.bv_val = find_oidm( argv[2] );
180 if (!om->som_oid.bv_val) {
181 fprintf( stderr, "%s: line %d: OID %s not recognized\n",
182 fname, lineno, argv[2] );
186 if (om->som_oid.bv_val == argv[2]) {
187 om->som_oid.bv_val = ch_strdup( argv[2] );
190 om->som_oid.bv_len = strlen( om->som_oid.bv_val );
191 om->som_next = om_list;
210 oc = ldap_str2objectclass(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL);
212 fprintf( stderr, "%s: line %d: %s before %s\n",
213 fname, lineno, ldap_scherr2str(code), err );
218 if ( oc->oc_oid == NULL ) {
220 "%s: line %d: objectclass has no OID\n",
226 if ( !OID_LEADCHAR( oc->oc_oid[0] )) {
227 /* Expand OID macros */
228 oid = find_oidm( oc->oc_oid );
231 "%s: line %d: OID %s not recognized\n",
232 fname, lineno, oc->oc_oid);
235 if ( oid != oc->oc_oid ) {
236 ldap_memfree( oc->oc_oid );
241 code = oc_add(oc,&err);
243 fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
244 fname, lineno, scherr2str(code), err);
256 "ObjectClassDescription = \"(\" whsp\n"
257 " numericoid whsp ; ObjectClass identifier\n"
258 " [ \"NAME\" qdescrs ]\n"
259 " [ \"DESC\" qdstring ]\n"
260 " [ \"OBSOLETE\" whsp ]\n"
261 " [ \"SUP\" oids ] ; Superior ObjectClasses\n"
262 " [ ( \"ABSTRACT\" / \"STRUCTURAL\" / \"AUXILIARY\" ) whsp ]\n"
263 " ; default structural\n"
264 " [ \"MUST\" oids ] ; AttributeTypes\n"
265 " [ \"MAY\" oids ] ; AttributeTypes\n"
274 "AttributeTypeDescription = \"(\" whsp\n"
275 " numericoid whsp ; AttributeType identifier\n"
276 " [ \"NAME\" qdescrs ] ; name used in AttributeType\n"
277 " [ \"DESC\" qdstring ] ; description\n"
278 " [ \"OBSOLETE\" whsp ]\n"
279 " [ \"SUP\" woid ] ; derived from this other\n"
281 " [ \"EQUALITY\" woid ] ; Matching Rule name\n"
282 " [ \"ORDERING\" woid ] ; Matching Rule name\n"
283 " [ \"SUBSTR\" woid ] ; Matching Rule name\n"
284 " [ \"SYNTAX\" whsp noidlen whsp ] ; see section 4.3\n"
285 " [ \"SINGLE-VALUE\" whsp ] ; default multi-valued\n"
286 " [ \"COLLECTIVE\" whsp ] ; default not collective\n"
287 " [ \"NO-USER-MODIFICATION\" whsp ]; default user modifiable\n"
288 " [ \"USAGE\" whsp AttributeUsage ]; default userApplications\n"
289 " ; userApplications\n"
290 " ; directoryOperation\n"
291 " ; distributedOperation\n"
304 LDAPAttributeType *at;
309 at = ldap_str2attributetype(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL);
311 fprintf( stderr, "%s: line %d: %s before %s\n",
312 fname, lineno, ldap_scherr2str(code), err );
317 if ( at->at_oid == NULL ) {
319 "%s: line %d: attributeType has no OID\n",
325 if ( !OID_LEADCHAR( at->at_oid[0] )) {
326 /* Expand OID macros */
327 oid = find_oidm( at->at_oid );
330 "%s: line %d: OID %s not recognized\n",
331 fname, lineno, at->at_oid);
334 if ( oid != at->at_oid ) {
335 ldap_memfree( at->at_oid );
340 if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) {
341 /* Expand OID macros */
342 oid = find_oidm( at->at_syntax_oid );
345 "%s: line %d: OID %s not recognized\n",
346 fname, lineno, at->at_syntax_oid);
349 if ( oid != at->at_syntax_oid ) {
350 ldap_memfree( at->at_syntax_oid );
351 at->at_syntax_oid = oid;
355 code = at_add(at,&err);
357 fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
358 fname, lineno, scherr2str(code), err);