/* Setup sockets */
static void configure_tcp(connection_t *c) {
- int option;
-
#ifdef O_NONBLOCK
int flags = fcntl(c->socket, F_GETFL);
#endif
#if defined(SOL_TCP) && defined(TCP_NODELAY)
- option = 1;
- setsockopt(c->socket, SOL_TCP, TCP_NODELAY, (void *)&option, sizeof option);
+ int nodelay = 1;
+ setsockopt(c->socket, SOL_TCP, TCP_NODELAY, (void *)&nodelay, sizeof nodelay);
#endif
#if defined(SOL_IP) && defined(IP_TOS) && defined(IPTOS_LOWDELAY)
- option = IPTOS_LOWDELAY;
- setsockopt(c->socket, SOL_IP, IP_TOS, (void *)&option, sizeof option);
+ int lowdelay = IPTOS_LOWDELAY;
+ setsockopt(c->socket, SOL_IP, IP_TOS, (void *)&lowdelay, sizeof lowdelay);
#endif
}
int nfd;
char *addrstr;
int option;
- char *iface;
nfd = socket(sa->sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
c->last_ping_time = mesh->loop.now.tv_sec;
c->status.connecting = false;
- send_id(c);
+ send_id(mesh, c);
}
static void do_outgoing_pipe(meshlink_handle_t *mesh, connection_t *c, char *command) {
c->outcompression = mesh->self->connection->outcompression;
c->last_ping_time = mesh->loop.now.tv_sec;
- connection_add(c);
+ connection_add(mesh, c);
io_add(&mesh->loop, &c->io, handle_meta_io, c, c->socket, IO_READ|IO_WRITE);
}
void setup_outgoing_connection(meshlink_handle_t *mesh, outgoing_t *outgoing) {
+ bool blacklisted = false;
timeout_del(&mesh->loop, &outgoing->ev);
- node_t *n = lookup_node(outgoing->name);
+ node_t *n = lookup_node(mesh, outgoing->name);
if(n && n->connection) {
logger(DEBUG_CONNECTIONS, LOG_INFO, "Already connected to %s", outgoing->name);
read_host_config(mesh, outgoing->config_tree, outgoing->name);
outgoing->cfg = lookup_config(outgoing->config_tree, "Address");
+ get_config_bool(lookup_config(outgoing->config_tree, "blacklisted"), &blacklisted);
+ if (blacklisted) return;
+
if(!outgoing->cfg) {
if(n)
outgoing->aip = outgoing->ai = get_known_addresses(n);
fd = accept(l->tcp.fd, &sa.sa, &len);
if(fd < 0) {
+ if(errno == EINVAL) { // TODO: check if Windows agrees
+ event_loop_stop(loop);
+ return;
+ }
+
logger(DEBUG_ALWAYS, LOG_ERR, "Accepting a new connection failed: %s", sockstrerror(sockerrno));
return;
}
configure_tcp(c);
- connection_add(c);
+ connection_add(mesh, c);
c->allow_request = ID;
- send_id(c);
+ send_id(mesh, c);
}
-static void free_outgoing(meshlink_handle_t *mesh, outgoing_t *outgoing) {
+static void free_outgoing(outgoing_t *outgoing) {
+ meshlink_handle_t *mesh = outgoing->mesh;
+
timeout_del(&mesh->loop, &outgoing->ev);
if(outgoing->ai)
if(!found) {
outgoing_t *outgoing = xzalloc(sizeof *outgoing);
+ outgoing->mesh = mesh;
outgoing->name = name;
list_insert_tail(mesh->outgoings, outgoing);
setup_outgoing_connection(mesh, outgoing);