X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_socket.c;h=7b6c493baeb30cc84935479a95d5e62e87a644f3;hb=0058ff2373221bf19a6cd30a853c3e8d696c2e74;hp=4ef7eb0c9aa0ebaf6ccaa16411d67c41bfe38c79;hpb=a7f01c4bfdb75391d2da560f6b2dc37ccfba020b;p=meshlink diff --git a/src/net_socket.c b/src/net_socket.c index 4ef7eb0c..7b6c493b 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -43,8 +43,6 @@ int max_connection_burst = 100; /* Setup sockets */ static void configure_tcp(connection_t *c) { - int option; - #ifdef O_NONBLOCK int flags = fcntl(c->socket, F_GETFL); @@ -60,13 +58,13 @@ static void configure_tcp(connection_t *c) { #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 } @@ -102,7 +100,6 @@ int setup_listen_socket(const sockaddr_t *sa) { int nfd; char *addrstr; int option; - char *iface; nfd = socket(sa->sa.sa_family, SOCK_STREAM, IPPROTO_TCP); @@ -255,7 +252,7 @@ void finish_connecting(meshlink_handle_t *mesh, connection_t *c) { 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) { @@ -319,7 +316,7 @@ static void handle_meta_write(meshlink_handle_t *mesh, connection_t *c) { 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; } @@ -343,7 +340,7 @@ static void handle_meta_io(event_loop_t *loop, void *data, int flags) { 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; } } @@ -351,7 +348,7 @@ static void handle_meta_io(event_loop_t *loop, void *data, int flags) { 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) { @@ -465,7 +462,7 @@ begin: 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); @@ -506,9 +503,10 @@ static struct addrinfo *get_known_addresses(node_t *n) { } 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); @@ -521,6 +519,9 @@ void setup_outgoing_connection(meshlink_handle_t *mesh, outgoing_t *outgoing) { 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); @@ -548,6 +549,11 @@ void handle_new_meta_connection(event_loop_t *loop, void *data, int flags) { 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; } @@ -620,10 +626,10 @@ void handle_new_meta_connection(event_loop_t *loop, void *data, int flags) { 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) { @@ -690,7 +696,7 @@ void try_outgoing_connections(meshlink_handle_t *mesh) { 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); } }