X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_setup.c;h=37644c44ab6226237d9ce944f447cc57426bd884;hb=f79cc0e0bba16a3aa42a5fa13098cda714623205;hp=8cfacc3a89188c4660f24a7b458bf23e721ba465;hpb=5fd6e63a29b332c1779353d22fc3917fc725eb25;p=meshlink diff --git a/src/net_setup.c b/src/net_setup.c index 8cfacc3a..37644c44 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -1,6 +1,6 @@ /* net_setup.c -- Setup. - Copyright (C) 2014 Guus Sliepen + Copyright (C) 2014-2017 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -82,7 +82,7 @@ bool read_ecdsa_private_key(meshlink_handle_t *mesh) { FILE *fp; char filename[PATH_MAX]; - snprintf(filename,PATH_MAX, "%s" SLASH "ecdsa_key.priv", mesh->confbase); + snprintf(filename, PATH_MAX, "%s" SLASH "ecdsa_key.priv", mesh->confbase); fp = fopen(filename, "rb"); if(!fp) { @@ -108,7 +108,7 @@ static bool read_invitation_key(meshlink_handle_t *mesh) { mesh->invitation_key = NULL; } - snprintf(filename,PATH_MAX, "%s" SLASH "invitations" SLASH "ecdsa_key.priv", mesh->confbase); + snprintf(filename, PATH_MAX, "%s" SLASH "invitations" SLASH "ecdsa_key.priv", mesh->confbase); fp = fopen(filename, "rb"); @@ -123,7 +123,7 @@ static bool read_invitation_key(meshlink_handle_t *mesh) { } bool node_read_devclass(meshlink_handle_t *mesh, node_t *n) { - + splay_tree_t *config_tree; char *p; @@ -131,14 +131,13 @@ bool node_read_devclass(meshlink_handle_t *mesh, node_t *n) { if(!read_host_config(mesh, config_tree, n->name)) goto exit; - if(get_config_string(lookup_config(config_tree, "DeviceClass"), &p)) - { + if(get_config_string(lookup_config(config_tree, "DeviceClass"), &p)) { n->devclass = atoi(p); free(p); } - if(n->devclass < 0 || n->devclass > _DEV_CLASS_MAX) - { n->devclass = _DEV_CLASS_MAX; } + if((int)n->devclass < 0 || n->devclass > _DEV_CLASS_MAX) + n->devclass = _DEV_CLASS_MAX; exit: exit_configuration(&config_tree); @@ -147,7 +146,7 @@ exit: bool node_write_devclass(meshlink_handle_t *mesh, node_t *n) { - if(n->devclass < 0 || n->devclass > _DEV_CLASS_MAX) + if((int)n->devclass < 0 || n->devclass > _DEV_CLASS_MAX) return false; bool result = false; @@ -158,10 +157,9 @@ bool node_write_devclass(meshlink_handle_t *mesh, node_t *n) { // ignore read errors; in case the file does not exist we will create it read_host_config(mesh, config_tree, n->name); - config_t* cnf = lookup_config(config_tree, "DeviceClass"); + config_t *cnf = lookup_config(config_tree, "DeviceClass"); - if(!cnf) - { + if(!cnf) { cnf = new_config(); cnf->variable = xstrdup("DeviceClass"); config_add(config_tree, cnf); @@ -184,7 +182,7 @@ void load_all_nodes(meshlink_handle_t *mesh) { struct dirent *ent; char dname[PATH_MAX]; - snprintf(dname,PATH_MAX, "%s" SLASH "hosts", mesh->confbase); + snprintf(dname, PATH_MAX, "%s" SLASH "hosts", mesh->confbase); dir = opendir(dname); if(!dir) { logger(mesh, MESHLINK_ERROR, "Could not open %s: %s", dname, strerror(errno)); @@ -254,7 +252,7 @@ static bool add_listen_address(meshlink_handle_t *mesh, char *address, bool bind *address = 0; } - struct addrinfo *ai, hint = {0}; + struct addrinfo *ai, hint = {}; hint.ai_family = addressfamily; hint.ai_socktype = SOCK_STREAM; hint.ai_protocol = IPPROTO_TCP; @@ -268,6 +266,8 @@ static bool add_listen_address(meshlink_handle_t *mesh, char *address, bool bind return false; } + bool success = false; + for(struct addrinfo *aip = ai; aip; aip = aip->ai_next) { // Ignore duplicate addresses bool found = false; @@ -310,10 +310,11 @@ static bool add_listen_address(meshlink_handle_t *mesh, char *address, bool bind mesh->listen_socket[mesh->listen_sockets].bindto = bindto; memcpy(&mesh->listen_socket[mesh->listen_sockets].sa, aip->ai_addr, aip->ai_addrlen); mesh->listen_sockets++; + success = true; } freeaddrinfo(ai); - return true; + return success; } /* @@ -390,17 +391,24 @@ bool setup_myself(meshlink_handle_t *mesh) { mesh->listen_sockets = 0; - if(!add_listen_address(mesh, address, NULL)) - return false; + if(!add_listen_address(mesh, address, NULL)) { + if(strcmp(mesh->myport, "0")) { + logger(mesh, MESHLINK_INFO, "Could not bind to port %s, asking OS to choose one for us", mesh->myport); + free(mesh->myport); + mesh->myport = strdup("0"); + if(!mesh->myport) + return false; + if(!add_listen_address(mesh, address, NULL)) + return false; + } else + return false; + } if(!mesh->listen_sockets) { logger(mesh, MESHLINK_ERROR, "Unable to create any listening socket!"); return false; } - xasprintf(&mesh->self->hostname, "MYSELF port %s", mesh->myport); - mesh->self->connection->hostname = xstrdup(mesh->self->hostname); - /* Done. */ mesh->last_config_check = mesh->loop.now.tv_sec;