Функция использует временный буфер, предоставленный вызывающей стороной. Хитрость заключается в обработке ошибки ERANGE
.
int rc, err;
char *str_host;
struct hostent hbuf;
struct hostent *result;
while ((rc = gethostbyname_r(str_host, &hbuf, buf, len, &result, &err)) == ERANGE) {
/* expand buf */
len *= 2;
void *tmp = realloc(buf, buflen);
if (NULL == tmp) {
free(buf);
perror("realloc");
}else{
buf = tmp;
}
}
if (0 != rc || NULL == result) {
perror("gethostbyname");
}
EDIT
В свете последних комментариев, я думаю, что вы действительно хотите это getaddrinfo
.