]> 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 c02fdea215f2e38c16e84f3475f0bc8df79640d0..be507d2137075f7058667a5cf47e2932061df07f 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2008 The OpenLDAP Foundation.
+ * Copyright 1998-2014 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -50,6 +50,8 @@ static char *const err2text[] = {
        "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",
@@ -331,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;
+}
+