1 /* dn.c - routines for dealing with distinguished names */
3 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
12 #include <ac/socket.h>
13 #include <ac/string.h>
25 #define INQUOTEDVALUE 7
29 * ldap_dn_normalize - put dn into a canonical format
34 ldap_dn_normalize( const char *dn )
44 ndn = LDAP_STRDUP( dn );
52 for ( d = s = ndn; *s; s++ ) {
56 if ( LDAP_LEADOIDCHAR(*s) ) {
59 } else if ( LDAP_LEADKEYCHAR(*s) ) {
62 } else if ( ! LDAP_SPACE( *s ) ) {
70 if ( LDAP_OIDCHAR(*s) ) {
72 } else if ( *s == '=' ) {
75 } else if ( LDAP_SPACE( *s ) ) {
84 if ( LDAP_KEYCHAR(*s) ) {
86 } else if ( *s == '=' ) {
89 } else if ( LDAP_SPACE( *s ) ) {
101 } else if ( ! LDAP_SPACE( *s ) ) {
102 /* not a valid dn - but what can we do here? */
110 state = INQUOTEDVALUE;
112 } else if ( ! LDAP_SPACE( *s ) ) {
119 if ( !gotesc && LDAP_SEPARATOR( *s ) ) {
120 while ( LDAP_SPACE( *(d - 1) ) )
128 } else if ( gotesc && !LDAP_NEEDSESCAPE( *s ) &&
129 !LDAP_SEPARATOR( *s ) ) {
138 if ( !gotesc && *s == '"' ) {
141 } else if ( gotesc && !LDAP_NEEDSESCAPE( *s ) ) {
149 if ( LDAP_SEPARATOR( *s ) ) {
156 Debug( LDAP_DEBUG_ANY,
157 "dn_normalize - unknown state %d\n", state, 0, 0 );
169 /* shouldn't be left in escape */
173 /* check end state */
175 case B4LEADTYPE: /* looking for first type */
176 case B4SEPARATOR: /* looking for separator */
177 case INVALUE: /* inside value */
192 * ldap_dn_parent - return a copy of the dn of dn's parent
207 while(*dn && LDAP_SPACE(*dn)) {
216 * no =, assume it is a dns name, like blah@some.domain.name
217 * if the blah@ part is there, return some.domain.name. if
218 * it's just some.domain.name, return domain.name.
220 if ( strchr( dn, '=' ) == NULL ) {
221 if ( (s = strchr( dn, '@' )) == NULL ) {
222 if ( (s = strchr( dn, '.' )) == NULL ) {
226 if ( *(s + 1) == '\0' ) {
229 return( LDAP_STRDUP( &s[1] ) );
234 * else assume it is an X.500-style name, which looks like
235 * foo=bar,sha=baz,...
239 for ( s = dn; *s; s++ ) {
253 } else if ( LDAP_DNSEPARATOR( *s ) ) {
254 return( LDAP_STRDUP( &s[1] ) );
259 return( LDAP_STRDUP( "" ) );
273 while(*dn && LDAP_SPACE(*dn)) {
281 rdn = LDAP_STRDUP( dn );
289 * no =, assume it is a dns name, like blah@some.domain.name
290 * if the blah@ part is there, return some.domain.name. if
291 * it's just some.domain.name, return domain.name.
293 if ( strchr( rdn, '=' ) == NULL ) {
294 if ( (s = strchr( rdn, '@' )) == NULL ) {
295 if ( (s = strchr( rdn, '.' )) == NULL ) {
305 * else assume it is an X.500-style name, which looks like
306 * foo=bar,sha=baz,...
311 for ( s = rdn; *s; s++ ) {
325 } else if ( LDAP_DNSEPARATOR( *s ) ) {