X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Furl.c;h=e5909bac417e7b1905e9e039e17445050e88e901;hb=4b3396f5fd1d1ace77c2a2a6845fa959e14cf380;hp=851f2494c56f93fa36be30e1e2a4602b34730817;hpb=bfe4dc289aad9d87158d86912dafb5cc4bfc470c;p=openldap diff --git a/libraries/libldap/url.c b/libraries/libldap/url.c index 851f2494c5..e5909bac41 100644 --- a/libraries/libldap/url.c +++ b/libraries/libldap/url.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* Portions @@ -17,7 +17,7 @@ * scope is one of these three strings: base one sub (default=base) * filter is an string-represented filter as in RFC 2254 * - * e.g., ldap://host:port/dc=com?o,cn?base?o=openldap?extension + * e.g., ldap://host:port/dc=com?o,cn?base?(o=openldap)?extension * * We also tolerate URLs that look like: and */ @@ -34,7 +34,6 @@ #include "ldap-int.h" - /* local functions */ static const char* skip_url_prefix LDAP_P(( const char *url, @@ -69,7 +68,8 @@ int ldap_pvt_url_scheme2proto( const char *scheme ) return -1; } -LDAP_F(int) ldap_pvt_url_scheme2tls( const char *scheme ) +int +ldap_pvt_url_scheme2tls( const char *scheme ) { assert( scheme ); @@ -444,7 +444,11 @@ ldap_url_parse_ext( LDAP_CONST char *url_in, LDAPURLDesc **ludpp ) * because a call to LDAP_INT_GLOBAL_OPT() will try to allocate * the options and cause infinite recursion */ +#ifdef NEW_LOGGING + LDAP_LOG ( OPERATION, ENTRY, "ldap_url_parse_ext(%s)\n", url_in, 0, 0 ); +#else Debug( LDAP_DEBUG_TRACE, "ldap_url_parse_ext(%s)\n", url_in, 0, 0 ); +#endif #endif *ludpp = NULL; /* pessimistic */ @@ -876,17 +880,23 @@ ldap_url_duplist (LDAPURLDesc *ludlist) int ldap_url_parselist (LDAPURLDesc **ludlist, const char *url ) +{ + return ldap_url_parselist_ext( ludlist, url, ", " ); +} + +int +ldap_url_parselist_ext (LDAPURLDesc **ludlist, const char *url, const char *sep ) { int i, rc; LDAPURLDesc *ludp; char **urls; - *ludlist = NULL; + assert( ludlist != NULL ); + assert( url != NULL ); - if (url == NULL) - return LDAP_PARAM_ERROR; + *ludlist = NULL; - urls = ldap_str2charray((char *)url, ", "); + urls = ldap_str2charray(url, sep); if (urls == NULL) return LDAP_NO_MEMORY; @@ -918,12 +928,12 @@ ldap_url_parsehosts( LDAPURLDesc *ludp; char **specs, *p; - *ludlist = NULL; + assert( ludlist != NULL ); + assert( hosts != NULL ); - if (hosts == NULL) - return LDAP_PARAM_ERROR; + *ludlist = NULL; - specs = ldap_str2charray((char *)hosts, ", "); + specs = ldap_str2charray(hosts, ", "); if (specs == NULL) return LDAP_NO_MEMORY; @@ -1038,9 +1048,13 @@ ldap_url_list2urls( /* figure out how big the string is */ size = 1; /* nul-term */ for (ludp = ludlist; ludp != NULL; ludp = ludp->lud_next) { - size += strlen(ludp->lud_scheme) + strlen(ludp->lud_host); - if (strchr(ludp->lud_host, ':')) /* will add [ ] below */ - size += 2; + size += strlen(ludp->lud_scheme); + if ( ludp->lud_host ) { + size += strlen(ludp->lud_host); + /* will add [ ] below */ + if (strchr(ludp->lud_host, ':')) + size += 2; + } size += sizeof(":/// "); if (ludp->lud_port != 0) { @@ -1055,9 +1069,11 @@ ldap_url_list2urls( p = s; for (ludp = ludlist; ludp != NULL; ludp = ludp->lud_next) { - p += sprintf(p, - strchr(ludp->lud_host, ':') ? "%s://[%s]" : "%s://%s", - ludp->lud_scheme, ludp->lud_host); + p += sprintf(p, "%s://", ludp->lud_scheme); + if ( ludp->lud_host ) { + p += sprintf(p, strchr(ludp->lud_host, ':') + ? "[%s]" : "%s", ludp->lud_host); + } if (ludp->lud_port != 0) p += sprintf(p, ":%d", ludp->lud_port); *p++ = '/'; @@ -1114,91 +1130,14 @@ ldap_free_urldesc( LDAPURLDesc *ludp ) LDAP_FREE( ludp ); } - -int -ldap_url_search( LDAP *ld, LDAP_CONST char *url, int attrsonly ) -{ - int err; - LDAPURLDesc *ludp; - BerElement *ber; - LDAPreqinfo bind; - - assert( ld != NULL ); - assert( LDAP_VALID( ld ) ); - - if ( ldap_url_parse( url, &ludp ) != 0 ) { - ld->ld_errno = LDAP_PARAM_ERROR; - return( -1 ); - } - - if( ludp->lud_crit_exts ) { - /* we don't support any extension (yet) */ - ld->ld_errno = LDAP_NOT_SUPPORTED; - return( -1 ); - } - - ber = ldap_build_search_req( ld, ludp->lud_dn, ludp->lud_scope, - ludp->lud_filter, ludp->lud_attrs, attrsonly, NULL, NULL, - -1, -1 ); - - if ( ber == NULL ) { - err = -1; - } else { - bind.ri_request = LDAP_REQ_SEARCH; - bind.ri_msgid = ld->ld_msgid; - bind.ri_url = (char *)url; - err = ldap_send_server_request( - ld, ber, ld->ld_msgid, NULL, - ludp, NULL, &bind ); - } - - ldap_free_urldesc( ludp ); - return( err ); -} - - -int -ldap_url_search_st( LDAP *ld, LDAP_CONST char *url, int attrsonly, - struct timeval *timeout, LDAPMessage **res ) -{ - int msgid; - - if (( msgid = ldap_url_search( ld, url, attrsonly )) == -1 ) { - return( ld->ld_errno ); - } - - if ( ldap_result( ld, msgid, 1, timeout, res ) == -1 ) { - return( ld->ld_errno ); - } - - if ( ld->ld_errno == LDAP_TIMEOUT ) { - (void) ldap_abandon( ld, msgid ); - ld->ld_errno = LDAP_TIMEOUT; - return( ld->ld_errno ); - } - - return( ldap_result2error( ld, *res, 0 )); -} - - -int -ldap_url_search_s( - LDAP *ld, LDAP_CONST char *url, int attrsonly, LDAPMessage **res ) +static int +ldap_int_unhex( int c ) { - int msgid; - - if (( msgid = ldap_url_search( ld, url, attrsonly )) == -1 ) { - return( ld->ld_errno ); - } - - if ( ldap_result( ld, msgid, 1, (struct timeval *)NULL, res ) == -1 ) { - return( ld->ld_errno ); - } - - return( ldap_result2error( ld, *res, 0 )); + return( c >= '0' && c <= '9' ? c - '0' + : c >= 'A' && c <= 'F' ? c - 'A' + 10 + : c - 'a' + 10 ); } - void ldap_pvt_hex_unescape( char *s ) { @@ -1210,12 +1149,14 @@ ldap_pvt_hex_unescape( char *s ) for ( p = s; *s != '\0'; ++s ) { if ( *s == '%' ) { - if ( *++s != '\0' ) { - *p = ldap_pvt_unhex( *s ) << 4; + if ( *++s == '\0' ) { + break; } - if ( *++s != '\0' ) { - *p++ += ldap_pvt_unhex( *s ); + *p = ldap_int_unhex( *s ) << 4; + if ( *++s == '\0' ) { + break; } + *p++ += ldap_int_unhex( *s ); } else { *p++ = *s; } @@ -1225,10 +1166,3 @@ ldap_pvt_hex_unescape( char *s ) } -int -ldap_pvt_unhex( int c ) -{ - return( c >= '0' && c <= '9' ? c - '0' - : c >= 'A' && c <= 'F' ? c - 'A' + 10 - : c - 'a' + 10 ); -}