X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnetutl.c;h=0c19f5bbe55cf6194841ccd2d8158225871313bf;hb=0289162552cd85375605044c696e2a3294e7aa9a;hp=e2ee7719d73fabb14b50c3cdaa359366c9cea4b5;hpb=421aa3815645b2835c89799e4db91cf35466542b;p=tinc diff --git a/src/netutl.c b/src/netutl.c index e2ee7719..0c19f5bb 100644 --- a/src/netutl.c +++ b/src/netutl.c @@ -27,6 +27,30 @@ 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. @@ -276,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; + } +}