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.
18 #include <ac/socket.h>
19 #include <ac/string.h>
24 static char **explode_name( char *name, int notypes, int is_dn );
27 ldap_get_dn( LDAP *ld, LDAPMessage *entry )
32 Debug( LDAP_DEBUG_TRACE, "ldap_get_dn\n", 0, 0, 0 );
34 if ( entry == NULL ) {
35 ld->ld_errno = LDAP_PARAM_ERROR;
39 tmp = *entry->lm_ber; /* struct copy */
40 if ( ber_scanf( &tmp, "{a", &dn ) == LBER_ERROR ) {
41 ld->ld_errno = LDAP_DECODING_ERROR;
49 ldap_dn2ufn( char *dn )
54 Debug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 );
56 if ( ldap_is_dns_dn( dn ) || ( p = strchr( dn, '=' )) == NULL )
57 return( strdup( dn ) );
64 for ( p = ufn, r = ufn; *p; p++ ) {
75 if ( state == INQUOTE )
83 if ( state == OUTQUOTE )
89 if ( state == INQUOTE )
95 while ( !isspace( *r ) && *r != ';'
96 && *r != ',' && r > ufn )
100 if ( strcasecmp( r, "c" )
101 && strcasecmp( r, "o" )
102 && strcasecmp( r, "ou" )
103 && strcasecmp( r, "st" )
104 && strcasecmp( r, "l" )
105 && strcasecmp( r, "cn" ) ) {
122 ldap_explode_dns( char *dn )
124 int ncomps, maxcomps;
129 if ( (rdns = (char **) malloc( 8 * sizeof(char *) )) == NULL ) {
135 for ( s = ldap_pvt_strtok( dn, "@.", &tok_r ); s != NULL;
136 s = ldap_pvt_strtok( NULL, "@.", &tok_r ) ) {
137 if ( ncomps == maxcomps ) {
139 if ( (rdns = (char **) realloc( rdns, maxcomps *
140 sizeof(char *) )) == NULL ) {
144 rdns[ncomps++] = strdup( s );
152 ldap_explode_dn( char *dn, int notypes )
154 Debug( LDAP_DEBUG_TRACE, "ldap_explode_dn\n", 0, 0, 0 );
156 if ( ldap_is_dns_dn( dn ) ) {
157 return( ldap_explode_dns( dn ) );
159 return explode_name( dn, notypes, 1 );
163 ldap_explode_rdn( char *rdn, int notypes )
165 Debug( LDAP_DEBUG_TRACE, "ldap_explode_rdn\n", 0, 0, 0 );
166 return explode_name( rdn, notypes, 0 );
170 explode_name( char *name, int notypes, int is_dn )
172 char *p, *q, **parts = NULL;
173 int state, count = 0, endquote, len;
187 if ( state == INQUOTE )
203 if ( state == OUTQUOTE ) {
205 if ( parts == NULL ) {
206 if (( parts = (char **)malloc( 8
207 * sizeof( char *))) == NULL )
209 } else if ( count >= 8 ) {
210 if (( parts = (char **)realloc( parts,
211 (count+1) * sizeof( char *)))
215 parts[ count ] = NULL;
219 q < p && *q != '='; ++q ) {
225 if ( *name == '"' ) {
229 if ( *(p-1) == '"' ) {
236 if (( parts[ count-1 ] = (char *)calloc( 1,
237 len + 1 )) != NULL ) {
238 SAFEMEMCPY( parts[ count-1 ], name,
240 parts[ count-1 ][ len ] = '\0';
244 * Don't forget to increment 'p' back to where
245 * it should be. If we don't, then we will
246 * never get past an "end quote."
251 name = *p ? p + 1 : p;
252 while ( isascii( *name ) && isspace( *name ) )
264 ldap_is_dns_dn( char *dn )
266 return( dn[ 0 ] != '\0' && strchr( dn, '=' ) == NULL &&
267 strchr( dn, ',' ) == NULL );