/* Setup sockets */
static void configure_tcp(connection_t *c) {
- int option;
-
#ifdef O_NONBLOCK
int flags = fcntl(c->socket, F_GETFL);
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) {
logger(DEBUG_CONNECTIONS, LOG_ERR, "Could not send %d bytes of data to %s (%s): %s", c->outbuf.len - c->outbuf.offset, c->name, c->hostname, strerror(errno));
}
- terminate_connection(c, c->status.active);
+ terminate_connection(mesh, c, c->status.active);
return;
}
finish_connecting(mesh, c);
else {
logger(DEBUG_CONNECTIONS, LOG_DEBUG, "Error while connecting to %s (%s): %s", c->name, c->hostname, sockstrerror(result));
- terminate_connection(c, false);
+ terminate_connection(mesh, c, false);
return;
}
}
if(flags & IO_WRITE)
handle_meta_write(mesh, c);
else
- handle_meta_connection_data(c);
+ handle_meta_connection_data(mesh, c);
}
bool do_outgoing_connection(meshlink_handle_t *mesh, outgoing_t *outgoing) {
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) {
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);
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) {
// TODO: Drop support for ConnectTo since AutoConnect is now always on?
for(config_t *cfg = lookup_config(mesh->config, "ConnectTo"); cfg; cfg = lookup_config_next(mesh->config, cfg)) {
char *name;
+ bool blacklisted;
get_config_string(cfg, &name);
if(!check_id(name)) {
continue;
}
+ get_config_bool(lookup_config(mesh->config, "blacklisted"), &blacklisted);
+ if (blacklisted)
+ continue;
+
bool found = false;
for list_each(outgoing_t, outgoing, mesh->outgoings) {
if(c->outgoing && c->outgoing->timeout == -1) {
c->outgoing = NULL;
logger(DEBUG_CONNECTIONS, LOG_INFO, "No more outgoing connection to %s", c->name);
- terminate_connection(c, c->status.active);
+ terminate_connection(mesh, c, c->status.active);
}
}