-static bool try_bind(int port) {
- struct addrinfo *ai = NULL;
- struct addrinfo hint = {
- .ai_flags = AI_PASSIVE,
- .ai_family = AF_UNSPEC,
- .ai_socktype = SOCK_STREAM,
- .ai_protocol = IPPROTO_TCP,
- };
-
- char portstr[16];
- snprintf(portstr, sizeof portstr, "%d", port);
-
- if(getaddrinfo(NULL, portstr, &hint, &ai) || !ai)
- return false;
-
- while(ai) {
- int fd = socket(ai->ai_family, SOCK_STREAM, IPPROTO_TCP);
- if(!fd)
- return false;
- int result = bind(fd, ai->ai_addr, ai->ai_addrlen);
- closesocket(fd);
- if(result)
- return false;
- ai = ai->ai_next;
- }
-
- return true;
-}
-
-int check_port(meshlink_handle_t *mesh) {
- if(try_bind(655))
- return 655;
-
- fprintf(stderr, "Warning: could not bind to port 655.\n");
-
- for(int i = 0; i < 100; i++) {
- int port = 0x1000 + (rand() & 0x7fff);
- if(try_bind(port)) {
- char filename[PATH_MAX];
- snprintf(filename, sizeof filename, "%s" SLASH "hosts" SLASH "%s", mesh->confbase, mesh->name);
- FILE *f = fopen(filename, "a");
- if(!f) {
- fprintf(stderr, "Please change MeshLink's Port manually.\n");
- return 0;
- }
-
- fprintf(f, "Port = %d\n", port);
- fclose(f);
- fprintf(stderr, "MeshLink will instead listen on port %d.\n", port);
- return port;
- }
- }
-
- fprintf(stderr, "Please change MeshLink's Port manually.\n");
- return 0;
-}
-