X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_setup.c;h=96be9df37d87b6be2610436cf845e5c1ec32b2cb;hb=e25370c54e78fda0a7996b008f7ad68aa80f2ccd;hp=a2c441417b8e988b78118fbab1daa8b029726614;hpb=80d7a91d86f8cde7b1a550ef18ae7b84e2236ab6;p=meshlink diff --git a/src/net_setup.c b/src/net_setup.c index a2c44141..96be9df3 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -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; } + n->devclass = _DEV_CLASS_MAX; exit: exit_configuration(&config_tree); @@ -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)); @@ -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; @@ -293,7 +293,7 @@ static bool add_listen_address(meshlink_handle_t *mesh, char *address, bool bind int udp_fd = setup_vpn_in_socket(mesh, (sockaddr_t *) aip->ai_addr); - if(tcp_fd < 0) { + if(udp_fd < 0) { close(tcp_fd); continue; } @@ -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;