X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnetutl.c;h=2dcf1e47ead24a3b9ac630a87c6c7f103747772b;hb=ccc966b3940fa33216c6a02582a6ffc6267b7729;hp=38f4d487db0fbac6897d949fbd13a0308a9891f2;hpb=53522b1c11222273c7b41f72b374e759d13b2165;p=meshlink diff --git a/src/netutl.c b/src/netutl.c index 38f4d487..2dcf1e47 100644 --- a/src/netutl.c +++ b/src/netutl.c @@ -19,14 +19,13 @@ #include "system.h" +#include "meshlink_internal.h" #include "net.h" #include "netutl.h" #include "logger.h" #include "utils.h" #include "xalloc.h" -bool hostnames = false; - /* Turn a string into a struct addrinfo. Return NULL on failure. @@ -36,7 +35,7 @@ struct addrinfo *str2addrinfo(const char *address, const char *service, int sock int err; struct addrinfo hint = { - .ai_family = addressfamily, + .ai_family = AF_UNSPEC, .ai_socktype = socktype, }; @@ -59,7 +58,7 @@ sockaddr_t str2sockaddr(const char *address, const char *port) { struct addrinfo hint = { .ai_family = AF_UNSPEC, - .ai_flags = AI_NUMERICHOST, + .ai_flags = AI_NUMERICHOST | AI_NUMERICSERV, .ai_socktype = SOCK_STREAM, }; @@ -79,6 +78,45 @@ sockaddr_t str2sockaddr(const char *address, const char *port) { return result; } +sockaddr_t str2sockaddr_random(struct meshlink_handle *mesh, const char *address, const char *port) { + struct addrinfo *ai; + sockaddr_t result; + int err; + + memset(&result, 0, sizeof(result)); + + struct addrinfo hint = { + .ai_family = AF_UNSPEC, + .ai_flags = AI_NUMERICHOST | AI_NUMERICSERV, + .ai_socktype = SOCK_STREAM, + }; + + err = getaddrinfo(address, port, &hint, &ai); + + if(err || !ai) { + logger(NULL, MESHLINK_DEBUG, "Unknown type address %s port %s", address, port); + result.sa.sa_family = AF_UNKNOWN; + result.unknown.address = xstrdup(address); + result.unknown.port = xstrdup(port); + return result; + } + + int count = 0; + + for(struct addrinfo *aip = ai; aip; aip = aip->ai_next) { + count++; + } + + struct addrinfo *aip = ai; + + for(count = prng(mesh, count); count--; aip = aip->ai_next); + + memcpy(&result, aip->ai_addr, aip->ai_addrlen); + freeaddrinfo(ai); + + return result; +} + void sockaddr2str(const sockaddr_t *sa, char **addrstr, char **portstr) { char address[NI_MAXHOST]; char port[NI_MAXSERV]; @@ -130,8 +168,7 @@ char *sockaddr2hostname(const sockaddr_t *sa) { return str; } - err = getnameinfo(&sa->sa, SALEN(sa->sa), address, sizeof(address), port, sizeof(port), - hostnames ? 0 : (NI_NUMERICHOST | NI_NUMERICSERV)); + err = getnameinfo(&sa->sa, SALEN(sa->sa), address, sizeof(address), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); if(err) { logger(NULL, MESHLINK_ERROR, "Error while looking up hostname: %s", err == EAI_SYSTEM ? strerror(errno) : gai_strerror(err)); @@ -285,7 +322,8 @@ void packmsg_add_sockaddr(packmsg_output_t *out, const sockaddr_t *sa) { } sockaddr_t packmsg_get_sockaddr(packmsg_input_t *in) { - sockaddr_t sa = {0}; + sockaddr_t sa; + memset(&sa, 0, sizeof sa); int8_t type; const void *data;