/* $OpenLDAP$ */
/*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
/* Portions
char *
ldap_dn2ufn( LDAP_CONST char *dn )
{
- char *p, *ufn, *r;
- int state;
+ char *ufn;
+ char **vals;
Debug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 );
+ /* produces completely untyped UFNs */
+
if( dn == NULL ) {
return NULL;
}
- if ( ldap_is_dns_dn( dn ) ||
- ( p = ldap_utf8_strpbrk( dn, "=" ) ) == NULL )
- {
- return( LDAP_STRDUP( dn ) );
- }
-
- ufn = LDAP_STRDUP( ++p );
-
- if( ufn == NULL ) return NULL;
-
-#define INQUOTE 1
-#define OUTQUOTE 2
- state = OUTQUOTE;
- for ( p = ufn, r = ufn; *p; LDAP_UTF8_INCR(p) ) {
- switch ( *p ) {
- case '\\':
- if ( p[1] != '\0' ) {
- *r++ = '\\';
- LDAP_UTF8_COPY(r,++p);
- LDAP_UTF8_INCR(r);
- }
- break;
-
- case '"':
- if ( state == INQUOTE )
- state = OUTQUOTE;
- else
- state = INQUOTE;
- *r++ = *p;
- break;
-
- case ';':
- case ',':
- if ( state == OUTQUOTE )
- *r++ = ',';
- else
- *r++ = *p;
- break;
-
- case '=':
- if ( state == INQUOTE ) {
- *r++ = *p;
- } else {
- char *rsave = r;
-
- *r = '\0';
- LDAP_UTF8_DECR( r );
-
- while ( !ldap_utf8_isspace( r )
- && *r != ';' && *r != ',' && r > ufn )
- {
- LDAP_UTF8_DECR( r );
- }
- LDAP_UTF8_INCR( r );
-
- if ( strcasecmp( r, "c" )
- && strcasecmp( r, "o" )
- && strcasecmp( r, "ou" )
- && strcasecmp( r, "st" )
- && strcasecmp( r, "l" )
- && strcasecmp( r, "cn" ) ) {
- r = rsave;
- *r++ = '=';
- }
- }
- break;
-
- default:
- LDAP_UTF8_COPY(r, p);
- LDAP_UTF8_INCR(r);
- break;
- }
- }
- *r = '\0';
-
- return( ufn );
-}
-
-char **
-ldap_explode_dns( LDAP_CONST char *dn_in )
-{
- char *s;
- char **rdns;
- char *tok_r;
- char *dn;
-
- int ncomps;
- int maxcomps = 8;
-
- if ( (dn = LDAP_STRDUP( dn_in )) == NULL ) {
- return( NULL );
- }
-
- if ( (rdns = (char **) LDAP_MALLOC( maxcomps * sizeof(char *) )) == NULL ) {
- LDAP_FREE( dn );
- return( NULL );
- }
-
- ncomps = 0;
- for ( s = ldap_pvt_strtok( dn, "@.", &tok_r ); s != NULL;
- s = ldap_pvt_strtok( NULL, "@.", &tok_r ) )
- {
- if ( ncomps == maxcomps ) {
- maxcomps *= 2;
- if ( (rdns = (char **) LDAP_REALLOC( rdns, maxcomps *
- sizeof(char *) )) == NULL )
- {
- LDAP_FREE( dn );
- return NULL;
- }
- }
- rdns[ncomps++] = LDAP_STRDUP( s );
+ vals = ldap_explode_dn( dn , 1 );
+ if( vals == NULL ) {
+ return NULL;
}
- LDAP_FREE(dn);
- rdns[ncomps] = NULL;
+ ufn = ldap_charray2str( vals, ", " );
- /* trim rdns */
- rdns = (char **) LDAP_REALLOC( rdns, (ncomps+1) * sizeof(char*) );
- return( rdns );
+ ldap_memvfree( vals );
+ return ufn;
}
char **
{
Debug( LDAP_DEBUG_TRACE, "ldap_explode_dn\n", 0, 0, 0 );
- if ( ldap_is_dns_dn( dn ) ) {
- return( ldap_explode_dns( dn ) );
- }
return explode_name( dn, notypes, NAME_TYPE_LDAP_DN );
}
return dn;
}
+#define INQUOTE 1
+#define OUTQUOTE 2
+
static char **
explode_name( const char *name, int notypes, int is_type )
{
state = INQUOTE;
break;
case '=':
- if( state = OUTQUOTE ) have_equals++;
+ if( state == OUTQUOTE ) have_equals++;
break;
case '+':
if (is_type == NAME_TYPE_LDAP_RDN)
if (( parts[ count-1 ] = (char *)LDAP_CALLOC( 1,
len + 1 )) != NULL )
{
- SAFEMEMCPY( parts[ count-1 ], rdn, len );
+ AC_MEMCPY( parts[ count-1 ], rdn, len );
if( !endquote ) {
/* skip trailing spaces */
return( parts );
}
-
-
-int
-ldap_is_dns_dn( LDAP_CONST char *dn )
-{
- return dn[ 0 ] != '\0' && ldap_utf8_strpbrk( dn, "=,;" ) == NULL;
-}
-