X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnetutl.c;h=0c19f5bbe55cf6194841ccd2d8158225871313bf;hb=0289162552cd85375605044c696e2a3294e7aa9a;hp=4e58911cb46f12dbd52f5494d17dec443124561a;hpb=87f96aec8c48327d879c20ff2b789c88a675173d;p=tinc diff --git a/src/netutl.c b/src/netutl.c index 4e58911c..0c19f5bb 100644 --- a/src/netutl.c +++ b/src/netutl.c @@ -23,11 +23,34 @@ #include "net.h" #include "netutl.h" #include "logger.h" -#include "utils.h" #include "xalloc.h" bool hostnames = false; +uint16_t service_to_port(const char *service) { + struct addrinfo *ai = str2addrinfo("localhost", service, SOCK_STREAM); + + if(!ai || !ai->ai_addr) { + return 0; + } + + sockaddr_t sa; + memcpy(&sa, ai->ai_addr, ai->ai_addrlen); + freeaddrinfo(ai); + + switch(sa.sa.sa_family) { + case AF_INET: + return ntohs(sa.in.sin_port); + + case AF_INET6: + return ntohs(sa.in6.sin6_port); + + default: + logger(DEBUG_ALWAYS, LOG_WARNING, "Unknown address family %d for service %s.", sa.sa.sa_family, service); + return 0; + } +} + /* Turn a string into a struct addrinfo. Return NULL on failure. @@ -54,7 +77,7 @@ struct addrinfo *str2addrinfo(const char *address, const char *service, int sock sockaddr_t str2sockaddr(const char *address, const char *port) { struct addrinfo *ai, hint = {0}; - sockaddr_t result = {{0}}; + sockaddr_t result = {0}; int err; hint.ai_family = AF_UNSPEC; @@ -277,3 +300,20 @@ void sockaddr_setport(sockaddr_t *sa, const char *port) { return; } } + +uint16_t get_bound_port(int sockfd) { + sockaddr_t sa; + socklen_t salen = sizeof(sa); + + if(getsockname(sockfd, (struct sockaddr *) &sa, &salen)) { + return 0; + } + + if(sa.sa.sa_family == AF_INET) { + return ntohs(sa.in.sin_port); + } else if(sa.sa.sa_family == AF_INET6) { + return ntohs(sa.in6.sin6_port); + } else { + return 0; + } +}