forked from yandex/odyssey
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dns.c
82 lines (75 loc) · 2.11 KB
/
dns.c
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
* Odyssey.
*
* Scalable PostgreSQL connection pooler.
*/
#include <arpa/inet.h>
#include <netinet/in.h>
#include <machinarium.h>
#include <odyssey.h>
static int od_getsockaddrname(struct sockaddr *sa, char *buf, int size,
int add_addr, int add_port)
{
char addr[128];
if (sa->sa_family == AF_INET) {
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
inet_ntop(sa->sa_family, &sin->sin_addr, addr, sizeof(addr));
if (add_addr && add_port)
od_snprintf(buf, size, "%s:%d", addr,
ntohs(sin->sin_port));
else if (add_addr)
od_snprintf(buf, size, "%s", addr);
else if (add_port)
od_snprintf(buf, size, "%d", ntohs(sin->sin_port));
return 0;
}
if (sa->sa_family == AF_INET6) {
struct sockaddr_in6 *sin = (struct sockaddr_in6 *)sa;
inet_ntop(sa->sa_family, &sin->sin6_addr, addr, sizeof(addr));
if (add_addr && add_port)
od_snprintf(buf, size, "[%s]:%d", addr,
ntohs(sin->sin6_port));
else if (add_addr)
od_snprintf(buf, size, "%s", addr);
else if (add_port)
od_snprintf(buf, size, "%d", ntohs(sin->sin6_port));
return 0;
}
if (sa->sa_family == AF_UNIX) {
od_snprintf(buf, size, "<unix socket>");
return 0;
}
od_snprintf(buf, size, "%s", "");
return -1;
}
int od_getaddrname(struct addrinfo *ai, char *buf, int size, int add_addr,
int add_port)
{
return od_getsockaddrname(ai->ai_addr, buf, size, add_addr, add_port);
}
int od_getpeername(machine_io_t *io, char *buf, int size, int add_addr,
int add_port)
{
struct sockaddr_storage sa;
int salen = sizeof(sa);
int rc = machine_getpeername(io, (struct sockaddr *)&sa, &salen);
if (rc < 0) {
od_snprintf(buf, size, "%s", "");
return -1;
}
return od_getsockaddrname((struct sockaddr *)&sa, buf, size, add_addr,
add_port);
}
int od_getsockname(machine_io_t *io, char *buf, int size, int add_addr,
int add_port)
{
struct sockaddr_storage sa;
int salen = sizeof(sa);
int rc = machine_getsockname(io, (struct sockaddr *)&sa, &salen);
if (rc < 0) {
od_snprintf(buf, size, "%s", "");
return -1;
}
return od_getsockaddrname((struct sockaddr *)&sa, buf, size, add_addr,
add_port);
}