}
static 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++) {
+ for(int i = 0; i < 1000; i++) {
int port = 0x1000 + (rand() & 0x7fff);
if(try_bind(port)) {
char filename[PATH_MAX];
fprintf(f, "Port = %d\n", port);
fclose(f);
- fprintf(stderr, "MeshLink will instead listen on port %d.\n", port);
return port;
}
}
}
if(!port)
- port = "655";
+ goto invalid;
if(!b64decode(slash, mesh->hash, 18) || !b64decode(slash + 24, mesh->cookie, 18))
goto invalid;
mesh->self->connection->name = xstrdup(name);
read_host_config(mesh, mesh->config, name);
- if(!get_config_string(lookup_config(mesh->config, "Port"), &mesh->myport))
- mesh->myport = xstrdup("655");
+ if(!get_config_string(lookup_config(mesh->config, "Port"), &mesh->myport)) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Port for MeshLink instance required!");
+ return false;
+ }
mesh->self->connection->options = 0;
mesh->self->connection->protocol_major = PROT_MAJOR;
return false;
}
- // TODO: require Port to be set? Or use "0" and use getsockname()?
-
- if(!mesh->myport)
- mesh->myport = xstrdup("655");
-
xasprintf(&mesh->self->hostname, "MYSELF port %s", mesh->myport);
mesh->self->connection->hostname = xstrdup(mesh->self->hostname);
*space = 0;
} else {
// TODO: Only allow Address statements?
- if(!get_config_string(lookup_config(outgoing->config_tree, "Port"), &port))
- port = xstrdup("655");
+ if(!get_config_string(lookup_config(outgoing->config_tree, "Port"), &port)) {
+ logger(DEBUG_CONNECTIONS, LOG_ERR, "No Port known for %s", outgoing->name);
+ retry_outgoing(mesh, outgoing);
+ return false;
+ }
}
outgoing->ai = str2addrinfo(address, port, SOCK_STREAM);