]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Correctly update our own host config file after meshlink_set_port().
[meshlink] / src / meshlink.c
index 42573c8ffa6f68837fb1e06f3a567f0baefbdbd9..a9e1b551df18362848fc68a7b5e1f7a0f1192850 100644 (file)
@@ -575,7 +575,7 @@ static bool finalize_join(meshlink_handle_t *mesh, const void *buf, uint16_t len
 
        char *name = packmsg_get_str_dup(&in);
        packmsg_skip_element(&in); /* submesh */
-       int32_t devclass = packmsg_get_int32(&in);
+       dev_class_t devclass = packmsg_get_int32(&in);
        uint32_t count = packmsg_get_array(&in);
 
        if(!name) {
@@ -661,6 +661,11 @@ static bool finalize_join(meshlink_handle_t *mesh, const void *buf, uint16_t len
                }
        }
 
+       /* Ensure the configuration directory metadata is on disk */
+       if(!config_sync(mesh, "current")) {
+               return false;
+       }
+
        sptps_send_record(&(mesh->sptps), 1, ecdsa_get_public_key(mesh->private_key), 32);
 
        logger(mesh, MESHLINK_DEBUG, "Configuration stored in: %s\n", mesh->confbase);
@@ -890,6 +895,11 @@ static bool meshlink_setup(meshlink_handle_t *mesh) {
                return false;
        }
 
+       /* Ensure the configuration directory metadata is on disk */
+       if(!config_sync(mesh, "current")) {
+               return false;
+       }
+
        if(!main_config_lock(mesh)) {
                logger(NULL, MESHLINK_ERROR, "Cannot lock main config file\n");
                meshlink_errno = MESHLINK_ESTORAGE;
@@ -1012,7 +1022,7 @@ meshlink_open_params_t *meshlink_open_params_init(const char *confbase, const ch
                }
        }
 
-       if((int)devclass < 0 || devclass > _DEV_CLASS_MAX) {
+       if(devclass < 0 || devclass >= DEV_CLASS_COUNT) {
                logger(NULL, MESHLINK_ERROR, "Invalid devclass given!\n");
                meshlink_errno = MESHLINK_EINVAL;
                return NULL;
@@ -1150,6 +1160,14 @@ void meshlink_open_params_free(meshlink_open_params_t *params) {
        free(params);
 }
 
+/// Device class traits
+static const dev_class_traits_t default_class_traits[DEV_CLASS_COUNT] = {
+       { .pingtimeout = 5, .pinginterval = 60, .min_connects = 3, .max_connects = 10000, .edge_weight = 1 }, // DEV_CLASS_BACKBONE
+       { .pingtimeout = 5, .pinginterval = 60, .min_connects = 3, .max_connects = 100, .edge_weight = 3 },   // DEV_CLASS_STATIONARY
+       { .pingtimeout = 5, .pinginterval = 60, .min_connects = 3, .max_connects = 3, .edge_weight = 6 },     // DEV_CLASS_PORTABLE
+       { .pingtimeout = 5, .pinginterval = 60, .min_connects = 1, .max_connects = 1, .edge_weight = 9 },     // DEV_CLASS_UNKNOWN
+};
+
 meshlink_handle_t *meshlink_open(const char *confbase, const char *name, const char *appname, dev_class_t devclass) {
        if(!confbase || !*confbase) {
                logger(NULL, MESHLINK_ERROR, "No confbase given!\n");
@@ -1237,7 +1255,7 @@ meshlink_handle_t *meshlink_open_ex(const meshlink_open_params_t *params) {
                }
        }
 
-       if((int)params->devclass < 0 || params->devclass > _DEV_CLASS_MAX) {
+       if(params->devclass < 0 || params->devclass >= DEV_CLASS_COUNT) {
                logger(NULL, MESHLINK_ERROR, "Invalid devclass given!\n");
                meshlink_errno = MESHLINK_EINVAL;
                return NULL;
@@ -1261,6 +1279,10 @@ meshlink_handle_t *meshlink_open_ex(const meshlink_open_params_t *params) {
        mesh->invitation_timeout = 604800; // 1 week
        mesh->netns = params->netns;
        mesh->submeshes = NULL;
+       mesh->log_cb = global_log_cb;
+       mesh->log_level = global_log_level;
+
+       memcpy(mesh->dev_class_traits, default_class_traits, sizeof(default_class_traits));
 
        if(usingname) {
                mesh->name = xstrdup(params->name);
@@ -1919,7 +1941,7 @@ static bool search_node_by_submesh(const node_t *node, const void *condition) {
 }
 
 meshlink_node_t **meshlink_get_all_nodes_by_dev_class(meshlink_handle_t *mesh, dev_class_t devclass, meshlink_node_t **nodes, size_t *nmemb) {
-       if(!mesh || ((int)devclass < 0) || (devclass > _DEV_CLASS_MAX) || !nmemb) {
+       if(!mesh || devclass < 0 || devclass >= DEV_CLASS_COUNT || !nmemb) {
                meshlink_errno = MESHLINK_EINVAL;
                return NULL;
        }
@@ -2137,9 +2159,6 @@ bool meshlink_set_port(meshlink_handle_t *mesh, int port) {
        free(mesh->myport);
        xasprintf(&mesh->myport, "%d", port);
 
-       /* Write meshlink.conf with the updated port number */
-       write_main_config_files(mesh);
-
        /* Close down the network. This also deletes mesh->self. */
        close_network_connections(mesh);
 
@@ -2160,6 +2179,17 @@ bool meshlink_set_port(meshlink_handle_t *mesh, int port) {
                rval = true;
        }
 
+       /* Rebuild our own list of recent addresses */
+       memset(mesh->self->recent, 0, sizeof(mesh->self->recent));
+       add_local_addresses(mesh);
+
+       /* Write meshlink.conf with the updated port number */
+       write_main_config_files(mesh);
+
+       if(!config_sync(mesh, "current")) {
+               return false;
+       }
+
 done:
        pthread_mutex_unlock(&(mesh->mesh_mutex));
 
@@ -2699,6 +2729,10 @@ bool meshlink_import(meshlink_handle_t *mesh, const char *data) {
                return false;
        }
 
+       if(!config_sync(mesh, "current")) {
+               return false;
+       }
+
        return true;
 }
 
@@ -2728,6 +2762,8 @@ void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node) {
 
        n->status.blacklisted = true;
        node_write_config(mesh, n);
+       config_sync(mesh, "current");
+
        logger(mesh, MESHLINK_DEBUG, "Blacklisted %s.\n", node->name);
 
        //Immediately terminate any connections we have with the blacklisted node
@@ -2771,6 +2807,7 @@ void meshlink_whitelist(meshlink_handle_t *mesh, meshlink_node_t *node) {
 
        n->status.blacklisted = false;
        node_write_config(mesh, n);
+       config_sync(mesh, "current");
 
        pthread_mutex_unlock(&(mesh->mesh_mutex));
        return;
@@ -3383,6 +3420,23 @@ end:
 #endif
 }
 
+void meshlink_set_dev_class_timeouts(meshlink_handle_t *mesh, dev_class_t devclass, int pinginterval, int pingtimeout) {
+       if(!mesh || devclass < 0 || devclass >= DEV_CLASS_COUNT) {
+               meshlink_errno = EINVAL;
+               return;
+       }
+
+       if(pinginterval < 1 || pingtimeout < 1 || pingtimeout > pinginterval) {
+               meshlink_errno = EINVAL;
+               return;
+       }
+
+       pthread_mutex_lock(&mesh->mesh_mutex);
+       mesh->dev_class_traits[devclass].pinginterval = pinginterval;
+       mesh->dev_class_traits[devclass].pingtimeout = pingtimeout;
+       pthread_mutex_unlock(&mesh->mesh_mutex);
+}
+
 void handle_network_change(meshlink_handle_t *mesh, bool online) {
        (void)online;
 
@@ -3403,11 +3457,3 @@ static void __attribute__((constructor)) meshlink_init(void) {
 static void __attribute__((destructor)) meshlink_exit(void) {
        crypto_exit();
 }
-
-/// Device class traits
-const dev_class_traits_t dev_class_traits[_DEV_CLASS_MAX + 1] = {
-       { .min_connects = 3, .max_connects = 10000, .edge_weight = 1 }, // DEV_CLASS_BACKBONE
-       { .min_connects = 3, .max_connects = 100, .edge_weight = 3 },   // DEV_CLASS_STATIONARY
-       { .min_connects = 3, .max_connects = 3, .edge_weight = 6 },             // DEV_CLASS_PORTABLE
-       { .min_connects = 1, .max_connects = 1, .edge_weight = 9 },             // DEV_CLASS_UNKNOWN
-};