mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-24 13:24:56 +08:00
allow array of more generic syntaxes
This commit is contained in:
parent
eb5d285a1b
commit
978c3609e0
@ -755,12 +755,8 @@ at_add(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( sat->sat_syntax != NULL && sat->sat_syntax != syn ) {
|
if ( sat->sat_syntax != NULL && sat->sat_syntax != syn ) {
|
||||||
Syntax *supsyn = syn->ssyn_sup;
|
/* BEWARE: no loop detection! */
|
||||||
|
if ( syn_is_sup( sat->sat_syntax, syn ) ) {
|
||||||
for ( ; supsyn && supsyn != sat->sat_syntax;
|
|
||||||
supsyn = supsyn->ssyn_sup )
|
|
||||||
;
|
|
||||||
if ( supsyn == NULL ) {
|
|
||||||
code = SLAP_SCHERR_ATTR_BAD_SUP;
|
code = SLAP_SCHERR_ATTR_BAD_SUP;
|
||||||
goto error_return;
|
goto error_return;
|
||||||
}
|
}
|
||||||
|
@ -1674,6 +1674,9 @@ LDAP_SLAPD_F (int) syncrepl_add_glue LDAP_P((
|
|||||||
LDAP_SLAPD_F (void) syncinfo_free LDAP_P(( struct syncinfo_s *, int all ));
|
LDAP_SLAPD_F (void) syncinfo_free LDAP_P(( struct syncinfo_s *, int all ));
|
||||||
|
|
||||||
/* syntax.c */
|
/* syntax.c */
|
||||||
|
LDAP_SLAPD_F (int) syn_is_sup LDAP_P((
|
||||||
|
Syntax *syn,
|
||||||
|
Syntax *sup ));
|
||||||
LDAP_SLAPD_F (Syntax *) syn_find LDAP_P((
|
LDAP_SLAPD_F (Syntax *) syn_find LDAP_P((
|
||||||
const char *synname ));
|
const char *synname ));
|
||||||
LDAP_SLAPD_F (Syntax *) syn_find_desc LDAP_P((
|
LDAP_SLAPD_F (Syntax *) syn_find_desc LDAP_P((
|
||||||
|
@ -4005,6 +4005,12 @@ firstComponentNormalize(
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *country_gen_syn[] = {
|
||||||
|
"1.3.6.1.4.1.1466.115.121.1.15",
|
||||||
|
"1.3.6.1.4.1.1466.115.121.1.26",
|
||||||
|
"1.3.6.1.4.1.1466.115.121.1.44",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
#define X_BINARY "X-BINARY-TRANSFER-REQUIRED 'TRUE' "
|
#define X_BINARY "X-BINARY-TRANSFER-REQUIRED 'TRUE' "
|
||||||
#define X_NOT_H_R "X-NOT-HUMAN-READABLE 'TRUE' "
|
#define X_NOT_H_R "X-NOT-HUMAN-READABLE 'TRUE' "
|
||||||
@ -4115,12 +4121,11 @@ static slap_syntax_defs_rec syntax_defs[] = {
|
|||||||
{"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )",
|
{"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )",
|
||||||
0, NULL, NULL, NULL},
|
0, NULL, NULL, NULL},
|
||||||
{"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
|
{"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
|
||||||
0, "1.3.6.1.4.1.1466.115.121.1.15",
|
0, NULL, printableStringValidate, NULL},
|
||||||
printableStringValidate, NULL},
|
/* moved here because now depends on Directory String, IA5 String
|
||||||
/* moved here because now depends on printable string */
|
* and Printable String */
|
||||||
{"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
|
{"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
|
||||||
0, "1.3.6.1.4.1.1466.115.121.1.44",
|
0, country_gen_syn, countryStringValidate, NULL},
|
||||||
countryStringValidate, NULL},
|
|
||||||
{"( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' )",
|
{"( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' )",
|
||||||
#define subtreeSpecificationValidate UTF8StringValidate /* FIXME */
|
#define subtreeSpecificationValidate UTF8StringValidate /* FIXME */
|
||||||
0, NULL, subtreeSpecificationValidate, NULL},
|
0, NULL, subtreeSpecificationValidate, NULL},
|
||||||
|
@ -409,7 +409,7 @@ struct Syntax {
|
|||||||
#define SLAP_SYNTAX_HIDE 0x8000U /* hide (do not publish) */
|
#define SLAP_SYNTAX_HIDE 0x8000U /* hide (do not publish) */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Syntax *ssyn_sup;
|
Syntax **ssyn_sups;
|
||||||
|
|
||||||
slap_syntax_validate_func *ssyn_validate;
|
slap_syntax_validate_func *ssyn_validate;
|
||||||
slap_syntax_transform_func *ssyn_pretty;
|
slap_syntax_transform_func *ssyn_pretty;
|
||||||
@ -436,7 +436,7 @@ struct Syntax {
|
|||||||
typedef struct slap_syntax_defs_rec {
|
typedef struct slap_syntax_defs_rec {
|
||||||
char *sd_desc;
|
char *sd_desc;
|
||||||
int sd_flags;
|
int sd_flags;
|
||||||
char *sd_sup;
|
char **sd_sups;
|
||||||
slap_syntax_validate_func *sd_validate;
|
slap_syntax_validate_func *sd_validate;
|
||||||
slap_syntax_transform_func *sd_pretty;
|
slap_syntax_transform_func *sd_pretty;
|
||||||
#ifdef SLAPD_BINARY_CONVERSION
|
#ifdef SLAPD_BINARY_CONVERSION
|
||||||
|
@ -76,6 +76,35 @@ syn_find_desc( const char *syndesc, int *len )
|
|||||||
return( NULL );
|
return( NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
syn_is_sup( Syntax *syn, Syntax *sup )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
assert( syn != NULL );
|
||||||
|
assert( sup != NULL );
|
||||||
|
|
||||||
|
if ( syn == sup ) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( syn->ssyn_sups == NULL ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( i = 0; syn->ssyn_sups[i]; i++ ) {
|
||||||
|
if ( syn->ssyn_sups[i] == sup ) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( syn_is_sup( syn->ssyn_sups[i], sup ) ) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
syn_destroy( void )
|
syn_destroy( void )
|
||||||
{
|
{
|
||||||
@ -156,16 +185,26 @@ syn_add(
|
|||||||
ssyn->ssyn_str2ber = def->sd_str2ber;
|
ssyn->ssyn_str2ber = def->sd_str2ber;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( def->sd_sup != NULL ) {
|
if ( def->sd_sups != NULL ) {
|
||||||
ssyn->ssyn_sup = syn_find( def->sd_sup );
|
int cnt;
|
||||||
if ( ssyn->ssyn_sup == NULL ) {
|
|
||||||
*err = def->sd_sup;
|
for ( cnt = 0; def->sd_sups[cnt] != NULL; cnt++ )
|
||||||
code = SLAP_SCHERR_SYN_SUP_NOT_FOUND;
|
;
|
||||||
|
|
||||||
|
ssyn->ssyn_sups = (Syntax **)SLAP_CALLOC( cnt + 1,
|
||||||
|
sizeof(Syntax) );
|
||||||
|
|
||||||
|
for ( cnt = 0; def->sd_sups[cnt] != NULL; cnt++ ) {
|
||||||
|
ssyn->ssyn_sups[cnt] = syn_find( def->sd_sups[cnt] );
|
||||||
|
if ( ssyn->ssyn_sups[cnt] == NULL ) {
|
||||||
|
*err = def->sd_sups[cnt];
|
||||||
|
code = SLAP_SCHERR_SYN_SUP_NOT_FOUND;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( code == 0 ) {
|
if ( code == 0 ) {
|
||||||
code = syn_insert(ssyn, err);
|
code = syn_insert( ssyn, err );
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
Loading…
Reference in New Issue
Block a user