X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink.c;h=c6b14b8f043c1b0bdb4c38b6db8aa687651659b7;hb=e306efba0aa513ae498b84b7f383b05365022092;hp=6fd89daded547d5ad2ad6045d55540fc2cfd4a17;hpb=b5aaabe0fcb104ef7801a68f4f9e6b77732dbb28;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index 6fd89dad..c6b14b8f 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -540,26 +540,45 @@ 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)) { + /* Try to bind to TCP. */ + + 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) { + if(result) { + if(errno == EADDRINUSE) { + /* If this port is in use for any address family, avoid it. */ + success = false; + break; + } else { + continue; + } + } + + /* If TCP worked, then we require that UDP works as well. */ + + int udp_fd = socket(aip->ai_family, SOCK_DGRAM, IPPROTO_UDP); + + if(udp_fd == -1) { success = false; break; } - int result = bind(fd, aip->ai_addr, aip->ai_addrlen); - closesocket(fd); + result = bind(udp_fd, aip->ai_addr, aip->ai_addrlen); + closesocket(udp_fd); if(result) { success = false; break; - } else { - success = true; } + + success = true; } freeaddrinfo(ai);