]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schemaparse.c
allow definition of syntaxes via configuration, including X-SUBST (ITS#5663)
[openldap] / servers / slapd / schemaparse.c
index fa9cb2ee076cdf76875c099842a2333fd0e5f7c5..ce2d4ce7eae6270eb65d5067192607e96969100b 100644 (file)
@@ -333,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;
+}
+