X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fdnssrv.c;h=cc193e93582bef587dcfb15c511b60feaf00d18d;hb=fe86a81e251bda73f04841f765b2a93ac0354396;hp=ad9d5e05b7e3e08c7f3694fa27b1b000409064f2;hpb=f9411ca154e9ce8870b3915536d6aba28ad50ec1;p=openldap diff --git a/libraries/libldap/dnssrv.c b/libraries/libldap/dnssrv.c index ad9d5e05b7..cc193e9358 100644 --- a/libraries/libldap/dnssrv.c +++ b/libraries/libldap/dnssrv.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -41,9 +41,8 @@ int ldap_dn2domain( char *domain = NULL; char **dn; - if( dn_in == NULL || domainp == NULL ) { - return -1; - } + assert( dn_in != NULL ); + assert( domainp != NULL ); dn = ldap_explode_dn( dn_in, 0 ); @@ -61,12 +60,15 @@ int ldap_dn2domain( return -3; } -#define LDAP_DC "dc=" -#define LDAP_DCOID "0.9.2342.19200300.100.1.25=" if( rdn[1] == NULL ) { + /* + * single-valued RDN + */ char *dc; - /* single RDN */ + +#define LDAP_DC "dc=" +#define LDAP_DCOID "0.9.2342.19200300.100.1.25=" if( strncasecmp( rdn[0], LDAP_DC, sizeof(LDAP_DC)-1 ) == 0 ) @@ -96,7 +98,7 @@ int ldap_dn2domain( ndomain = LDAP_REALLOC( domain, ( domain == NULL ? 0 : strlen(domain) ) - + strlen(dc) + 2 ); + + strlen(dc) + sizeof(".") ); if( ndomain == NULL ) { LDAP_FREE( rdn ); @@ -111,17 +113,28 @@ int ldap_dn2domain( } else { strcat( ndomain, "." ); } + strcat( ndomain, dc ); + domain = ndomain; continue; } } + /* + * multi-valued RDN or fall thru + */ + LDAP_VFREE( rdn ); LDAP_FREE( domain ); domain = NULL; } + if( domain != NULL && *domain == '\0' ) { + LDAP_FREE( domain ); + domain = NULL; + } + *domainp = domain; return 0; } @@ -133,12 +146,12 @@ int ldap_domain2dn( char *domain, *s, *tok_r, *dn; size_t loc; - if (domain_in == NULL || dnp == NULL) { - return LDAP_NO_MEMORY; - } + assert( domain_in != NULL ); + assert( dnp != NULL ); + domain = LDAP_STRDUP(domain_in); if (domain == NULL) { - return LDAP_NO_MEMORY; + return LDAP_NO_MEMORY; } dn = NULL; loc = 0; @@ -180,25 +193,22 @@ int ldap_domain2hostlist( LDAP_CONST char *domain, char **list ) { -#ifdef HAVE_RES_SEARCH +#ifdef HAVE_RES_QUERY char *request; - char *dn; char *hostlist = NULL; int rc, len, cur = 0; unsigned char reply[1024]; - if( domain == NULL || *domain == '\0' ) { - return LDAP_PARAM_ERROR; - } + assert( domain != NULL ); + assert( list != NULL ); - if( list == NULL ) { + if( *domain == '\0' ) { return LDAP_PARAM_ERROR; } request = LDAP_MALLOC(strlen(domain) + sizeof("_ldap._tcp.")); if (request == NULL) { - rc = LDAP_NO_MEMORY; - goto out; + return LDAP_NO_MEMORY; } sprintf(request, "_ldap._tcp.%s", domain); @@ -206,7 +216,8 @@ int ldap_domain2hostlist( ldap_pvt_thread_mutex_lock(&ldap_int_resolv_mutex); #endif - len = res_search(request, C_IN, T_SRV, reply, sizeof(reply)); + rc = LDAP_UNAVAILABLE; + len = res_query(request, C_IN, T_SRV, reply, sizeof(reply)); if (len >= 0) { unsigned char *p; char host[1024]; @@ -288,5 +299,5 @@ int ldap_domain2hostlist( return rc; #else return LDAP_NOT_SUPPORTED; -#endif /* HAVE_RES_SEARCH */ +#endif /* HAVE_RES_QUERY */ }