2 * Copyright (c) 1994 Regents of the University of Michigan.
9 static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
19 #if defined( DOS ) || defined( _WIN32 )
23 #include <sys/types.h>
24 #include <sys/socket.h>
32 ldap_get_dn( LDAP *ld, LDAPMessage *entry )
37 Debug( LDAP_DEBUG_TRACE, "ldap_get_dn\n", 0, 0, 0 );
39 if ( entry == NULL ) {
40 ld->ld_errno = LDAP_PARAM_ERROR;
44 tmp = *entry->lm_ber; /* struct copy */
45 if ( ber_scanf( &tmp, "{a", &dn ) == LBER_ERROR ) {
46 ld->ld_errno = LDAP_DECODING_ERROR;
54 ldap_dn2ufn( char *dn )
59 Debug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 );
61 if ( ldap_is_dns_dn( dn ) || ( p = strchr( dn, '=' )) == NULL )
62 return( strdup( dn ));
69 for ( p = ufn, r = ufn; *p; p++ ) {
80 if ( state == INQUOTE )
88 if ( state == OUTQUOTE )
94 if ( state == INQUOTE )
100 while ( !isspace( *r ) && *r != ';'
101 && *r != ',' && r > ufn )
105 if ( strcasecmp( r, "c" )
106 && strcasecmp( r, "o" )
107 && strcasecmp( r, "ou" )
108 && strcasecmp( r, "st" )
109 && strcasecmp( r, "l" )
110 && strcasecmp( r, "cn" ) ) {
127 ldap_explode_dns( char *dn )
129 int ncomps, maxcomps;
133 if ( (rdns = (char **) malloc( 8 * sizeof(char *) )) == NULL ) {
139 for ( s = strtok( dn, "@." ); s != NULL; s = strtok( NULL, "@." ) ) {
140 if ( ncomps == maxcomps ) {
142 if ( (rdns = (char **) realloc( rdns, maxcomps *
143 sizeof(char *) )) == NULL ) {
147 rdns[ncomps++] = strdup( s );
155 ldap_explode_dn( char *dn, int notypes )
157 char *p, *q, *rdnstart, **rdns = NULL;
158 int state, count = 0, endquote, len;
160 Debug( LDAP_DEBUG_TRACE, "ldap_explode_dn\n", 0, 0, 0 );
162 if ( ldap_is_dns_dn( dn ) ) {
163 return( ldap_explode_dns( dn ) );
179 if ( state == INQUOTE )
187 if ( state == OUTQUOTE ) {
189 if ( rdns == NULL ) {
190 if (( rdns = (char **)malloc( 8
191 * sizeof( char *))) == NULL )
193 } else if ( count >= 8 ) {
194 if (( rdns = (char **)realloc( rdns,
195 (count+1) * sizeof( char *)))
199 rdns[ count ] = NULL;
203 q < p && *q != '='; ++q ) {
209 if ( *rdnstart == '"' ) {
213 if ( *(p-1) == '"' ) {
220 if (( rdns[ count-1 ] = (char *)calloc( 1,
221 len + 1 )) != NULL ) {
222 SAFEMEMCPY( rdns[ count-1 ], rdnstart,
224 rdns[ count-1 ][ len ] = '\0';
228 * Don't forget to increment 'p' back to where
229 * it should be. If we don't, then we will
230 * never get past an "end quote."
235 rdnstart = *p ? p + 1 : p;
236 while ( isspace( *rdnstart ))
248 ldap_is_dns_dn( char *dn )
250 return( dn[ 0 ] != '\0' && strchr( dn, '=' ) == NULL &&
251 strchr( dn, ',' ) == NULL );
255 #if defined( ultrix ) || defined( NeXT )
257 char *strdup( char *s )
261 if ( (p = (char *) malloc( strlen( s ) + 1 )) == NULL )