1 /* dn.c - routines for dealing with distinguished names */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * 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 * assume it is an X.500-style name, which looks like
220 * foo=bar,sha=baz,...
224 for ( s = dn; *s; s++ ) {
238 } else if ( LDAP_DNSEPARATOR( *s ) ) {
239 return( LDAP_STRDUP( &s[1] ) );
244 return( LDAP_STRDUP( "" ) );
247 char * ldap_dn_relative(
258 while(*dn && LDAP_SPACE(*dn)) {
266 rdn = LDAP_STRDUP( dn );
273 * assume it is an X.500-style name, which looks like
274 * foo=bar,sha=baz,...
279 for ( s = rdn; *s; s++ ) {
293 } else if ( LDAP_DNSEPARATOR( *s ) ) {