2017-05-25 12:01:56 +00:00
|
|
|
|
|
|
|
/*
|
2018-03-12 14:03:15 +00:00
|
|
|
* Odyssey.
|
2017-05-25 12:01:56 +00:00
|
|
|
*
|
2018-04-04 13:19:58 +00:00
|
|
|
* Scalable PostgreSQL connection pooler.
|
2020-04-02 11:00:56 +00:00
|
|
|
*/
|
2017-05-25 12:01:56 +00:00
|
|
|
|
|
|
|
#include <arpa/inet.h>
|
2020-11-25 10:17:15 +00:00
|
|
|
#include <netinet/in.h>
|
2017-05-25 12:01:56 +00:00
|
|
|
|
|
|
|
#include <machinarium.h>
|
2018-08-28 14:43:46 +00:00
|
|
|
#include <odyssey.h>
|
2017-05-25 12:01:56 +00:00
|
|
|
|
2017-08-17 15:15:19 +00:00
|
|
|
static int
|
2020-04-02 11:00:56 +00:00
|
|
|
od_getsockaddrname(struct sockaddr *sa,
|
|
|
|
char *buf,
|
|
|
|
int size,
|
2017-08-17 15:15:19 +00:00
|
|
|
int add_addr,
|
|
|
|
int add_port)
|
2017-05-25 12:01:56 +00:00
|
|
|
{
|
|
|
|
char addr[128];
|
2017-06-19 14:39:12 +00:00
|
|
|
if (sa->sa_family == AF_INET) {
|
2020-04-02 11:00:56 +00:00
|
|
|
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
|
2017-06-19 14:39:12 +00:00
|
|
|
inet_ntop(sa->sa_family, &sin->sin_addr, addr, sizeof(addr));
|
2017-08-17 15:15:19 +00:00
|
|
|
if (add_addr && add_port)
|
2017-11-27 12:54:16 +00:00
|
|
|
od_snprintf(buf, size, "%s:%d", addr, ntohs(sin->sin_port));
|
2020-04-02 11:00:56 +00:00
|
|
|
else if (add_addr)
|
2017-11-27 12:54:16 +00:00
|
|
|
od_snprintf(buf, size, "%s", addr);
|
2020-04-02 11:00:56 +00:00
|
|
|
else if (add_port)
|
2017-11-27 12:54:16 +00:00
|
|
|
od_snprintf(buf, size, "%d", ntohs(sin->sin_port));
|
2017-05-25 12:01:56 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2017-06-19 14:39:12 +00:00
|
|
|
if (sa->sa_family == AF_INET6) {
|
2020-04-02 11:00:56 +00:00
|
|
|
struct sockaddr_in6 *sin = (struct sockaddr_in6 *)sa;
|
2017-06-19 14:39:12 +00:00
|
|
|
inet_ntop(sa->sa_family, &sin->sin6_addr, addr, sizeof(addr));
|
2017-08-17 15:15:19 +00:00
|
|
|
if (add_addr && add_port)
|
2017-11-27 12:54:16 +00:00
|
|
|
od_snprintf(buf, size, "[%s]:%d", addr, ntohs(sin->sin6_port));
|
2020-04-02 11:00:56 +00:00
|
|
|
else if (add_addr)
|
2017-11-27 12:54:16 +00:00
|
|
|
od_snprintf(buf, size, "%s", addr);
|
2020-04-02 11:00:56 +00:00
|
|
|
else if (add_port)
|
2017-11-27 12:54:16 +00:00
|
|
|
od_snprintf(buf, size, "%d", ntohs(sin->sin6_port));
|
2017-05-25 12:01:56 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2018-07-02 15:41:17 +00:00
|
|
|
if (sa->sa_family == AF_UNIX) {
|
|
|
|
od_snprintf(buf, size, "<unix socket>");
|
|
|
|
return 0;
|
|
|
|
}
|
2017-11-27 12:54:16 +00:00
|
|
|
od_snprintf(buf, size, "%s", "");
|
2017-05-25 12:01:56 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2017-06-19 14:39:12 +00:00
|
|
|
|
2018-08-28 14:43:46 +00:00
|
|
|
int
|
2020-04-02 11:00:56 +00:00
|
|
|
od_getaddrname(struct addrinfo *ai,
|
|
|
|
char *buf,
|
|
|
|
int size,
|
|
|
|
int add_addr,
|
|
|
|
int add_port)
|
2017-06-19 14:39:12 +00:00
|
|
|
{
|
2017-08-17 15:15:19 +00:00
|
|
|
return od_getsockaddrname(ai->ai_addr, buf, size, add_addr, add_port);
|
2017-06-19 14:39:12 +00:00
|
|
|
}
|
|
|
|
|
2018-08-28 14:43:46 +00:00
|
|
|
int
|
2020-04-02 11:00:56 +00:00
|
|
|
od_getpeername(machine_io_t *io,
|
|
|
|
char *buf,
|
|
|
|
int size,
|
|
|
|
int add_addr,
|
|
|
|
int add_port)
|
2017-06-19 14:39:12 +00:00
|
|
|
{
|
|
|
|
struct sockaddr_storage sa;
|
|
|
|
int salen = sizeof(sa);
|
2020-04-02 11:00:56 +00:00
|
|
|
int rc = machine_getpeername(io, (struct sockaddr *)&sa, &salen);
|
2017-06-19 14:39:12 +00:00
|
|
|
if (rc < 0) {
|
2017-11-27 12:54:16 +00:00
|
|
|
od_snprintf(buf, size, "%s", "");
|
2017-06-19 14:39:12 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2020-04-02 11:00:56 +00:00
|
|
|
return od_getsockaddrname(
|
|
|
|
(struct sockaddr *)&sa, buf, size, add_addr, add_port);
|
2017-08-17 15:15:19 +00:00
|
|
|
}
|
|
|
|
|
2018-08-28 14:43:46 +00:00
|
|
|
int
|
2020-04-02 11:00:56 +00:00
|
|
|
od_getsockname(machine_io_t *io,
|
|
|
|
char *buf,
|
|
|
|
int size,
|
|
|
|
int add_addr,
|
|
|
|
int add_port)
|
2017-08-17 15:15:19 +00:00
|
|
|
{
|
|
|
|
struct sockaddr_storage sa;
|
|
|
|
int salen = sizeof(sa);
|
2020-04-02 11:00:56 +00:00
|
|
|
int rc = machine_getsockname(io, (struct sockaddr *)&sa, &salen);
|
2017-08-17 15:15:19 +00:00
|
|
|
if (rc < 0) {
|
2017-11-27 12:54:16 +00:00
|
|
|
od_snprintf(buf, size, "%s", "");
|
2017-08-17 15:15:19 +00:00
|
|
|
return -1;
|
|
|
|
}
|
2020-04-02 11:00:56 +00:00
|
|
|
return od_getsockaddrname(
|
|
|
|
(struct sockaddr *)&sa, buf, size, add_addr, add_port);
|
2017-06-19 14:39:12 +00:00
|
|
|
}
|