summaryrefslogtreecommitdiff
path: root/src/network/gethostbyname.c
blob: 5088a51e0754441d5af81eb61ef53c2a43165cc2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#define _GNU_SOURCE

#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <netinet/in.h>

struct hostent *gethostbyname(const char *name)
{
	return gethostbyname2(name, AF_INET);
}

#if 0
struct hostent *gethostbyname(const char *name)
{
	static struct hostent h;
	static char *h_aliases[3];
	static char h_canon[256];
	static char *h_addr_list[10];
	static char h_addr_data[10][4];
	static const struct addrinfo hint = {
		.ai_family = AF_INET, .ai_flags = AI_CANONNAME
	};
	struct addrinfo *ai, *p;
	int i;

	switch (getaddrinfo(name, 0, &hint, &ai)) {
	case EAI_NONAME:
		h_errno = HOST_NOT_FOUND;
		break;
	case EAI_AGAIN:
		h_errno = TRY_AGAIN;
		break;
	case EAI_FAIL:
		h_errno = NO_RECOVERY;
		break;
	default:
	case EAI_MEMORY:
	case EAI_SYSTEM:
		h_errno = NO_DATA;
		break;
	case 0:
		break;
	}

	strcpy(h_canon, ai->ai_canonname);
	h.h_name = h_canon;
	h.h_aliases = h_aliases;
	h.h_aliases[0] = h_canon;
	h.h_aliases[1] = strcmp(h_canon, name) ? (char *)name : 0;
	h.h_length = 4;
	h.h_addr_list = h_addr_list;
	for (i=0, p=ai; i<sizeof h_addr_data/4 && p; i++, p=p->ai_next) {
		h.h_addr_list[i] = h_addr_data[i];
		memcpy(h.h_addr_list[i],
			&((struct sockaddr_in *)p->ai_addr)->sin_addr, 4);
	}
	h.h_addr_list[i] = 0;
	h.h_addrtype = AF_INET;
	freeaddrinfo(ai);
	return &h;
}
#endif