version 1.12.8.5, 2000/06/13 17:57:30
|
version 1.12.8.12, 2001/09/18 18:38:16
|
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.11 2001/06/08 17:26:33 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 ( oc->oc_oid ) { |
if ( !isdigit( oc->oc_oid[0] )) { |
if ( !OID_LEADCHAR( oc->oc_oid[0] )) { |
/* Expand OID macros */ |
/* Expand OID macros */ |
oid = find_oidm( oc->oc_oid ); |
oid = find_oidm( oc->oc_oid ); |
if ( !oid ) { |
if ( !oid ) { |
fprintf(stderr, |
fprintf(stderr, |
"%s: line %d: OID %s not recognized\n", |
"%s: line %d: OID %s not recognized\n", |
fname, lineno, oc->oc_oid); |
fname, lineno, oc->oc_oid); |
exit( EXIT_FAILURE ); |
return 1; |
} |
} |
if ( oid != oc->oc_oid ) { |
if ( oid != oc->oc_oid ) { |
ldap_memfree( oc->oc_oid ); |
ldap_memfree( oc->oc_oid ); |
Line 193 parse_oc(
|
Line 219 parse_oc(
|
} |
} |
} |
} |
} |
} |
|
|
/* oc->oc_oid == NULL will be an error someday */ |
/* 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 247 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 274 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 284 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 ( at->at_oid ) { |
if ( !isdigit( at->at_oid[0] )) { |
if ( !OID_LEADCHAR( at->at_oid[0] )) { |
/* Expand OID macros */ |
/* Expand OID macros */ |
oid = find_oidm( at->at_oid ); |
oid = find_oidm( at->at_oid ); |
if ( !oid ) { |
if ( !oid ) { |
fprintf(stderr, |
fprintf(stderr, |
"%s: line %d: OID %s not recognized\n", |
"%s: line %d: OID %s not recognized\n", |
fname, lineno, at->at_oid); |
fname, lineno, at->at_oid); |
exit( EXIT_FAILURE ); |
return 1; |
} |
} |
if ( oid != at->at_oid ) { |
if ( oid != at->at_oid ) { |
ldap_memfree( at->at_oid ); |
ldap_memfree( at->at_oid ); |
Line 311 parse_at(
|
Line 314 parse_at(
|
} |
} |
} |
} |
/* at->at_oid == NULL will be an error someday */ |
/* 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; |
} |
} |