From 41e25b404195f757c059eb22e9e301f08855ba02 Mon Sep 17 00:00:00 2001 From: Hallvard Furuseth Date: Wed, 4 Nov 1998 23:28:51 +0000 Subject: [PATCH] Added ldap_explode_rdn() --- doc/man/man3/ldap.3 | 3 ++ doc/man/man3/ldap_get_dn.3 | 18 ++++++++++- include/ldap.h | 1 + libraries/libldap/getdn.c | 63 +++++++++++++++++++++++++------------- 4 files changed, 63 insertions(+), 22 deletions(-) diff --git a/doc/man/man3/ldap.3 b/doc/man/man3/ldap.3 index 53d3a68213..d98f7afa55 100644 --- a/doc/man/man3/ldap.3 +++ b/doc/man/man3/ldap.3 @@ -326,6 +326,9 @@ extract the DN from an entry .SM ldap_explode_dn(3) convert a DN into its component parts .TP +.SM ldap_explode_rdn(3) +convert a RDN into its component parts +.TP .SM ldap_explode_dns(3) convert a DNS-style DN into its component parts (experimental) .TP diff --git a/doc/man/man3/ldap_get_dn.3 b/doc/man/man3/ldap_get_dn.3 index 0536578e74..d6769d9388 100644 --- a/doc/man/man3/ldap_get_dn.3 +++ b/doc/man/man3/ldap_get_dn.3 @@ -1,6 +1,6 @@ .TH LDAP_GET_DN 3 "22 September 1998" "OpenLDAP LDVERSION" .SH NAME -ldap_get_dn, ldap_explode_dn, ldap_dn2ufn, ldap_is_dns_dn, ldap_explode_dns \- LDAP DN handling routines +ldap_get_dn, ldap_explode_dn, ldap_explode_rdn, ldap_dn2ufn, ldap_is_dns_dn, ldap_explode_dns \- LDAP DN handling routines .SH SYNOPSIS .nf .ft B @@ -20,6 +20,12 @@ char *dn; int notypes; .LP .ft B +char **ldap_explode_rdn(rdn, notypes) +.ft +char *rdn; +int notypes; +.LP +.ft B char *ldap_dn2ufn(dn) .ft char *dn; @@ -68,6 +74,15 @@ c=US" would return as either { "cn=Bob", "c=US", NULL } or { "Bob", The result can be freed by calling .BR ldap_value_free (3). .LP +Similarly, the +.B ldap_explode_rdn() +routine takes an RDN as returned by +.B ldap_explode_dn(dn,0) +and breaks it up into its "type=value" component parts (or just "value", +if the \fInotypes\fP parameter is set). The result can be freed by +calling +.BR ldap_value_free (3). +.LP .B ldap_dn2ufn() is used to turn a DN as returned by .B ldap_get_dn() @@ -101,6 +116,7 @@ field in the \fIld\fP parameter is set to indicate the error. See .BR ldap_error (3) for a description of possible error codes. .BR ldap_explode_dn() , +.BR ldap_explode_rdn() , .B ldap_explode_dns() and .B ldap_dn2ufn() diff --git a/include/ldap.h b/include/ldap.h index a62855ce52..30cad17b75 100644 --- a/include/ldap.h +++ b/include/ldap.h @@ -580,6 +580,7 @@ LDAP_F void ldap_add_result_entry LDAP_P(( LDAPMessage **list, LDAPMessage *e )) LDAP_F char *ldap_get_dn LDAP_P(( LDAP *ld, LDAPMessage *entry )); LDAP_F char *ldap_dn2ufn LDAP_P(( char *dn )); LDAP_F char **ldap_explode_dn LDAP_P(( char *dn, int notypes )); +LDAP_F char **ldap_explode_rdn LDAP_P(( char *rdn, int notypes )); LDAP_F char **ldap_explode_dns LDAP_P(( char *dn )); LDAP_F int ldap_is_dns_dn LDAP_P(( char *dn )); diff --git a/libraries/libldap/getdn.c b/libraries/libldap/getdn.c index 8144bb037c..70c09c7933 100644 --- a/libraries/libldap/getdn.c +++ b/libraries/libldap/getdn.c @@ -21,6 +21,8 @@ static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of #include "ldap-int.h" +static char **explode_name( char *name, int notypes, int is_dn ); + char * ldap_get_dn( LDAP *ld, LDAPMessage *entry ) { @@ -147,17 +149,28 @@ ldap_explode_dns( char *dn ) char ** ldap_explode_dn( char *dn, int notypes ) { - char *p, *q, *rdnstart, **rdns = NULL; - int state, count = 0, endquote, len; - 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, 1 ); +} - rdnstart = dn; - p = dn-1; +char ** +ldap_explode_rdn( char *rdn, int notypes ) +{ + Debug( LDAP_DEBUG_TRACE, "ldap_explode_rdn\n", 0, 0, 0 ); + return explode_name( rdn, notypes, 0 ); +} + +static char ** +explode_name( char *name, int notypes, int is_dn ) +{ + char *p, *q, **parts = NULL; + int state, count = 0, endquote, len; + + p = name-1; state = OUTQUOTE; do { @@ -174,33 +187,41 @@ ldap_explode_dn( char *dn, int notypes ) else state = INQUOTE; break; + case '+': + if (!is_dn) + goto end_part; + break; case ';': case ',': + if (!is_dn) + break; + goto end_part; case '\0': + end_part: if ( state == OUTQUOTE ) { ++count; - if ( rdns == NULL ) { - if (( rdns = (char **)malloc( 8 + if ( parts == NULL ) { + if (( parts = (char **)malloc( 8 * sizeof( char *))) == NULL ) return( NULL ); } else if ( count >= 8 ) { - if (( rdns = (char **)realloc( rdns, + if (( parts = (char **)realloc( parts, (count+1) * sizeof( char *))) == NULL ) return( NULL ); } - rdns[ count ] = NULL; + parts[ count ] = NULL; endquote = 0; if ( notypes ) { - for ( q = rdnstart; + for ( q = name; q < p && *q != '='; ++q ) { ; } if ( q < p ) { - rdnstart = ++q; + name = ++q; } - if ( *rdnstart == '"' ) { - ++rdnstart; + if ( *name == '"' ) { + ++name; } if ( *(p-1) == '"' ) { @@ -209,12 +230,12 @@ ldap_explode_dn( char *dn, int notypes ) } } - len = p - rdnstart; - if (( rdns[ count-1 ] = (char *)calloc( 1, + len = p - name; + if (( parts[ count-1 ] = (char *)calloc( 1, len + 1 )) != NULL ) { - SAFEMEMCPY( rdns[ count-1 ], rdnstart, + SAFEMEMCPY( parts[ count-1 ], name, len ); - rdns[ count-1 ][ len ] = '\0'; + parts[ count-1 ][ len ] = '\0'; } /* @@ -225,15 +246,15 @@ ldap_explode_dn( char *dn, int notypes ) if ( endquote == 1 ) p++; - rdnstart = *p ? p + 1 : p; - while ( isspace( *rdnstart )) - ++rdnstart; + name = *p ? p + 1 : p; + while ( isascii( *name ) && isspace( *name ) ) + ++name; } break; } } while ( *p ); - return( rdns ); + return( parts ); } -- 2.39.5