Commit 6ed15e33 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

Another round of operational attribute changes... more to follow.

parent 91644aff
......@@ -274,7 +274,35 @@ at_add(
MatchingRule *mr;
Syntax *syn;
int code;
char *cname;
char *cname;
char *oid;
if ( !OID_LEADCHAR( at->at_oid[0] )) {
/* Expand OID macros */
oid = oidm_find( at->at_oid );
if ( !oid ) {
*err = at->at_oid;
return SLAP_SCHERR_OIDM;
}
if ( oid != at->at_oid ) {
ldap_memfree( at->at_oid );
at->at_oid = oid;
}
}
if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) {
/* Expand OID macros */
oid = oidm_find( at->at_syntax_oid );
if ( !oid ) {
*err = at->at_syntax_oid;
return SLAP_SCHERR_OIDM;
}
if ( oid != at->at_syntax_oid ) {
ldap_memfree( at->at_syntax_oid );
at->at_syntax_oid = oid;
}
}
if ( at->at_names && at->at_names[0] ) {
int i;
......
/* schemaparse.c - routines to parse config file objectclass definitions */
/* $OpenLDAP$ */
/*
* Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
#include "portable.h"
#include <stdio.h>
#include <ac/ctype.h>
#include <ac/string.h>
#include <ac/socket.h>
#include "slap.h"
static OidMacro *om_list = NULL;
/* Replace an OID Macro invocation with its full numeric OID.
* If the macro is used with "macroname:suffix" append ".suffix"
* to the expansion.
*/
char *
oidm_find(char *oid)
{
OidMacro *om;
/* OID macros must start alpha */
if ( OID_LEADCHAR( *oid ) ) {
return oid;
}
for (om = om_list; om; om=om->som_next) {
char **names = om->som_names;
if( names == NULL ) {
continue;
}
for( ; *names != NULL ; names++ ) {
int pos = dscompare(*names, oid, ':');
if( pos ) {
int suflen = strlen(oid + pos);
char *tmp = ch_malloc( om->som_oid.bv_len
+ suflen + 1);
strcpy(tmp, om->som_oid.bv_val);
if( suflen ) {
suflen = om->som_oid.bv_len;
tmp[suflen++] = '.';
strcpy(tmp+suflen, oid+pos+1);
}
return tmp;
}
}
}
return NULL;
}
void
oidm_destroy()
{
OidMacro *om, *n;
for (om = om_list; om; om = n) {
n = om->som_next;
charray_free(om->som_names);
free(om->som_oid.bv_val);
free(om);
}
}
int
parse_oidm(
const char *fname,
int lineno,
int argc,
char **argv
)
{
char *oid;
OidMacro *om;
if (argc != 3) {
fprintf( stderr, "%s: line %d: too many arguments\n",
fname, lineno );
usage: fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");
return 1;
}
oid = oidm_find( argv[1] );
if( oid != NULL ) {
fprintf( stderr,
"%s: line %d: "
"ObjectIdentifier \"%s\" previously defined \"%s\"",
fname, lineno, argv[1], oid );
return 1;
}
om = (OidMacro *) ch_malloc( sizeof(OidMacro) );
om->som_names = NULL;
charray_add( &om->som_names, argv[1] );
om->som_oid.bv_val = oidm_find( argv[2] );
if (!om->som_oid.bv_val) {
fprintf( stderr, "%s: line %d: OID %s not recognized\n",
fname, lineno, argv[2] );
goto usage;
}
if (om->som_oid.bv_val == argv[2]) {
om->som_oid.bv_val = ch_strdup( argv[2] );
}
om->som_oid.bv_len = strlen( om->som_oid.bv_val );
om->som_next = om_list;
om_list = om;
return 0;
}
......@@ -571,6 +571,14 @@ LDAP_SLAPD_F (void) mra_free LDAP_P((
MatchingRuleAssertion *mra,
int freeit ));
/*
* oidm.c
*/
LDAP_SLAPD_F(char *) oidm_find(char *oid);
LDAP_SLAPD_F (void) oidm_destroy LDAP_P(( void ));
LDAP_SLAPD_F (int) parse_oidm LDAP_P((
const char *fname, int lineno, int argc, char **argv ));
/*
* operation.c
*/
......@@ -718,7 +726,6 @@ LDAP_SLAPD_F (int) syn_schema_info( Entry *e );
*/
LDAP_SLAPD_F (void) oc_destroy LDAP_P(( void ));
LDAP_SLAPD_F (void) oidm_destroy LDAP_P(( void ));
LDAP_SLAPD_F (void) at_destroy LDAP_P(( void ));
LDAP_SLAPD_F (void) ad_destroy LDAP_P(( AttributeDescription * ));
LDAP_SLAPD_F (void) mr_destroy LDAP_P(( void ));
......@@ -851,8 +858,6 @@ LDAP_SLAPD_F (int) parse_oc LDAP_P((
const char *fname, int lineno, char *line, char **argv ));
LDAP_SLAPD_F (int) parse_at LDAP_P((
const char *fname, int lineno, char *line, char **argv ));
LDAP_SLAPD_F (int) parse_oidm LDAP_P((
const char *fname, int lineno, int argc, char **argv ));
LDAP_SLAPD_F (char *) scherr2str LDAP_P((int code)) LDAP_GCCATTR((const));
LDAP_SLAPD_F (int) dscompare LDAP_P(( const char *s1, const char *s2del,
char delim ));
......
......@@ -408,6 +408,39 @@ static struct slap_schema_syn_map {
int
slap_schema_load( void )
{
int i;
for( i=0; ad_map[i].ssam_name; i++ ) {
if( ad_map[i].ssam_defn != NULL ) {
LDAPAttributeType *at;
int code;
const char *err;
at = ldap_str2attributetype( ad_map[i].ssam_defn,
&code, &err, LDAP_SCHEMA_ALLOW_ALL );
if ( !at ) {
fprintf( stderr,
"slap_schema_load: %s: %s before %s\n",
ad_map[i].ssam_name, ldap_scherr2str(code), err );
return code;
}
if ( at->at_oid == NULL ) {
fprintf( stderr, "slap_schema_load: "
"attributeType \"%s\" has no OID\n",
ad_map[i].ssam_name );
return LDAP_OTHER;
}
code = at_add( at, &err );
if ( code ) {
fprintf( stderr, "slap_schema_load: "
"%s: %s: \"%s\"\n",
ad_map[i].ssam_name, scherr2str(code), err );
return code;
}
ldap_memfree( at );
}
}
return LDAP_SUCCESS;
}
......
......@@ -21,7 +21,7 @@ int global_schemacheck = 1; /* schemacheck ON is default */
static void oc_usage(void);
static void at_usage(void);
static char *const err2text[] = {
static char *const err2text[SLAP_SCHERR_LAST+1] = {
"Success",
"Out of memory",
"ObjectClass not found",
......@@ -38,7 +38,8 @@ static char *const err2text[] = {
"Syntax not found",
"Syntax required",
"Qualifier not supported",
"Invalid NAME"
"Invalid NAME",
"OID could not be expanded"
};
char *
......@@ -88,111 +89,6 @@ dscompare(const char *s1, const char *s2, char delim)
return 0;
}
static OidMacro *om_list = NULL;
/* Replace an OID Macro invocation with its full numeric OID.
* If the macro is used with "macroname:suffix" append ".suffix"
* to the expansion.
*/
static char *
find_oidm(char *oid)
{
OidMacro *om;
/* OID macros must start alpha */
if ( OID_LEADCHAR( *oid ) ) {
return oid;
}
for (om = om_list; om; om=om->som_next) {
char **names = om->som_names;
if( names == NULL ) {
continue;
}
for( ; *names != NULL ; names++ ) {
int pos = dscompare(*names, oid, ':');
if( pos ) {
int suflen = strlen(oid + pos);
char *tmp = ch_malloc( om->som_oid.bv_len
+ suflen + 1);
strcpy(tmp, om->som_oid.bv_val);
if( suflen ) {
suflen = om->som_oid.bv_len;
tmp[suflen++] = '.';
strcpy(tmp+suflen, oid+pos+1);
}
return tmp;
}
}
}
return NULL;
}
void
oidm_destroy()
{
OidMacro *om, *n;
for (om = om_list; om; om = n) {
n = om->som_next;
charray_free(om->som_names);
free(om->som_oid.bv_val);
free(om);
}
}
int
parse_oidm(
const char *fname,
int lineno,
int argc,
char **argv
)
{
char *oid;
OidMacro *om;
if (argc != 3) {
fprintf( stderr, "%s: line %d: too many arguments\n",
fname, lineno );
usage: fprintf( stderr, "\tObjectIdentifier <name> <oid>\n");
return 1;
}
oid = find_oidm( argv[1] );
if( oid != NULL ) {
fprintf( stderr,
"%s: line %d: "
"ObjectIdentifier \"%s\" previously defined \"%s\"",
fname, lineno, argv[1], oid );
return 1;
}
om = (OidMacro *) ch_malloc( sizeof(OidMacro) );
om->som_names = NULL;
charray_add( &om->som_names, argv[1] );
om->som_oid.bv_val = find_oidm( argv[2] );
if (!om->som_oid.bv_val) {
fprintf( stderr, "%s: line %d: OID %s not recognized\n",
fname, lineno, argv[2] );
goto usage;
}
if (om->som_oid.bv_val == argv[2]) {
om->som_oid.bv_val = ch_strdup( argv[2] );
}
om->som_oid.bv_len = strlen( om->som_oid.bv_val );
om->som_next = om_list;
om_list = om;
return 0;
}
int
parse_oc(
......@@ -225,7 +121,7 @@ parse_oc(
if ( !OID_LEADCHAR( oc->oc_oid[0] )) {
/* Expand OID macros */
oid = find_oidm( oc->oc_oid );
oid = oidm_find( oc->oc_oid );
if ( !oid ) {
fprintf( stderr,
"%s: line %d: OID %s not recognized\n",
......@@ -306,7 +202,7 @@ parse_at(
const char *err;
char *oid = NULL;
at = ldap_str2attributetype(line,&code,&err,LDAP_SCHEMA_ALLOW_ALL);
at = ldap_str2attributetype( line, &code, &err, LDAP_SCHEMA_ALLOW_ALL );
if ( !at ) {
fprintf( stderr, "%s: line %d: %s before %s\n",
fname, lineno, ldap_scherr2str(code), err );
......@@ -322,45 +218,12 @@ parse_at(
return 1;
}
#if 0
/* operational attributes should be defined internally */
if ( at->at_usage ) {
fprintf( stderr, "%s: line %d: attribute type \"%s\" is operational\n",
fname, lineno, at->at_oid );
return 1;
}
#endif
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);
return 1;
}
if ( oid != at->at_oid ) {
ldap_memfree( at->at_oid );
at->at_oid = oid;
}
}
if ( at->at_syntax_oid && !OID_LEADCHAR( at->at_syntax_oid[0] )) {
/* Expand OID macros */
oid = find_oidm( at->at_syntax_oid );
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);
if ( code ) {
......
......@@ -234,7 +234,9 @@ typedef struct slap_ssf_set {
#define SLAP_SCHERR_SYN_NOT_FOUND 13
#define SLAP_SCHERR_MR_INCOMPLETE 14
#define SLAP_SCHERR_NOT_SUPPORTED 15
#define SLAP_SCHERR_BAD_DESCR 16
#define SLAP_SCHERR_BAD_DESCR 16
#define SLAP_SCHERR_OIDM 17
#define SLAP_SCHERR_LAST SLAP_SCHERR_OIDM
typedef union slap_sockaddr {
struct sockaddr sa_addr;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment