]> git.meshlink.io Git - meshlink/commitdiff
Further improve try_bind().
authorGuus Sliepen <guus@meshlink.io>
Fri, 28 Feb 2020 18:25:52 +0000 (19:25 +0100)
committerGuus Sliepen <guus@meshlink.io>
Fri, 28 Feb 2020 18:30:11 +0000 (19:30 +0100)
Make try_bind() do the same checks as add_listen_address() does: try to
create both a TCP and UDP socket on a given port for all address
families. If one address family succeeds for both TCP and UDP, consider
this a valid port.

src/meshlink.c

index 6fd89daded547d5ad2ad6045d55540fc2cfd4a17..4e32761fa1b30fcbf5713fa46db005383a517453 100644 (file)
@@ -540,25 +540,33 @@ static bool try_bind(int port) {
        bool success = false;
 
        for(struct addrinfo *aip = ai; aip; aip = aip->ai_next) {
-               if(!(aip->ai_family == AF_INET || aip->ai_family == AF_INET6)) {
+               int tcp_fd = socket(aip->ai_family, SOCK_STREAM, IPPROTO_TCP);
+
+               if(tcp_fd == -1) {
                        continue;
                }
 
-               int fd = socket(aip->ai_family, SOCK_STREAM, IPPROTO_TCP);
+               int result = bind(tcp_fd, aip->ai_addr, aip->ai_addrlen);
+               closesocket(tcp_fd);
 
-               if(fd == -1) {
-                       success = false;
-                       break;
+               if(result) {
+                       continue;
                }
 
-               int result = bind(fd, aip->ai_addr, aip->ai_addrlen);
-               closesocket(fd);
+               int udp_fd = socket(aip->ai_family, SOCK_DGRAM, IPPROTO_UDP);
+
+               if(udp_fd == -1) {
+                       continue;
+               }
+
+               result = bind(udp_fd, aip->ai_addr, aip->ai_addrlen);
+               closesocket(udp_fd);
 
                if(result) {
-                       success = false;
-                       break;
+                       continue;
                } else {
                        success = true;
+                       break;
                }
        }