]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schemaparse.c
Minor cleanup
[openldap] / servers / slapd / schemaparse.c
index add1166a3e4c41b1317339627224c974f51d5893..cd73b41b0a69b70128263a1f11e88766249ae7a9 100644 (file)
 
 int    global_schemacheck = 1; /* schemacheck on is default */
 
-static void            oc_usage(void)     LDAP_GCCATTR((noreturn));
-static void            at_usage(void)     LDAP_GCCATTR((noreturn));
+static void            oc_usage(void)
+static void            at_usage(void);
 
 static char *const err2text[] = {
-       "Unknown Error",
+       "Success",
        "Out of memory",
        "ObjectClass not found",
+       "ObjectClass inappropriate SUPerior",
        "AttributeType not found",
+       "AttributeType inappropriate USAGE",
        "Duplicate objectClass",
        "Duplicate attributeType",
        "Duplicate ldapSyntax",
@@ -34,19 +36,39 @@ static char *const err2text[] = {
        "SYNTAX or SUPerior required",
        "MatchingRule not found",
        "Syntax not found",
-       "Syntax required"
+       "Syntax required",
+       "Qualifier not supported",
+       "Invalid NAME"
 };
 
 char *
 scherr2str(int code)
 {
-       if ( code < 1 || code >= (sizeof(err2text)/sizeof(char *)) ) {
-               return err2text[0];
+       if ( code < 0 || code >= (sizeof(err2text)/sizeof(char *)) ) {
+               return "Unknown error";
        } else {
                return err2text[code];
        }
 }
 
+/* check schema descr validity */
+int slap_valid_descr( const char *descr )
+{
+       int i=0;
+
+       if( !DESC_LEADCHAR( descr[i] ) ) {
+               return 0;
+       }
+
+       while( descr[++i] ) {
+               if( !DESC_CHAR( descr[i] ) ) {
+                       return 0;
+               }
+       }
+
+       return 1;
+}
+
 
 /* OID Macros */
 
@@ -78,7 +100,7 @@ find_oidm(char *oid)
        OidMacro *om;
 
        /* OID macros must start alpha */
-       if ( isdigit( *oid ) )  {
+       if ( OID_LEADCHAR( *oid ) )     {
                return oid;
        }
 
@@ -110,7 +132,7 @@ find_oidm(char *oid)
        return NULL;
 }
 
-void
+int
 parse_oidm(
     const char *fname,
     int                lineno,
@@ -125,7 +147,7 @@ parse_oidm(
                fprintf( stderr, "%s: line %d: too many arguments\n",
                        fname, lineno );
 usage: fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");
-               exit( EXIT_FAILURE );
+               return 1;
        }
 
        oid = find_oidm( argv[1] );
@@ -134,7 +156,7 @@ usage:      fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");
                        "%s: line %d: "
                        "ObjectIdentifier \"%s\" previously defined \"%s\"",
                        fname, lineno, argv[1], oid );
-               exit( EXIT_FAILURE );
+               return 1;
        }
 
        om = (OidMacro *) ch_malloc( sizeof(OidMacro) );
@@ -156,9 +178,11 @@ usage:     fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");
        om->som_oid.bv_len = strlen( om->som_oid.bv_val );
        om->som_next = om_list;
        om_list = om;
+
+       return 0;
 }
 
-void
+int
 parse_oc(
     const char *fname,
     int                lineno,
@@ -166,7 +190,7 @@ parse_oc(
     char       **argv
 )
 {
-       LDAP_OBJECT_CLASS *oc;
+       LDAPObjectClass *oc;
        int             code;
        const char      *err;
        char            *oid = NULL;
@@ -176,16 +200,18 @@ parse_oc(
                fprintf( stderr, "%s: line %d: %s before %s\n",
                         fname, lineno, ldap_scherr2str(code), err );
                oc_usage();
+               return 1;
        }
+
        if ( oc->oc_oid ) {
-               if ( !isdigit( oc->oc_oid[0] )) {
+               if ( !OID_LEADCHAR( oc->oc_oid[0] )) {
                        /* Expand OID macros */
                        oid = find_oidm( oc->oc_oid );
                        if ( !oid ) {
                                fprintf(stderr,
                                        "%s: line %d: OID %s not recognized\n",
                                        fname, lineno, oc->oc_oid);
-                               exit( EXIT_FAILURE );
+                               return 1;
                        }
                        if ( oid != oc->oc_oid ) {
                                ldap_memfree( oc->oc_oid );
@@ -193,61 +219,64 @@ parse_oc(
                        }
                }
        }
+
        /* oc->oc_oid == NULL will be an error someday */
        code = oc_add(oc,&err);
        if ( code ) {
                fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
                         fname, lineno, scherr2str(code), err);
-               exit( EXIT_FAILURE );
+               return 1;
        }
+
        ldap_memfree(oc);
+       return 0;
 }
 
 static void
 oc_usage( void )
 {
-       fprintf( stderr, "ObjectClassDescription = \"(\" whsp\n");
-       fprintf( stderr, "  numericoid whsp      ; ObjectClass identifier\n");
-       fprintf( stderr, "  [ \"NAME\" qdescrs ]\n");
-       fprintf( stderr, "  [ \"DESC\" qdstring ]\n");
-       fprintf( stderr, "  [ \"OBSOLETE\" whsp ]\n");
-       fprintf( stderr, "  [ \"SUP\" oids ]       ; Superior ObjectClasses\n");
-       fprintf( stderr, "  [ ( \"ABSTRACT\" / \"STRUCTURAL\" / \"AUXILIARY\" ) whsp ]\n");
-       fprintf( stderr, "                       ; default structural\n");
-       fprintf( stderr, "  [ \"MUST\" oids ]      ; AttributeTypes\n");
-       fprintf( stderr, "  [ \"MAY\" oids ]       ; AttributeTypes\n");
-       fprintf( stderr, "whsp \")\"\n");
-       exit( EXIT_FAILURE );
+       fprintf( stderr,
+               "ObjectClassDescription = \"(\" whsp\n"
+               "  numericoid whsp                 ; ObjectClass identifier\n"
+               "  [ \"NAME\" qdescrs ]\n"
+               "  [ \"DESC\" qdstring ]\n"
+               "  [ \"OBSOLETE\" whsp ]\n"
+               "  [ \"SUP\" oids ]                ; Superior ObjectClasses\n"
+               "  [ ( \"ABSTRACT\" / \"STRUCTURAL\" / \"AUXILIARY\" ) whsp ]\n"
+               "                                  ; default structural\n"
+               "  [ \"MUST\" oids ]               ; AttributeTypes\n"
+               "  [ \"MAY\" oids ]                ; AttributeTypes\n"
+               "  whsp \")\"\n" );
 }
 
 
 static void
 at_usage( void )
 {
-       fprintf( stderr, "AttributeTypeDescription = \"(\" whsp\n");
-       fprintf( stderr, "  numericoid whsp      ; AttributeType identifier\n");
-       fprintf( stderr, "  [ \"NAME\" qdescrs ]             ; name used in AttributeType\n");
-       fprintf( stderr, "  [ \"DESC\" qdstring ]            ; description\n");
-       fprintf( stderr, "  [ \"OBSOLETE\" whsp ]\n");
-       fprintf( stderr, "  [ \"SUP\" woid ]                 ; derived from this other\n");
-       fprintf( stderr, "                                 ; AttributeType\n");
-       fprintf( stderr, "  [ \"EQUALITY\" woid ]            ; Matching Rule name\n");
-        fprintf( stderr, "  [ \"ORDERING\" woid ]            ; Matching Rule name\n");
-       fprintf( stderr, "  [ \"SUBSTR\" woid ]              ; Matching Rule name\n");
-       fprintf( stderr, "  [ \"SYNTAX\" whsp noidlen whsp ] ; see section 4.3\n");
-       fprintf( stderr, "  [ \"SINGLE-VALUE\" whsp ]        ; default multi-valued\n");
-       fprintf( stderr, "  [ \"COLLECTIVE\" whsp ]          ; default not collective\n");
-       fprintf( stderr, "  [ \"NO-USER-MODIFICATION\" whsp ]; default user modifiable\n");
-       fprintf( stderr, "  [ \"USAGE\" whsp AttributeUsage ]; default userApplications\n");
-       fprintf( stderr, "                                 ; userApplications\n");
-       fprintf( stderr, "                                 ; directoryOperation\n");
-       fprintf( stderr, "                                 ; distributedOperation\n");
-       fprintf( stderr, "                                 ; dSAOperation\n");
-       fprintf( stderr, "whsp \")\"\n");
-       exit( EXIT_FAILURE );
+       fprintf( stderr,
+               "AttributeTypeDescription = \"(\" whsp\n"
+               "  numericoid whsp      ; AttributeType identifier\n"
+               "  [ \"NAME\" qdescrs ]             ; name used in AttributeType\n"
+               "  [ \"DESC\" qdstring ]            ; description\n"
+               "  [ \"OBSOLETE\" whsp ]\n"
+               "  [ \"SUP\" woid ]                 ; derived from this other\n"
+               "                                   ; AttributeType\n"
+               "  [ \"EQUALITY\" woid ]            ; Matching Rule name\n"
+               "  [ \"ORDERING\" woid ]            ; Matching Rule name\n"
+               "  [ \"SUBSTR\" woid ]              ; Matching Rule name\n"
+               "  [ \"SYNTAX\" whsp noidlen whsp ] ; see section 4.3\n"
+               "  [ \"SINGLE-VALUE\" whsp ]        ; default multi-valued\n"
+               "  [ \"COLLECTIVE\" whsp ]          ; default not collective\n"
+               "  [ \"NO-USER-MODIFICATION\" whsp ]; default user modifiable\n"
+               "  [ \"USAGE\" whsp AttributeUsage ]; default userApplications\n"
+               "                                   ; userApplications\n"
+               "                                   ; directoryOperation\n"
+               "                                   ; distributedOperation\n"
+               "                                   ; dSAOperation\n"
+               "  whsp \")\"\n");
 }
 
-void
+int
 parse_at(
     const char *fname,
     int                lineno,
@@ -255,7 +284,7 @@ parse_at(
     char       **argv
 )
 {
-       LDAP_ATTRIBUTE_TYPE *at;
+       LDAPAttributeType *at;
        int             code;
        const char      *err;
        char            *oid = NULL;
@@ -269,8 +298,9 @@ parse_at(
         */
        for (; argv[3]; argv++)
        {
-               if (!strcasecmp(argv[3], "syntax") &&
-                   !isdigit(*argv[4]))
+               /* Allow numeric OIDs to be wrapped in single quotes */
+               if (!strcasecmp(argv[3], "syntax") && argv[4] != NULL &&
+                   !OID_LEADCHAR(argv[4][argv[4][0] == '\'' ? 1 : 0]))
                {
                        int slen;
                        Syntax *syn;
@@ -279,7 +309,7 @@ parse_at(
                        {
                            fprintf(stderr, "%s: line %d: OID %s not found\n",
                                fname, lineno, argv[4]);
-                           exit( EXIT_FAILURE );
+                               return 1;
                        }
                        memset(strstr(line, argv[4]), '0', slen);
                        soid = ch_strdup(syn->ssyn_syn.syn_oid );
@@ -291,16 +321,17 @@ parse_at(
                fprintf( stderr, "%s: line %d: %s before %s\n",
                         fname, lineno, ldap_scherr2str(code), err );
                at_usage();
+               return 1;
        }
        if ( at->at_oid ) {
-               if ( !isdigit( at->at_oid[0] )) {
+               if ( !OID_LEADCHAR( at->at_oid[0] )) {
                        /* Expand OID macros */
                        oid = find_oidm( at->at_oid );
                        if ( !oid ) {
                                fprintf(stderr,
                                        "%s: line %d: OID %s not recognized\n",
                                        fname, lineno, at->at_oid);
-                               exit( EXIT_FAILURE );
+                               return 1;
                        }
                        if ( oid != at->at_oid ) {
                                ldap_memfree( at->at_oid );
@@ -309,8 +340,7 @@ parse_at(
                }
        }
        /* at->at_oid == NULL will be an error someday */
-       if (soid)
-       {
+       if (soid) {
                ldap_memfree(at->at_syntax_oid);
                at->at_syntax_oid = soid;
        }
@@ -318,7 +348,8 @@ parse_at(
        if ( code ) {
                fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
                         fname, lineno, scherr2str(code), err);
-               exit( EXIT_FAILURE );
+               return 1;
        }
        ldap_memfree(at);
+       return 0;
 }