odyssey: do not resolve ip addresses

This commit is contained in:
Dmitry Simonenko 2018-09-06 18:29:10 +03:00
parent 6303a388ec
commit 13ed93f464
1 changed files with 42 additions and 15 deletions

View File

@ -13,6 +13,7 @@
#include <ctype.h> #include <ctype.h>
#include <inttypes.h> #include <inttypes.h>
#include <assert.h> #include <assert.h>
#include <arpa/inet.h>
#include <machinarium.h> #include <machinarium.h>
#include <kiwi.h> #include <kiwi.h>
@ -262,23 +263,49 @@ od_backend_connect_to(od_server_t *server,
uint64_t time_connect_start; uint64_t time_connect_start;
time_connect_start = machine_time(); time_connect_start = machine_time();
struct sockaddr_un saddr_un; struct sockaddr_un saddr_un;
struct sockaddr *saddr; struct sockaddr_in saddr_v4;
struct sockaddr_in6 saddr_v6;
struct sockaddr *saddr;
struct addrinfo *ai = NULL; struct addrinfo *ai = NULL;
if (server_config->host) {
/* resolve server address */ /* resolve server address */
char port[16]; if (server_config->host)
od_snprintf(port, sizeof(port), "%d", server_config->port); {
rc = machine_getaddrinfo(server_config->host, port, NULL, &ai, 0); /* assume IPv6 or IPv4 is specified */
if (rc != 0) { int rc_resolve = -1;
od_error(&instance->logger, context, NULL, server, if (strchr(server_config->host, ':')) {
"failed to resolve %s:%d", /* v6 */
server_config->host, memset(&saddr_v6, 0, sizeof(saddr_v6));
server_config->port); saddr_v6.sin6_family = AF_INET6;
return -1; saddr_v6.sin6_port = htons(server_config->port);
rc_resolve = inet_pton(AF_INET6, server_config->host, &saddr_v6.sin6_addr);
saddr = (struct sockaddr*)&saddr_v6;
} else {
/* v4 or hostname */
memset(&saddr_v4, 0, sizeof(saddr_v4));
saddr_v4.sin_family = AF_INET;
saddr_v4.sin_port = htons(server_config->port);
rc_resolve = inet_pton(AF_INET, server_config->host, &saddr_v4.sin_addr);
saddr = (struct sockaddr*)&saddr_v4;
}
/* schedule getaddrinfo() execution */
if (rc_resolve != 1) {
char port[16];
od_snprintf(port, sizeof(port), "%d", server_config->port);
rc = machine_getaddrinfo(server_config->host, port, NULL, &ai, 0);
if (rc != 0) {
od_error(&instance->logger, context, NULL, server,
"failed to resolve %s:%d",
server_config->host,
server_config->port);
return -1;
}
assert(ai != NULL);
saddr = ai->ai_addr;
} }
assert(ai != NULL);
saddr = ai->ai_addr;
} else { } else {
/* set unix socket path */ /* set unix socket path */
memset(&saddr_un, 0, sizeof(saddr_un)); memset(&saddr_un, 0, sizeof(saddr_un));