2 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
6 * Copyright (c) 1994 Regents of the University of Michigan.
16 #include <ac/stdlib.h>
19 #include <ac/socket.h>
20 #include <ac/string.h>
25 static char **explode_name( const char *name, int notypes, int is_dn );
28 ldap_get_dn( LDAP *ld, LDAPMessage *entry )
33 Debug( LDAP_DEBUG_TRACE, "ldap_get_dn\n", 0, 0, 0 );
35 if ( entry == NULL ) {
36 ld->ld_errno = LDAP_PARAM_ERROR;
40 tmp = *entry->lm_ber; /* struct copy */
41 if ( ber_scanf( &tmp, "{a" /*}*/, &dn ) == LBER_ERROR ) {
42 ld->ld_errno = LDAP_DECODING_ERROR;
50 ldap_dn2ufn( LDAP_CONST char *dn )
55 Debug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 );
61 if ( ldap_is_dns_dn( dn ) ||
62 ( p = strchr( dn, '=' ) ) == NULL )
64 return( LDAP_STRDUP( dn ) );
68 ufn = LDAP_STRDUP( ++p );
73 for ( p = ufn, r = ufn; *p; p++ ) {
84 if ( state == INQUOTE )
92 if ( state == OUTQUOTE )
98 if ( state == INQUOTE )
104 while ( !isspace( (unsigned char) *r )
105 && *r != ';' && *r != ',' && r > ufn )
109 if ( strcasecmp( r, "c" )
110 && strcasecmp( r, "o" )
111 && strcasecmp( r, "ou" )
112 && strcasecmp( r, "st" )
113 && strcasecmp( r, "l" )
114 && strcasecmp( r, "cn" ) ) {
131 ldap_explode_dns( LDAP_CONST char *dn_in )
141 if ( (dn = LDAP_STRDUP( dn_in )) == NULL ) {
145 if ( (rdns = (char **) LDAP_MALLOC( maxcomps * sizeof(char *) )) == NULL ) {
151 for ( s = ldap_pvt_strtok( dn, "@.", &tok_r ); s != NULL;
152 s = ldap_pvt_strtok( NULL, "@.", &tok_r ) )
154 if ( ncomps == maxcomps ) {
156 if ( (rdns = (char **) LDAP_REALLOC( rdns, maxcomps *
157 sizeof(char *) )) == NULL )
163 rdns[ncomps++] = LDAP_STRDUP( s );
170 rdns = (char **) LDAP_REALLOC( rdns, (ncomps+1) * sizeof(char*) );
175 ldap_explode_dn( LDAP_CONST char *dn, int notypes )
177 Debug( LDAP_DEBUG_TRACE, "ldap_explode_dn\n", 0, 0, 0 );
179 if ( ldap_is_dns_dn( dn ) ) {
180 return( ldap_explode_dns( dn ) );
182 return explode_name( dn, notypes, 1 );
186 ldap_explode_rdn( LDAP_CONST char *rdn, int notypes )
188 Debug( LDAP_DEBUG_TRACE, "ldap_explode_rdn\n", 0, 0, 0 );
189 return explode_name( rdn, notypes, 0 );
193 explode_name( const char *name, int notypes, int is_dn )
197 int state, count = 0, endquote, len;
211 if ( state == INQUOTE )
227 if ( state == OUTQUOTE ) {
229 if ( parts == NULL ) {
230 if (( parts = (char **)LDAP_MALLOC( 8
231 * sizeof( char *))) == NULL )
233 } else if ( count >= 8 ) {
234 if (( parts = (char **)LDAP_REALLOC( parts,
235 (count+1) * sizeof( char *)))
239 parts[ count ] = NULL;
243 q < p && *q != '='; ++q ) {
249 if ( *name == '"' ) {
253 if ( *(p-1) == '"' ) {
260 if (( parts[ count-1 ] = (char *)LDAP_CALLOC( 1,
261 len + 1 )) != NULL ) {
262 SAFEMEMCPY( parts[ count-1 ], name,
264 parts[ count-1 ][ len ] = '\0';
268 * Don't forget to increment 'p' back to where
269 * it should be. If we don't, then we will
270 * never get past an "end quote."
275 name = *p ? p + 1 : p;
276 while ( isascii( *name ) && isspace( *name ) )
288 ldap_is_dns_dn( LDAP_CONST char *dn )
290 return( dn[ 0 ] != '\0'
291 && strchr( dn, '=' ) == NULL
292 && strchr( dn, ',' ) == NULL
293 && strchr( dn, ';' ) == NULL );