]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schemaparse.c
check for ee == NULL
[openldap] / servers / slapd / schemaparse.c
index b43874d0590fd34e8429ad0425800537713523ba..80f44f5044940d90f37fc4472b189ef4d554b467 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * 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
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -24,8 +24,7 @@
 
 #include "slap.h"
 #include "ldap_schema.h"
 
 #include "slap.h"
 #include "ldap_schema.h"
-
-int    global_schemacheck = 1; /* schemacheck ON is default */
+#include "config.h"
 
 static void            oc_usage(void); 
 static void            at_usage(void);
 
 static void            oc_usage(void); 
 static void            at_usage(void);
@@ -37,18 +36,20 @@ static char *const err2text[] = {
        "user-defined ObjectClass includes operational attributes",
        "user-defined ObjectClass has inappropriate SUPerior",
        "Duplicate objectClass",
        "user-defined ObjectClass includes operational attributes",
        "user-defined ObjectClass has inappropriate SUPerior",
        "Duplicate objectClass",
+       "Inconsistent duplicate objectClass",
        "AttributeType not found",
        "AttributeType inappropriate matching rule",
        "AttributeType inappropriate USAGE",
        "AttributeType inappropriate SUPerior",
        "AttributeType SYNTAX or SUPerior required",
        "Duplicate attributeType",
        "AttributeType not found",
        "AttributeType inappropriate matching rule",
        "AttributeType inappropriate USAGE",
        "AttributeType inappropriate SUPerior",
        "AttributeType SYNTAX or SUPerior required",
        "Duplicate attributeType",
-       "Inconsistent attributeType",
+       "Inconsistent duplicate attributeType",
        "MatchingRule not found",
        "MatchingRule incomplete",
        "Duplicate matchingRule",
        "Syntax not found",
        "Duplicate ldapSyntax",
        "MatchingRule not found",
        "MatchingRule incomplete",
        "Duplicate matchingRule",
        "Syntax not found",
        "Duplicate ldapSyntax",
+       "Superior syntax not found",
        "OID or name required",
        "Qualifier not supported",
        "Invalid NAME",
        "OID or name required",
        "Qualifier not supported",
        "Invalid NAME",
@@ -125,80 +126,105 @@ cr_usage( void )
 
 int
 parse_cr(
 
 int
 parse_cr(
-    const char *fname,
-    int                lineno,
-    char       *line,
-    char       **argv,
-       ContentRule **scr )
+       struct config_args_s *c,
+       ContentRule     **scr )
 {
        LDAPContentRule *cr;
        int             code;
        const char      *err;
 {
        LDAPContentRule *cr;
        int             code;
        const char      *err;
+       char *line = strchr( c->line, '(' );
 
 
-       cr = ldap_str2contentrule(line, &code, &err, LDAP_SCHEMA_ALLOW_ALL );
+       cr = ldap_str2contentrule( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL );
        if ( !cr ) {
        if ( !cr ) {
-               fprintf( stderr, "%s: line %d: %s before %s\n",
-                        fname, lineno, ldap_scherr2str(code), err );
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s before %s",
+                       c->argv[0], ldap_scherr2str( code ), err );
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                cr_usage();
                return 1;
        }
 
        if ( cr->cr_oid == NULL ) {
                cr_usage();
                return 1;
        }
 
        if ( cr->cr_oid == NULL ) {
-               fprintf( stderr,
-                       "%s: line %d: Content rule has no OID\n",
-                       fname, lineno );
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: OID is missing",
+                       c->argv[0] );
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                cr_usage();
                cr_usage();
-               return 1;
+               code = 1;
+               goto done;
        }
 
        }
 
-       code = cr_add(cr,1,scr,&err);
+       code = cr_add( cr, 1, scr, &err );
        if ( code ) {
        if ( code ) {
-               fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
-                        fname, lineno, scherr2str(code), err);
-               return 1;
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s: \"%s\"",
+                       c->argv[0], scherr2str(code), err);
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
+               code = 1;
+               goto done;
        }
 
        }
 
-       ldap_memfree(cr);
-       return 0;
+done:;
+       if ( code ) {
+               ldap_contentrule_free( cr );
+
+       } else {
+               ldap_memfree( cr );
+       }
+
+       return code;
 }
 
 int
 parse_oc(
 }
 
 int
 parse_oc(
-    const char *fname,
-    int                lineno,
-    char       *line,
-    char       **argv,
-       ObjectClass **soc )
+       struct config_args_s *c,
+       ObjectClass     **soc,
+       ObjectClass *prev )
 {
        LDAPObjectClass *oc;
        int             code;
        const char      *err;
 {
        LDAPObjectClass *oc;
        int             code;
        const char      *err;
+       char *line = strchr( c->line, '(' );
 
        oc = ldap_str2objectclass(line, &code, &err, LDAP_SCHEMA_ALLOW_ALL );
        if ( !oc ) {
 
        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 );
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s before %s",
+                       c->argv[0], ldap_scherr2str( code ), err );
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                oc_usage();
                return 1;
        }
 
        if ( oc->oc_oid == NULL ) {
                oc_usage();
                return 1;
        }
 
        if ( oc->oc_oid == NULL ) {
-               fprintf( stderr,
-                       "%s: line %d: objectclass has no OID\n",
-                       fname, lineno );
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: OID is missing",
+                       c->argv[0] );
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                oc_usage();
                oc_usage();
-               return 1;
+               code = 1;
+               goto done;
        }
 
        }
 
-       code = oc_add(oc,1,soc,&err);
+       code = oc_add( oc, 1, soc, prev, &err );
        if ( code ) {
        if ( code ) {
-               fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
-                        fname, lineno, scherr2str(code), err);
-               return 1;
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s: \"%s\"",
+                       c->argv[0], scherr2str(code), err);
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
+               code = 1;
+               goto done;
        }
 
        }
 
-       ldap_memfree(oc);
-       return 0;
+done:;
+       if ( code ) {
+               ldap_objectclass_free( oc );
+
+       } else {
+               ldap_memfree( oc );
+       }
+
+       return code;
 }
 
 static void
 }
 
 static void
@@ -246,45 +272,62 @@ at_usage( void )
 
 int
 parse_at(
 
 int
 parse_at(
-    const char *fname,
-    int                lineno,
-    char       *line,
-    char       **argv,
-       AttributeType **sat )
+       struct config_args_s *c,
+       AttributeType   **sat,
+       AttributeType   *prev )
 {
        LDAPAttributeType *at;
        int             code;
        const char      *err;
 {
        LDAPAttributeType *at;
        int             code;
        const char      *err;
+       char *line = strchr( c->line, '(' );
 
        at = ldap_str2attributetype( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL );
        if ( !at ) {
 
        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 );
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s before %s",
+                       c->argv[0], ldap_scherr2str(code), err );
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                at_usage();
                return 1;
        }
 
        if ( at->at_oid == NULL ) {
                at_usage();
                return 1;
        }
 
        if ( at->at_oid == NULL ) {
-               fprintf( stderr,
-                       "%s: line %d: attributeType has no OID\n",
-                       fname, lineno );
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: OID is missing",
+                       c->argv[0] );
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                at_usage();
                at_usage();
-               return 1;
+               code = 1;
+               goto done;
        }
 
        /* operational attributes should be defined internally */
        if ( at->at_usage ) {
        }
 
        /* 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;
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: \"%s\" is operational",
+                       c->argv[0], at->at_oid );
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
+               code = 1;
+               goto done;
        }
 
        }
 
-       code = at_add(at,1,sat,&err);
+       code = at_add( at, 1, sat, prev, &err);
        if ( code ) {
        if ( code ) {
-               fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
-                        fname, lineno, scherr2str(code), err);
-               return 1;
+               snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: %s: \"%s\"",
+                       c->argv[0], scherr2str(code), err);
+               Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
+                       "%s %s\n", c->log, c->cr_msg, 0 );
+               code = 1;
+               goto done;
        }
        }
-       ldap_memfree(at);
-       return 0;
+
+done:;
+       if ( code ) {
+               ldap_attributetype_free( at );
+
+       } else {
+               ldap_memfree( at );
+       }
+
+       return code;
 }
 }