1 /* dn.c - routines for dealing with distinguished names */
4 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
13 #include <ac/socket.h>
14 #include <ac/string.h>
20 /* this should wait for UTF-8 routines */
29 #define INQUOTEDVALUE 7
33 * ldap_dn_normalize - put dn into a canonical format
38 ldap_dn_normalize( const char *dn )
48 ndn = LDAP_STRDUP( dn );
56 for ( d = s = ndn; *s; s++ ) {
60 if ( LDAP_LEADOIDCHAR(*s) ) {
63 } else if ( LDAP_LEADKEYCHAR(*s) ) {
66 } else if ( ! LDAP_SPACE( *s ) ) {
74 if ( LDAP_OIDCHAR(*s) ) {
76 } else if ( *s == '=' ) {
79 } else if ( LDAP_SPACE( *s ) ) {
88 if ( LDAP_KEYCHAR(*s) ) {
90 } else if ( *s == '=' ) {
93 } else if ( LDAP_SPACE( *s ) ) {
105 } else if ( ! LDAP_SPACE( *s ) ) {
106 /* not a valid dn - but what can we do here? */
114 state = INQUOTEDVALUE;
116 } else if ( ! LDAP_SPACE( *s ) ) {
123 if ( !gotesc && LDAP_SEPARATOR( *s ) ) {
124 while ( LDAP_SPACE( *(d - 1) ) )
132 } else if ( gotesc && !LDAP_NEEDSESCAPE( *s ) &&
133 !LDAP_SEPARATOR( *s ) ) {
142 if ( !gotesc && *s == '"' ) {
145 } else if ( gotesc && !LDAP_NEEDSESCAPE( *s ) ) {
153 if ( LDAP_SEPARATOR( *s ) ) {
160 Debug( LDAP_DEBUG_ANY,
161 "dn_normalize - unknown state %d\n", state, 0, 0 );
173 /* shouldn't be left in escape */
177 /* check end state */
179 case B4LEADTYPE: /* looking for first type */
180 case B4SEPARATOR: /* looking for separator */
181 case INVALUE: /* inside value */
196 * ldap_dn_parent - return a copy of the dn of dn's parent
211 while(*dn && LDAP_SPACE(*dn)) {
220 * no =, assume it is a dns name, like blah@some.domain.name
221 * if the blah@ part is there, return some.domain.name. if
222 * it's just some.domain.name, return domain.name.
224 if ( strchr( dn, '=' ) == NULL ) {
225 if ( (s = strchr( dn, '@' )) == NULL ) {
226 if ( (s = strchr( dn, '.' )) == NULL ) {
230 if ( *(s + 1) == '\0' ) {
233 return( LDAP_STRDUP( &s[1] ) );
238 * else assume it is an X.500-style name, which looks like
239 * foo=bar,sha=baz,...
243 for ( s = dn; *s; s++ ) {
257 } else if ( LDAP_DNSEPARATOR( *s ) ) {
258 return( LDAP_STRDUP( &s[1] ) );
263 return( LDAP_STRDUP( "" ) );
277 while(*dn && LDAP_SPACE(*dn)) {
285 rdn = LDAP_STRDUP( dn );
293 * no =, assume it is a dns name, like blah@some.domain.name
294 * if the blah@ part is there, return some.domain.name. if
295 * it's just some.domain.name, return domain.name.
297 if ( strchr( rdn, '=' ) == NULL ) {
298 if ( (s = strchr( rdn, '@' )) == NULL ) {
299 if ( (s = strchr( rdn, '.' )) == NULL ) {
309 * else assume it is an X.500-style name, which looks like
310 * foo=bar,sha=baz,...
315 for ( s = rdn; *s; s++ ) {
329 } else if ( LDAP_DNSEPARATOR( *s ) ) {