From: Kurt Zeilenga Date: Thu, 28 Jan 1999 21:40:04 +0000 (+0000) Subject: Add dn_rdn() function to return rdn part of dn. X-Git-Tag: OPENLDAP_SLAPD_BACK_LDAP~685 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=91f6792109f5d28a6d54e49b6800287ae8be2020;p=openldap Add dn_rdn() function to return rdn part of dn. --- diff --git a/servers/slapd/dn.c b/servers/slapd/dn.c index 54e53bfc35..cac66133e1 100644 --- a/servers/slapd/dn.c +++ b/servers/slapd/dn.c @@ -220,6 +220,77 @@ dn_parent( return( ch_strdup( "" ) ); } +char * dn_rdn( + Backend *be, + char *dn ) +{ + char *s; + int inquote, gotesc; + + if( dn == NULL ) { + return NULL; + } + + while(*dn && SPACE(*dn)) { + dn++; + } + + if( *dn == '\0' ) { + return( NULL ); + } + + if ( be_issuffix( be, dn ) ) { + return( NULL ); + } + + dn = ch_strdup( dn ); + + /* + * no =, assume it is a dns name, like blah@some.domain.name + * if the blah@ part is there, return some.domain.name. if + * it's just some.domain.name, return domain.name. + */ + if ( strchr( dn, '=' ) == NULL ) { + if ( (s = strchr( dn, '@' )) == NULL ) { + if ( (s = strchr( dn, '.' )) == NULL ) { + return( dn ); + } + } + *s = '\0'; + return( dn ); + } + + /* + * else assume it is an X.500-style name, which looks like + * foo=bar,sha=baz,... + */ + + inquote = 0; + + for ( s = dn; *s; s++ ) { + if ( *s == '\\' ) { + if ( *(s + 1) ) { + s++; + } + continue; + } + if ( inquote ) { + if ( *s == '"' ) { + inquote = 0; + } + } else { + if ( *s == '"' ) { + inquote = 1; + } else if ( DNSEPARATOR( *s ) ) { + *s = '\0'; + return( dn ); + } + } + } + + return( dn ); +} + /* * dn_issuffix - tells whether suffix is a suffix of dn. both dn * and suffix must be normalized. diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 9484978778..d72259fc9e 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -105,6 +105,7 @@ void connection_activity LDAP_P(( Connection *conn )); char * dn_normalize LDAP_P(( char *dn )); char * dn_normalize_case LDAP_P(( char *dn )); char * dn_parent LDAP_P(( Backend *be, char *dn )); +char * dn_rdn LDAP_P(( Backend *be, char *dn )); int dn_issuffix LDAP_P(( char *dn, char *suffix )); int dn_type LDAP_P(( char *dn )); char * dn_upcase LDAP_P(( char *dn ));