X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink.c;h=8513c8f99613ed6785789be189aafaa96759feb0;hb=991ae7d0d63cf72fb3071a5d6a8112e0bb547127;hp=f87e4de0ec8326d34c07cc5b6b9a196ea10adbda;hpb=eaea9a2ea3c80478a6aa4e502afaed5b5b6bbfde;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index f87e4de0..8513c8f9 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -442,11 +442,11 @@ static char *get_my_hostname(meshlink_handle_t *mesh, uint32_t flags) { if(mesh->invitation_addresses) { for list_each(char, combo, mesh->invitation_addresses) { hostname[n] = xstrdup(combo); - char *colon = strchr(hostname[n], ':'); + char *slash = strrchr(hostname[n], '/'); - if(colon) { - *colon = 0; - port[n] = xstrdup(colon + 1); + if(slash) { + *slash = 0; + port[n] = xstrdup(slash + 1); } n++; @@ -577,7 +577,7 @@ static char *get_my_hostname(meshlink_handle_t *mesh, uint32_t flags) { return hostport; } -static bool try_bind(int port) { +static bool try_bind(meshlink_handle_t *mesh, int port) { struct addrinfo *ai = NULL; struct addrinfo hint = { .ai_flags = AI_PASSIVE, @@ -598,16 +598,9 @@ static bool try_bind(int port) { for(struct addrinfo *aip = ai; aip; aip = aip->ai_next) { /* Try to bind to TCP. */ - int tcp_fd = socket(aip->ai_family, SOCK_STREAM, IPPROTO_TCP); + int tcp_fd = setup_tcp_listen_socket(mesh, aip); if(tcp_fd == -1) { - continue; - } - - int result = bind(tcp_fd, aip->ai_addr, aip->ai_addrlen); - closesocket(tcp_fd); - - if(result) { if(errno == EADDRINUSE) { /* If this port is in use for any address family, avoid it. */ success = false; @@ -619,21 +612,16 @@ static bool try_bind(int port) { /* If TCP worked, then we require that UDP works as well. */ - int udp_fd = socket(aip->ai_family, SOCK_DGRAM, IPPROTO_UDP); + int udp_fd = setup_udp_listen_socket(mesh, aip); if(udp_fd == -1) { + closesocket(tcp_fd); success = false; break; } - result = bind(udp_fd, aip->ai_addr, aip->ai_addrlen); + closesocket(tcp_fd); closesocket(udp_fd); - - if(result) { - success = false; - break; - } - success = true; } @@ -645,7 +633,7 @@ int check_port(meshlink_handle_t *mesh) { for(int i = 0; i < 1000; i++) { int port = 0x1000 + prng(mesh, 0x8000); - if(try_bind(port)) { + if(try_bind(mesh, port)) { free(mesh->myport); xasprintf(&mesh->myport, "%d", port); return port; @@ -1173,7 +1161,6 @@ static void *setup_network_in_netns_thread(void *arg) { } bool success = setup_network(mesh); - add_local_addresses(mesh); return success ? arg : NULL; } #endif // HAVE_SETNS @@ -1546,7 +1533,6 @@ meshlink_handle_t *meshlink_open_ex(const meshlink_open_params_t *params) { #endif // HAVE_SETNS } else { success = setup_network(mesh); - add_local_addresses(mesh); } if(!success) { @@ -2469,11 +2455,7 @@ bool meshlink_add_invitation_address(struct meshlink_handle *mesh, const char *a char *combo; if(port) { - if(strchr(address, ':')) { - xasprintf(&combo, "[%s]:%s", address, port); - } else { - xasprintf(&combo, "%s:%s", address, port); - } + xasprintf(&combo, "%s/%s", address, port); } else { combo = xstrdup(address); } @@ -2558,7 +2540,7 @@ bool meshlink_set_port(meshlink_handle_t *mesh, int port) { return true; } - if(!try_bind(port)) { + if(!try_bind(mesh, port)) { meshlink_errno = MESHLINK_ENETWORK; return false; }