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
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 * assume it is an X.500-style name, which looks like
221 * foo=bar,sha=baz,...
225 for ( s = dn; *s; s++ ) {
239 } else if ( LDAP_DNSEPARATOR( *s ) ) {
240 return( LDAP_STRDUP( &s[1] ) );
245 return( LDAP_STRDUP( "" ) );
259 while(*dn && LDAP_SPACE(*dn)) {
267 rdn = LDAP_STRDUP( dn );
274 * assume it is an X.500-style name, which looks like
275 * foo=bar,sha=baz,...
280 for ( s = rdn; *s; s++ ) {
294 } else if ( LDAP_DNSEPARATOR( *s ) ) {