2 * Copyright (c) 1994 Regents of the University of Michigan.
11 static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
18 #include <ac/socket.h>
19 #include <ac/string.h>
26 ldap_get_dn( LDAP *ld, LDAPMessage *entry )
31 Debug( LDAP_DEBUG_TRACE, "ldap_get_dn\n", 0, 0, 0 );
33 if ( entry == NULL ) {
34 ld->ld_errno = LDAP_PARAM_ERROR;
38 tmp = *entry->lm_ber; /* struct copy */
39 if ( ber_scanf( &tmp, "{a", &dn ) == LBER_ERROR ) {
40 ld->ld_errno = LDAP_DECODING_ERROR;
48 ldap_dn2ufn( char *dn )
53 Debug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 );
55 if ( ldap_is_dns_dn( dn ) || ( p = strchr( dn, '=' )) == NULL )
56 return( strdup( dn ));
63 for ( p = ufn, r = ufn; *p; p++ ) {
74 if ( state == INQUOTE )
82 if ( state == OUTQUOTE )
88 if ( state == INQUOTE )
94 while ( !isspace( *r ) && *r != ';'
95 && *r != ',' && r > ufn )
99 if ( strcasecmp( r, "c" )
100 && strcasecmp( r, "o" )
101 && strcasecmp( r, "ou" )
102 && strcasecmp( r, "st" )
103 && strcasecmp( r, "l" )
104 && strcasecmp( r, "cn" ) ) {
121 ldap_explode_dns( char *dn )
123 int ncomps, maxcomps;
127 if ( (rdns = (char **) malloc( 8 * sizeof(char *) )) == NULL ) {
133 for ( s = strtok( dn, "@." ); s != NULL; s = strtok( NULL, "@." ) ) {
134 if ( ncomps == maxcomps ) {
136 if ( (rdns = (char **) realloc( rdns, maxcomps *
137 sizeof(char *) )) == NULL ) {
141 rdns[ncomps++] = strdup( s );
149 ldap_explode_dn( char *dn, int notypes )
151 char *p, *q, *rdnstart, **rdns = NULL;
152 int state, count = 0, endquote, len;
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 ) );
173 if ( state == INQUOTE )
181 if ( state == OUTQUOTE ) {
183 if ( rdns == NULL ) {
184 if (( rdns = (char **)malloc( 8
185 * sizeof( char *))) == NULL )
187 } else if ( count >= 8 ) {
188 if (( rdns = (char **)realloc( rdns,
189 (count+1) * sizeof( char *)))
193 rdns[ count ] = NULL;
197 q < p && *q != '='; ++q ) {
203 if ( *rdnstart == '"' ) {
207 if ( *(p-1) == '"' ) {
214 if (( rdns[ count-1 ] = (char *)calloc( 1,
215 len + 1 )) != NULL ) {
216 SAFEMEMCPY( rdns[ count-1 ], rdnstart,
218 rdns[ count-1 ][ len ] = '\0';
222 * Don't forget to increment 'p' back to where
223 * it should be. If we don't, then we will
224 * never get past an "end quote."
229 rdnstart = *p ? p + 1 : p;
230 while ( isspace( *rdnstart ))
242 ldap_is_dns_dn( char *dn )
244 return( dn[ 0 ] != '\0' && strchr( dn, '=' ) == NULL &&
245 strchr( dn, ',' ) == NULL );