Diff for /servers/slapd/schemaparse.c between versions 1.12.8.5 and 1.12.8.13

version 1.12.8.5, 2000/06/13 17:57:30 version 1.12.8.13, 2001/10/11 16:49:04
Line 1 Line 1
 /* schemaparse.c - routines to parse config file objectclass definitions */  /* schemaparse.c - routines to parse config file objectclass definitions */
 /* $OpenLDAP: pkg/ldap/servers/slapd/schemaparse.c,v 1.34 2000/06/07 03:17:30 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/schemaparse.c,v 1.12.8.12 2001/09/18 18:38:16 kurt Exp $ */
 /*  /*
  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.   * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file   * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
Line 18 Line 18
   
 int     global_schemacheck = 1; /* schemacheck on is default */  int     global_schemacheck = 1; /* schemacheck on is default */
   
 static void             oc_usage(void)     LDAP_GCCATTR((noreturn));  static void             oc_usage(void); 
 static void             at_usage(void)     LDAP_GCCATTR((noreturn));  static void             at_usage(void);
   
 static char *const err2text[] = {  static char *const err2text[] = {
         "Success",          "Success",
         "Out of memory",          "Out of memory",
         "ObjectClass not found",          "ObjectClass not found",
           "ObjectClass inappropriate SUPerior",
         "AttributeType not found",          "AttributeType not found",
           "AttributeType inappropriate USAGE",
         "Duplicate objectClass",          "Duplicate objectClass",
         "Duplicate attributeType",          "Duplicate attributeType",
         "Duplicate ldapSyntax",          "Duplicate ldapSyntax",
Line 34  static char *const err2text[] = { Line 36  static char *const err2text[] = {
         "SYNTAX or SUPerior required",          "SYNTAX or SUPerior required",
         "MatchingRule not found",          "MatchingRule not found",
         "Syntax not found",          "Syntax not found",
         "Syntax required"          "Syntax required",
           "Qualifier not supported",
           "Invalid NAME"
 };  };
   
 char *  char *
Line 47  scherr2str(int code) Line 51  scherr2str(int 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 */  /* OID Macros */
   
Line 78  find_oidm(char *oid) Line 100  find_oidm(char *oid)
         OidMacro *om;          OidMacro *om;
   
         /* OID macros must start alpha */          /* OID macros must start alpha */
         if ( isdigit( *oid ) )  {          if ( OID_LEADCHAR( *oid ) )     {
                 return oid;                  return oid;
         }          }
   
Line 110  find_oidm(char *oid) Line 132  find_oidm(char *oid)
         return NULL;          return NULL;
 }  }
   
 void  int
 parse_oidm(  parse_oidm(
     const char  *fname,      const char  *fname,
     int         lineno,      int         lineno,
Line 125  parse_oidm( Line 147  parse_oidm(
                 fprintf( stderr, "%s: line %d: too many arguments\n",                  fprintf( stderr, "%s: line %d: too many arguments\n",
                         fname, lineno );                          fname, lineno );
 usage:  fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");  usage:  fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");
                 exit( EXIT_FAILURE );                  return 1;
         }          }
   
         oid = find_oidm( argv[1] );          oid = find_oidm( argv[1] );
Line 134  usage: fprintf( stderr, "\tObjectIdentif Line 156  usage: fprintf( stderr, "\tObjectIdentif
                         "%s: line %d: "                          "%s: line %d: "
                         "ObjectIdentifier \"%s\" previously defined \"%s\"",                          "ObjectIdentifier \"%s\" previously defined \"%s\"",
                         fname, lineno, argv[1], oid );                          fname, lineno, argv[1], oid );
                 exit( EXIT_FAILURE );                  return 1;
         }          }
   
         om = (OidMacro *) ch_malloc( sizeof(OidMacro) );          om = (OidMacro *) ch_malloc( sizeof(OidMacro) );
Line 156  usage: fprintf( stderr, "\tObjectIdentif Line 178  usage: fprintf( stderr, "\tObjectIdentif
         om->som_oid.bv_len = strlen( om->som_oid.bv_val );          om->som_oid.bv_len = strlen( om->som_oid.bv_val );
         om->som_next = om_list;          om->som_next = om_list;
         om_list = om;          om_list = om;
   
           return 0;
 }  }
   
 void  int
 parse_oc(  parse_oc(
     const char  *fname,      const char  *fname,
     int         lineno,      int         lineno,
Line 166  parse_oc( Line 190  parse_oc(
     char        **argv      char        **argv
 )  )
 {  {
         LDAP_OBJECT_CLASS *oc;          LDAPObjectClass *oc;
         int             code;          int             code;
         const char      *err;          const char      *err;
         char            *oid = NULL;          char            *oid = NULL;
Line 176  parse_oc( Line 200  parse_oc(
                 fprintf( stderr, "%s: line %d: %s before %s\n",                  fprintf( stderr, "%s: line %d: %s before %s\n",
                          fname, lineno, ldap_scherr2str(code), err );                           fname, lineno, ldap_scherr2str(code), err );
                 oc_usage();                  oc_usage();
                   return 1;
         }          }
         if ( oc->oc_oid ) {  
                 if ( !isdigit( oc->oc_oid[0] )) {          if ( oc->oc_oid == NULL ) {
                         /* Expand OID macros */                  fprintf( stderr,
                         oid = find_oidm( oc->oc_oid );                          "%s: line %d: objectclass has no OID\n",
                         if ( !oid ) {                          fname, lineno );
                                 fprintf(stderr,                  oc_usage();
                                         "%s: line %d: OID %s not recognized\n",                  return 1;
                                         fname, lineno, oc->oc_oid);          }
                                 exit( EXIT_FAILURE );  
                         }          if ( !OID_LEADCHAR( oc->oc_oid[0] )) {
                         if ( oid != oc->oc_oid ) {                  /* Expand OID macros */
                                 ldap_memfree( oc->oc_oid );                  oid = find_oidm( oc->oc_oid );
                                 oc->oc_oid = oid;                  if ( !oid ) {
                         }                          fprintf( stderr,
                                   "%s: line %d: OID %s not recognized\n",
                                   fname, lineno, oc->oc_oid);
                           return 1;
                   }
                   if ( oid != oc->oc_oid ) {
                           ldap_memfree( oc->oc_oid );
                           oc->oc_oid = oid;
                 }                  }
         }          }
         /* oc->oc_oid == NULL will be an error someday */  
         code = oc_add(oc,&err);          code = oc_add(oc,&err);
         if ( code ) {          if ( code ) {
                 fprintf( stderr, "%s: line %d: %s: \"%s\"\n",                  fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
                          fname, lineno, scherr2str(code), err);                           fname, lineno, scherr2str(code), err);
                 exit( EXIT_FAILURE );                  return 1;
         }          }
   
         ldap_memfree(oc);          ldap_memfree(oc);
           return 0;
 }  }
   
 static void  static void
Line 218  oc_usage( void ) Line 252  oc_usage( void )
                 "  [ \"MUST\" oids ]               ; AttributeTypes\n"                  "  [ \"MUST\" oids ]               ; AttributeTypes\n"
                 "  [ \"MAY\" oids ]                ; AttributeTypes\n"                  "  [ \"MAY\" oids ]                ; AttributeTypes\n"
                 "  whsp \")\"\n" );                  "  whsp \")\"\n" );
         exit( EXIT_FAILURE );  
 }  }
   
   
Line 246  at_usage( void ) Line 279  at_usage( void )
                 "                                   ; distributedOperation\n"                  "                                   ; distributedOperation\n"
                 "                                   ; dSAOperation\n"                  "                                   ; dSAOperation\n"
                 "  whsp \")\"\n");                  "  whsp \")\"\n");
         exit( EXIT_FAILURE );  
 }  }
   
 void  int
 parse_at(  parse_at(
     const char  *fname,      const char  *fname,
     int         lineno,      int         lineno,
Line 257  parse_at( Line 289  parse_at(
     char        **argv      char        **argv
 )  )
 {  {
         LDAP_ATTRIBUTE_TYPE *at;          LDAPAttributeType *at;
         int             code;          int             code;
         const char      *err;          const char      *err;
         char            *oid = NULL;          char            *oid = NULL;
         char            *soid = NULL;          char            *soid = NULL;
   
         /* Kludge for OIDmacros for syntaxes. If the syntax field starts  
          * nonnumeric, look for and expand a macro. The macro's place in  
          * the input line will be replaced with a field of '0's to keep  
          * ldap_str2attributetype happy. The actual oid will be swapped  
          * into place afterwards.  
          */  
         for (; argv[3]; argv++)  
         {  
                 if (!strcasecmp(argv[3], "syntax") &&  
                     !isdigit(*argv[4]))  
                 {  
                         int slen;  
                         Syntax *syn;  
                         syn = syn_find_desc(argv[4], &slen);  
                         if (!syn)  
                         {  
                             fprintf(stderr, "%s: line %d: OID %s not found\n",  
                                 fname, lineno, argv[4]);  
                             exit( EXIT_FAILURE );  
                         }  
                         memset(strstr(line, argv[4]), '0', slen);  
                         soid = ch_strdup(syn->ssyn_syn.syn_oid );  
                         break;  
                 }  
         }  
         at = ldap_str2attributetype(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL);          at = ldap_str2attributetype(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL);
         if ( !at ) {          if ( !at ) {
                 fprintf( stderr, "%s: line %d: %s before %s\n",                  fprintf( stderr, "%s: line %d: %s before %s\n",
                          fname, lineno, ldap_scherr2str(code), err );                           fname, lineno, ldap_scherr2str(code), err );
                 at_usage();                  at_usage();
                   return 1;
         }          }
         if ( at->at_oid ) {  
                 if ( !isdigit( at->at_oid[0] )) {          if ( at->at_oid == NULL ) {
                         /* Expand OID macros */                  fprintf( stderr,
                         oid = find_oidm( at->at_oid );                          "%s: line %d: attributeType has no OID\n",
                         if ( !oid ) {                          fname, lineno );
                                 fprintf(stderr,                  at_usage();
                                         "%s: line %d: OID %s not recognized\n",                  return 1;
                                         fname, lineno, at->at_oid);          }
                                 exit( EXIT_FAILURE );  
                         }          if ( !OID_LEADCHAR( at->at_oid[0] )) {
                         if ( oid != at->at_oid ) {                  /* Expand OID macros */
                                 ldap_memfree( at->at_oid );                  oid = find_oidm( at->at_oid );
                                 at->at_oid = oid;                  if ( !oid ) {
                         }                          fprintf( stderr,
                                   "%s: line %d: OID %s not recognized\n",
                                   fname, lineno, at->at_oid);
                           return 1;
                   }
                   if ( oid != at->at_oid ) {
                           ldap_memfree( at->at_oid );
                           at->at_oid = oid;
                 }                  }
         }          }
         /* at->at_oid == NULL will be an error someday */  
         if (soid)          if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) {
         {                  /* Expand OID macros */
                 ldap_memfree(at->at_syntax_oid);                  oid = find_oidm( at->at_syntax_oid );
                 at->at_syntax_oid = soid;                  if ( !oid ) {
                           fprintf(stderr,
                                   "%s: line %d: OID %s not recognized\n",
                                   fname, lineno, at->at_syntax_oid);
                           return 1;
                   }
                   if ( oid != at->at_syntax_oid ) {
                           ldap_memfree( at->at_syntax_oid );
                           at->at_syntax_oid = oid;
                   }
   
         }          }
         code = at_add(at,&err);          code = at_add(at,&err);
         if ( code ) {          if ( code ) {
                 fprintf( stderr, "%s: line %d: %s: \"%s\"\n",                  fprintf( stderr, "%s: line %d: %s: \"%s\"\n",
                          fname, lineno, scherr2str(code), err);                           fname, lineno, scherr2str(code), err);
                 exit( EXIT_FAILURE );                  return 1;
         }          }
         ldap_memfree(at);          ldap_memfree(at);
           return 0;
 }  }

Removed from v.1.12.8.5  
changed lines
  Added in v.1.12.8.13


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org