1
1
/* syntax.c - routines to manage syntax definitions */
2
/* $OpenLDAP: pkg/ldap/servers/slapd/syntax.c,v 1.43.2.3 2008/02/11 23:26:45 kurt Exp $ */
2
/* $OpenLDAP: pkg/ldap/servers/slapd/syntax.c,v 1.43.2.6 2009/01/22 00:01:04 kurt Exp $ */
3
3
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5
* Copyright 1998-2008 The OpenLDAP Foundation.
5
* Copyright 1998-2009 The OpenLDAP Foundation.
6
6
* All rights reserved.
8
8
* Redistribution and use in source and binary forms, with or without
32
32
static Avlnode *syn_index = NULL;
33
static LDAP_SLIST_HEAD(SyntaxList, Syntax) syn_list
34
= LDAP_SLIST_HEAD_INITIALIZER(&syn_list);
33
static LDAP_STAILQ_HEAD(SyntaxList, Syntax) syn_list
34
= LDAP_STAILQ_HEAD_INITIALIZER(syn_list);
36
/* Last hardcoded attribute registered */
71
LDAP_SLIST_FOREACH(synp, &syn_list, ssyn_next) {
74
LDAP_STAILQ_FOREACH(synp, &syn_list, ssyn_next) {
72
75
if ((*len = dscompare( synp->ssyn_syn.syn_desc, syndesc, '{' /*'}'*/ ))) {
113
116
avl_free( syn_index, ldap_memfree );
114
while( !LDAP_SLIST_EMPTY( &syn_list ) ) {
115
s = LDAP_SLIST_FIRST( &syn_list );
116
LDAP_SLIST_REMOVE_HEAD( &syn_list, ssyn_next );
117
while( !LDAP_STAILQ_EMPTY( &syn_list ) ) {
118
s = LDAP_STAILQ_FIRST( &syn_list );
119
LDAP_STAILQ_REMOVE_HEAD( &syn_list, ssyn_next );
117
120
if ( s->ssyn_sups ) {
118
121
SLAP_FREE( s->ssyn_sups );
130
133
struct sindexrec *sir;
132
LDAP_SLIST_NEXT( ssyn, ssyn_next ) = NULL;
133
LDAP_SLIST_INSERT_HEAD( &syn_list, ssyn, ssyn_next );
135
LDAP_STAILQ_NEXT( ssyn, ssyn_next ) = NULL;
135
137
if ( ssyn->ssyn_oid ) {
136
138
sir = (struct sindexrec *)
150
152
/* FIX: temporal consistency check */
151
153
syn_find(sir->sir_name);
156
if ( ssyn->ssyn_flags & SLAP_AT_HARDCODE ) {
162
LDAP_STAILQ_INSERT_AFTER( &syn_list, prev, ssyn, ssyn_next );
164
LDAP_STAILQ_INSERT_TAIL( &syn_list, ssyn, ssyn_next );
159
slap_syntax_defs_rec *def,
173
slap_syntax_defs_rec *def,
181
if ( ssynp != NULL ) {
166
185
ssyn = (Syntax *) SLAP_CALLOC( 1, sizeof(Syntax) );
167
186
if ( ssyn == NULL ) {
168
187
Debug( LDAP_DEBUG_ANY, "SLAP_CALLOC Error\n", 0, 0, 0 );
172
191
AC_MEMCPY( &ssyn->ssyn_syn, syn, sizeof(LDAPSyntax) );
174
LDAP_SLIST_NEXT(ssyn,ssyn_next) = NULL;
193
LDAP_STAILQ_NEXT(ssyn,ssyn_next) = NULL;
177
196
* note: ssyn_bvoid uses the same memory of ssyn_syn.syn_oid;
190
209
ssyn->ssyn_str2ber = def->sd_str2ber;
212
if ( def->sd_validate == NULL && def->sd_pretty == NULL && syn->syn_extensions != NULL ) {
213
LDAPSchemaExtensionItem **lsei;
214
Syntax *subst = NULL;
216
for ( lsei = syn->syn_extensions; *lsei != NULL; lsei++) {
217
if ( strcmp( (*lsei)->lsei_name, "X-SUBST" ) != 0 ) {
221
assert( (*lsei)->lsei_values != NULL );
222
if ( (*lsei)->lsei_values[0] == '\0'
223
|| (*lsei)->lsei_values[1] != '\0' )
225
Debug( LDAP_DEBUG_ANY, "syn_add(%s): exactly one substitute syntax must be present\n",
226
ssyn->ssyn_syn.syn_oid, 0, 0 );
227
return SLAP_SCHERR_SYN_SUBST_NOT_SPECIFIED;
230
subst = syn_find( (*lsei)->lsei_values[0] );
231
if ( subst == NULL ) {
232
Debug( LDAP_DEBUG_ANY, "syn_add(%s): substitute syntax %s not found\n",
233
ssyn->ssyn_syn.syn_oid, (*lsei)->lsei_values[0], 0 );
234
return SLAP_SCHERR_SYN_SUBST_NOT_FOUND;
239
if ( subst != NULL ) {
240
ssyn->ssyn_flags = subst->ssyn_flags;
241
ssyn->ssyn_validate = subst->ssyn_validate;
242
ssyn->ssyn_pretty = subst->ssyn_pretty;
244
ssyn->ssyn_sups = NULL;
246
#ifdef SLAPD_BINARY_CONVERSION
247
ssyn->ssyn_ber2str = subst->ssyn_ber2str;
248
ssyn->ssyn_str2ber = subst->ssyn_str2ber;
193
253
if ( def->sd_sups != NULL ) {
277
ssyn->ssyn_flags |= SLAP_SYNTAX_HARDCODE;
216
279
if ( code == 0 ) {
217
code = syn_insert( ssyn, err );
280
code = syn_insert( ssyn, prev, err );
221
283
if ( code != 0 && ssyn != NULL ) {
247
code = syn_add( syn, def, &err );
314
code = syn_add( syn, 0, def, NULL, NULL, &err );
250
317
Debug( LDAP_DEBUG_ANY, "Error in register_syntax: %s %s in %s\n",
267
334
struct berval val;
268
335
struct berval nval;
270
LDAP_SLIST_FOREACH(syn, &syn_list, ssyn_next ) {
337
LDAP_STAILQ_FOREACH(syn, &syn_list, ssyn_next ) {
271
338
if ( ! syn->ssyn_validate ) {
272
339
/* skip syntaxes without validators */
368
syn_delete( Syntax *syn )
370
LDAP_STAILQ_REMOVE(&syn_list, syn, Syntax, ssyn_next);
374
syn_start( Syntax **syn )
376
assert( syn != NULL );
378
*syn = LDAP_STAILQ_FIRST(&syn_list);
380
return (*syn != NULL);
384
syn_next( Syntax **syn )
386
assert( syn != NULL );
388
#if 0 /* pedantic check: don't use this */
392
LDAP_STAILQ_FOREACH(tmp,&syn_list,ssyn_next) {
398
assert( tmp != NULL );
402
*syn = LDAP_STAILQ_NEXT(*syn,ssyn_next);
404
return (*syn != NULL);
408
syn_unparse( BerVarray *res, Syntax *start, Syntax *end, int sys )
412
struct berval bv, *bva = NULL, idx;
416
start = LDAP_STAILQ_FIRST( &syn_list );
418
/* count the result size */
420
for ( syn = start; syn; syn = LDAP_STAILQ_NEXT( syn, ssyn_next ) ) {
421
if ( sys && !( syn->ssyn_flags & SLAP_SYNTAX_HARDCODE ) ) break;
423
if ( syn == end ) break;
428
bva = ch_malloc( (num+1) * sizeof(struct berval) );
436
for ( syn = start; syn; syn = LDAP_STAILQ_NEXT( syn, ssyn_next ) ) {
437
if ( sys && !( syn->ssyn_flags & SLAP_SYNTAX_HARDCODE ) ) break;
438
if ( ldap_syntax2bv( &syn->ssyn_syn, &bv ) == NULL ) {
439
ber_bvarray_free( bva );
442
idx.bv_len = sprintf(idx.bv_val, "{%d}", i);
444
bva[i].bv_len = idx.bv_len + bv.bv_len;
445
bva[i].bv_val = ch_malloc( bva[i].bv_len + 1 );
446
strcpy( bva[i].bv_val, ibuf );
447
strcpy( bva[i].bv_val + idx.bv_len, bv.bv_val );
449
bva[i].bv_val = NULL;
450
ldap_memfree( bv.bv_val );
451
if ( syn == end ) break;