X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_setup.c;h=52f5e820ffcf8c40e884e5f9c9cf9190f6a91fa2;hb=HEAD;hp=d0e450039913c995298f304f3b4003730ad606f8;hpb=097f88088e00923b74bc4c38e67feceb162ba4ef;p=meshlink diff --git a/src/net_setup.c b/src/net_setup.c index d0e45003..a7a538f0 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -93,6 +93,11 @@ bool node_read_public_key(meshlink_handle_t *mesh, node_t *n) { // While we are at it, read known address information if(!n->canonical_address) { n->canonical_address = packmsg_get_str_dup(&in); + + if(!*n->canonical_address) { + free(n->canonical_address); + n->canonical_address = NULL; + } } else { packmsg_skip_element(&in); } @@ -191,6 +196,12 @@ bool node_read_from_config(meshlink_handle_t *mesh, node_t *n, const config_t *c } n->canonical_address = packmsg_get_str_dup(&in); + + if(!*n->canonical_address) { + free(n->canonical_address); + n->canonical_address = NULL; + } + uint32_t count = packmsg_get_array(&in); for(uint32_t i = 0; i < count; i++) { @@ -207,11 +218,26 @@ bool node_read_from_config(meshlink_handle_t *mesh, node_t *n, const config_t *c return packmsg_done(&in); } -bool node_write_config(meshlink_handle_t *mesh, node_t *n) { +bool node_write_config(meshlink_handle_t *mesh, node_t *n, bool new_key) { if(!mesh->confbase) { return true; } + switch(mesh->storage_policy) { + case MESHLINK_STORAGE_KEYS_ONLY: + if(!new_key) { + return true; + } + + break; + + case MESHLINK_STORAGE_DISABLED: + return true; + + default: + break; + } + uint8_t buf[4096]; packmsg_output_t out = {buf, sizeof(buf)}; @@ -260,6 +286,7 @@ bool node_write_config(meshlink_handle_t *mesh, node_t *n) { return false; } + n->status.dirty = false; return true; } @@ -267,6 +294,15 @@ static bool load_node(meshlink_handle_t *mesh, const char *name, void *priv) { (void)priv; if(!check_id(name)) { + // Check if this is a temporary file, if so remove it + const char *suffix = strstr(name, ".tmp"); + + if(suffix && !suffix[4]) { + char filename[PATH_MAX]; + snprintf(filename, sizeof(filename), "%s" SLASH "current" SLASH "hosts", mesh->confbase); + unlink(filename); + } + return true; } @@ -301,7 +337,7 @@ static bool load_node(meshlink_handle_t *mesh, const char *name, void *priv) { return true; } -static int setup_tcp_listen_socket(meshlink_handle_t *mesh, const struct addrinfo *aip) { +int setup_tcp_listen_socket(meshlink_handle_t *mesh, const struct addrinfo *aip) { int nfd = socket(aip->ai_family, SOCK_STREAM, IPPROTO_TCP); if(nfd == -1) { @@ -312,6 +348,25 @@ static int setup_tcp_listen_socket(meshlink_handle_t *mesh, const struct addrinf fcntl(nfd, F_SETFD, FD_CLOEXEC); #endif +#ifdef O_NONBLOCK + int flags = fcntl(nfd, F_GETFL); + + if(fcntl(nfd, F_SETFL, flags | O_NONBLOCK) < 0) { + closesocket(nfd); + logger(mesh, MESHLINK_ERROR, "System call `%s' failed: %s", "fcntl", strerror(errno)); + return -1; + } + +#elif defined(WIN32) + unsigned long arg = 1; + + if(ioctlsocket(nfd, FIONBIO, &arg) != 0) { + closesocket(nfd); + logger(mesh, MESHLINK_ERROR, "Call to `%s' failed: %s", "ioctlsocket", sockstrerror(sockerrno)); + return -1; + } + +#endif int option = 1; setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, (void *)&option, sizeof(option)); @@ -339,7 +394,7 @@ static int setup_tcp_listen_socket(meshlink_handle_t *mesh, const struct addrinf return nfd; } -static int setup_udp_socket(meshlink_handle_t *mesh, const struct addrinfo *aip) { +int setup_udp_listen_socket(meshlink_handle_t *mesh, const struct addrinfo *aip) { int nfd = socket(aip->ai_family, SOCK_DGRAM, IPPROTO_UDP); if(nfd == -1) { @@ -422,7 +477,7 @@ static bool add_listen_sockets(meshlink_handle_t *mesh) { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM, .ai_protocol = IPPROTO_TCP, - .ai_flags = AI_PASSIVE, + .ai_flags = AI_PASSIVE | AI_NUMERICSERV, }; int err = getaddrinfo(NULL, mesh->myport, &hint, &ai); @@ -470,7 +525,7 @@ static bool add_listen_sockets(meshlink_handle_t *mesh) { /* If TCP worked, then we require that UDP works as well. */ - int udp_fd = setup_udp_socket(mesh, aip); + int udp_fd = setup_udp_listen_socket(mesh, aip); if(udp_fd == -1) { closesocket(tcp_fd); @@ -508,8 +563,8 @@ static bool add_listen_sockets(meshlink_handle_t *mesh) { for(int i = 0; i < mesh->listen_sockets; i++) { io_del(&mesh->loop, &mesh->listen_socket[i].tcp); io_del(&mesh->loop, &mesh->listen_socket[i].udp); - close(mesh->listen_socket[i].tcp.fd); - close(mesh->listen_socket[i].udp.fd); + closesocket(mesh->listen_socket[i].tcp.fd); + closesocket(mesh->listen_socket[i].udp.fd); } mesh->listen_sockets = 0; @@ -521,13 +576,7 @@ static bool add_listen_sockets(meshlink_handle_t *mesh) { /* Configure node_t mesh->self and set up the local sockets (listen only) */ -bool setup_myself(meshlink_handle_t *mesh) { - /* Set some defaults */ - - mesh->maxtimeout = 900; - - /* Done */ - +static bool setup_myself(meshlink_handle_t *mesh) { mesh->self->nexthop = mesh->self; node_add(mesh, mesh->self); @@ -565,7 +614,6 @@ bool setup_myself(meshlink_handle_t *mesh) { /* Done. */ - mesh->last_config_check = mesh->loop.now.tv_sec; mesh->last_unreachable = mesh->loop.now.tv_sec; return true; @@ -604,8 +652,8 @@ void close_network_connections(meshlink_handle_t *mesh) { for(int i = 0; i < mesh->listen_sockets; i++) { io_del(&mesh->loop, &mesh->listen_socket[i].tcp); io_del(&mesh->loop, &mesh->listen_socket[i].udp); - close(mesh->listen_socket[i].tcp.fd); - close(mesh->listen_socket[i].udp.fd); + closesocket(mesh->listen_socket[i].tcp.fd); + closesocket(mesh->listen_socket[i].udp.fd); } exit_requests(mesh);