]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schemaparse.c
Merge remote-tracking branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_4
[openldap] / servers / slapd / schemaparse.c
index bf37c50c37af87de0c8aa4537dec5b8489b2992c..be507d2137075f7058667a5cf47e2932061df07f 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2014 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,6 +49,9 @@ static char *const err2text[] = {
        "Duplicate matchingRule",
        "Syntax not found",
        "Duplicate ldapSyntax",
+       "Superior syntax not found",
+       "Substitute syntax not specified",
+       "Substitute syntax not found",
        "OID or name required",
        "Qualifier not supported",
        "Invalid NAME",
@@ -135,19 +138,19 @@ parse_cr(
 
        cr = ldap_str2contentrule( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL );
        if ( !cr ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: %s before %s",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                cr_usage();
                return 1;
        }
 
        if ( cr->cr_oid == NULL ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: OID is missing",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                cr_usage();
                code = 1;
                goto done;
@@ -155,10 +158,10 @@ parse_cr(
 
        code = cr_add( cr, 1, scr, &err );
        if ( code ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: %s: \"%s\"",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                code = 1;
                goto done;
        }
@@ -187,19 +190,19 @@ parse_oc(
 
        oc = ldap_str2objectclass(line, &code, &err, LDAP_SCHEMA_ALLOW_ALL );
        if ( !oc ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: %s before %s",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                oc_usage();
                return 1;
        }
 
        if ( oc->oc_oid == NULL ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: OID is missing",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                oc_usage();
                code = 1;
                goto done;
@@ -207,10 +210,10 @@ parse_oc(
 
        code = oc_add( oc, 1, soc, prev, &err );
        if ( code ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: %s: \"%s\"",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                code = 1;
                goto done;
        }
@@ -282,19 +285,19 @@ parse_at(
 
        at = ldap_str2attributetype( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL );
        if ( !at ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: %s before %s",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                at_usage();
                return 1;
        }
 
        if ( at->at_oid == NULL ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: OID is missing",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                at_usage();
                code = 1;
                goto done;
@@ -302,20 +305,20 @@ parse_at(
 
        /* operational attributes should be defined internally */
        if ( at->at_usage ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: \"%s\" is operational",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                code = 1;
                goto done;
        }
 
        code = at_add( at, 1, sat, prev, &err);
        if ( code ) {
-               snprintf( c->msg, sizeof( c->msg ), "%s: %s: \"%s\"",
+               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->msg, 0 );
+                       "%s %s\n", c->log, c->cr_msg, 0 );
                code = 1;
                goto done;
        }
@@ -330,3 +333,68 @@ done:;
 
        return code;
 }
+
+static void
+syn_usage( void )
+{
+       fprintf( stderr, "%s",
+               "SyntaxDescription = \"(\" whsp\n"
+               "  numericoid whsp                  ; object identifier\n"
+               "  [ whsp \"DESC\" whsp qdstring ]  ; description\n"
+               "  extensions whsp \")\"            ; extensions\n"
+               "  whsp \")\"\n");
+}
+
+int
+parse_syn(
+       struct config_args_s *c,
+       Syntax **ssyn,
+       Syntax *prev )
+{
+       LDAPSyntax              *syn;
+       slap_syntax_defs_rec    def = { 0 };
+       int                     code;
+       const char              *err;
+       char                    *line = strchr( c->line, '(' );
+
+       syn = ldap_str2syntax( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL );
+       if ( !syn ) {
+               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 );
+               syn_usage();
+               return 1;
+       }
+
+       if ( syn->syn_oid == NULL ) {
+               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 );
+               syn_usage();
+               code = 1;
+               goto done;
+       }
+
+       code = syn_add( syn, 1, &def, ssyn, prev, &err );
+       if ( code ) {
+               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;
+       }
+
+done:;
+       if ( code ) {
+               ldap_syntax_free( syn );
+
+       } else {
+               ldap_memfree( syn );
+       }
+
+       return code;
+}
+