X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink.c;h=30b386846a7322e261a1b0f4888331773352fe0c;hb=529b8fab8c21e7ae5af91d742ff202eab38e51f3;hp=fdc6fed874460271a5fe810722871238a8352cc3;hpb=560c1f1e838e78ba9e95b8b86f0a2dbcd0506efb;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index fdc6fed8..30b38684 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -612,7 +612,7 @@ static bool finalize_join(meshlink_handle_t *mesh, const void *buf, uint16_t len } // Write host config files - while(count--) { + for(uint32_t i = 0; i < count; i++) { const void *data; uint32_t len = packmsg_get_bin_raw(&in, &data); @@ -655,11 +655,24 @@ static bool finalize_join(meshlink_handle_t *mesh, const void *buf, uint16_t len return false; } - node_add(mesh, n); + if(i == 0) { + /* The first host config file is of the inviter itself; + * remember the address we are currently using for the invitation connection. + */ + sockaddr_t sa; + socklen_t salen = sizeof(sa); - if(!config_write(mesh, "current", n->name, &config, mesh->config_key)) { + if(getpeername(mesh->sock, &sa.sa, &salen) == 0) { + node_add_recent_address(mesh, n, &sa); + } + } + + if(!node_write_config(mesh, n)) { + free_node(n); return false; } + + node_add(mesh, n); } /* Ensure the configuration directory metadata is on disk */ @@ -3794,6 +3807,22 @@ void meshlink_set_dev_class_timeouts(meshlink_handle_t *mesh, dev_class_t devcla pthread_mutex_unlock(&mesh->mutex); } +void meshlink_set_dev_class_fast_retry_period(meshlink_handle_t *mesh, dev_class_t devclass, int fast_retry_period) { + if(!mesh || devclass < 0 || devclass >= DEV_CLASS_COUNT) { + meshlink_errno = EINVAL; + return; + } + + if(fast_retry_period < 0) { + meshlink_errno = EINVAL; + return; + } + + pthread_mutex_lock(&mesh->mutex); + mesh->dev_class_traits[devclass].fast_retry_period = fast_retry_period; + pthread_mutex_unlock(&mesh->mutex); +} + void handle_network_change(meshlink_handle_t *mesh, bool online) { (void)online;