struct hostent *lsGetHostByName(const char *name, int af) { #define MAX_ADDR 35 /* same as gethostbyname2() */ struct addrinfo hints, *res=0, *res0; struct hostent hostent, *hp; static char *addrlist[MAX_ADDR + 1]; int i, addr_len, offset, sz; MUTEX_LOCK(gh_mutex); /* we are not thread safe */ for (i=0; iai_canonname) hostent.h_name = (char *)strdup(res0->ai_canonname); hostent.h_addrtype = res0->ai_family; if (af == AF_INET) { addr_len = 4; /* 48 bit */ offset = 2; } else if (af == AF_INET6) { addr_len = 16; /* 128 bit */ offset = 6; } else { hp = NULL; goto endofus; } hostent.h_length = addr_len; hostent.h_addr_list = addrlist; for (res=res0, i=0; res && iai_next, i++) { if (res->ai_family == af) { hostent.h_addr_list[i] = (char *)malloc(addr_len); memset(hostent.h_addr_list[i], 0, addr_len); memcpy(hostent.h_addr_list[i], res->ai_addr->sa_data + offset, addr_len); } } freeaddrinfo(res0); sz = sizeof(hostent); hp = (struct hostent *) malloc(sz); memset(hp, 0, sz); memcpy(hp, &hostent, sz); } else { hp = NULL; } endofus: MUTEX_UNLOCK(gh_mutex); return (hp); }