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>
19 /* this should wait for UTF-8 routines */
28 #define INQUOTEDVALUE 7
32 * ldap_dn_normalize - put dn into a canonical format
37 ldap_dn_normalize( const char *dn )
47 ndn = LDAP_STRDUP( dn );
55 for ( d = s = ndn; *s; s++ ) {
59 if ( LDAP_LEADOIDCHAR(*s) ) {
62 } else if ( LDAP_LEADKEYCHAR(*s) ) {
65 } else if ( ! LDAP_SPACE( *s ) ) {
73 if ( LDAP_OIDCHAR(*s) ) {
75 } else if ( *s == '=' ) {
78 } else if ( LDAP_SPACE( *s ) ) {
87 if ( LDAP_KEYCHAR(*s) ) {
89 } else if ( *s == '=' ) {
92 } else if ( LDAP_SPACE( *s ) ) {
104 } else if ( ! LDAP_SPACE( *s ) ) {
105 /* not a valid dn - but what can we do here? */
113 state = INQUOTEDVALUE;
115 } else if ( ! LDAP_SPACE( *s ) ) {
122 if ( !gotesc && LDAP_SEPARATOR( *s ) ) {
123 while ( LDAP_SPACE( *(d - 1) ) )
131 } else if ( gotesc && !LDAP_NEEDSESCAPE( *s ) &&
132 !LDAP_SEPARATOR( *s ) ) {
141 if ( !gotesc && *s == '"' ) {
144 } else if ( gotesc && !LDAP_NEEDSESCAPE( *s ) ) {
152 if ( LDAP_SEPARATOR( *s ) ) {
159 Debug( LDAP_DEBUG_ANY,
160 "dn_normalize - unknown state %d\n", state, 0, 0 );
172 /* shouldn't be left in escape */
176 /* check end state */
178 case B4LEADTYPE: /* looking for first type */
179 case B4SEPARATOR: /* looking for separator */
180 case INVALUE: /* inside value */
195 * ldap_dn_parent - return a copy of the dn of dn's parent
210 while(*dn && LDAP_SPACE(*dn)) {
219 * no =, assume it is a dns name, like blah@some.domain.name
220 * if the blah@ part is there, return some.domain.name. if
221 * it's just some.domain.name, return domain.name.
223 if ( strchr( dn, '=' ) == NULL ) {
224 if ( (s = strchr( dn, '@' )) == NULL ) {
225 if ( (s = strchr( dn, '.' )) == NULL ) {
229 if ( *(s + 1) == '\0' ) {
232 return( LDAP_STRDUP( &s[1] ) );
237 * else assume it is an X.500-style name, which looks like
238 * foo=bar,sha=baz,...
242 for ( s = dn; *s; s++ ) {
256 } else if ( LDAP_DNSEPARATOR( *s ) ) {
257 return( LDAP_STRDUP( &s[1] ) );
262 return( LDAP_STRDUP( "" ) );
276 while(*dn && LDAP_SPACE(*dn)) {
284 rdn = LDAP_STRDUP( dn );
292 * no =, assume it is a dns name, like blah@some.domain.name
293 * if the blah@ part is there, return some.domain.name. if
294 * it's just some.domain.name, return domain.name.
296 if ( strchr( rdn, '=' ) == NULL ) {
297 if ( (s = strchr( rdn, '@' )) == NULL ) {
298 if ( (s = strchr( rdn, '.' )) == NULL ) {
308 * else assume it is an X.500-style name, which looks like
309 * foo=bar,sha=baz,...
314 for ( s = rdn; *s; s++ ) {
328 } else if ( LDAP_DNSEPARATOR( *s ) ) {