]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/getdn.c
ITS#791: fix SASL ctx close
[openldap] / libraries / libldap / getdn.c
index 01852c6ef89d627b1c900292c286018140290f50..3fe68f5466107aeab1045dcbe3099952ed9b541c 100644 (file)
@@ -1,6 +1,6 @@
 /* $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
@@ -54,135 +54,26 @@ ldap_get_dn( LDAP *ld, LDAPMessage *entry )
 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 **
@@ -190,9 +81,6 @@ ldap_explode_dn( LDAP_CONST char *dn, int notypes )
 {
        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 );
 }
 
@@ -287,6 +175,9 @@ ldap_dcedn2dn( LDAP_CONST char *dce )
        return dn;
 }
 
+#define INQUOTE                1
+#define OUTQUOTE       2
+
 static char **
 explode_name( const char *name, int notypes, int is_type )
 {
@@ -325,7 +216,7 @@ 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)
@@ -384,7 +275,7 @@ explode_name( const char *name, int notypes, int is_type )
                                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 */
@@ -415,11 +306,3 @@ explode_name( const char *name, int notypes, int is_type )
 
        return( parts );
 }
-
-
-int
-ldap_is_dns_dn( LDAP_CONST char *dn )
-{
-       return dn[ 0 ] != '\0' && ldap_utf8_strpbrk( dn, "=,;" ) == NULL;
-}
-