diff --git a/libraries/libldap/util-int.c b/libraries/libldap/util-int.c index d962af4d3035c699d27eea5d9d313e1083f0660f..2695ee2b02293f3987f09c32c9006894ba780db9 100644 --- a/libraries/libldap/util-int.c +++ b/libraries/libldap/util-int.c @@ -834,10 +834,15 @@ static char *safe_realloc( char **buf, int len ) char * ldap_pvt_get_fqdn( char *name ) { - char *fqdn, *ha_buf; - char hostbuf[MAXHOSTNAMELEN+1]; +#ifdef HAVE_GETADDRINFO + struct addrinfo hints, *res; +#else + char *ha_buf; struct hostent *hp, he_buf; - int rc, local_h_errno; + int local_h_errno; +#endif + int rc; + char *fqdn, hostbuf[MAXHOSTNAMELEN+1]; if( name == NULL ) { if( gethostname( hostbuf, MAXHOSTNAMELEN ) == 0 ) { @@ -848,6 +853,22 @@ char * ldap_pvt_get_fqdn( char *name ) } } +#ifdef HAVE_GETADDRINFO + memset( &hints, 0, sizeof( hints )); + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_CANONNAME; + + LDAP_MUTEX_LOCK( &ldap_int_resolv_mutex ); + rc = getaddrinfo( name, NULL, &hints, &res ); + LDAP_MUTEX_UNLOCK( &ldap_int_resolv_mutex ); + if ( rc == 0 && res->ai_canonname ) { + fqdn = LDAP_STRDUP( res->ai_canonname ); + } else { + fqdn = LDAP_STRDUP( name ); + } + if ( rc == 0 ) + freeaddrinfo( res ); +#else rc = ldap_pvt_gethostbyname_a( name, &he_buf, &ha_buf, &hp, &local_h_errno ); @@ -858,6 +879,7 @@ char * ldap_pvt_get_fqdn( char *name ) } LDAP_FREE( ha_buf ); +#endif return fqdn; }