]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Avoid casting function pointers.
[meshlink] / src / meshlink.c
index 8ed946268b44aa58e3c79345ecd2e4547e8e273a..5940c70e8e54fdac55e32c3d27e93a6a4bd7eb6c 100644 (file)
@@ -1604,6 +1604,12 @@ void meshlink_close(meshlink_handle_t *mesh) {
                close(mesh->netns);
        }
 
+       for(vpn_packet_t *packet; (packet = meshlink_queue_pop(&mesh->outpacketqueue));) {
+               free(packet);
+       }
+
+       meshlink_queue_exit(&mesh->outpacketqueue);
+
        free(mesh->name);
        free(mesh->appname);
        free(mesh->confbase);
@@ -1767,8 +1773,9 @@ bool meshlink_send(meshlink_handle_t *mesh, meshlink_node_t *destination, const
        return true;
 }
 
-void meshlink_send_from_queue(event_loop_t *loop, meshlink_handle_t *mesh) {
+void meshlink_send_from_queue(event_loop_t *loop, void *data) {
        (void)loop;
+       meshlink_handle_t *mesh = data;
        vpn_packet_t *packet = meshlink_queue_pop(&mesh->outpacketqueue);
 
        if(!packet) {
@@ -1778,6 +1785,8 @@ void meshlink_send_from_queue(event_loop_t *loop, meshlink_handle_t *mesh) {
        mesh->self->in_packets++;
        mesh->self->in_bytes += packet->len;
        route(mesh, mesh->self, packet);
+
+       free(packet);
 }
 
 ssize_t meshlink_get_pmtu(meshlink_handle_t *mesh, meshlink_node_t *destination) {
@@ -1849,6 +1858,11 @@ meshlink_node_t *meshlink_get_node(meshlink_handle_t *mesh, const char *name) {
        pthread_mutex_lock(&(mesh->mesh_mutex));
        node = (meshlink_node_t *)lookup_node(mesh, (char *)name); // TODO: make lookup_node() use const
        pthread_mutex_unlock(&(mesh->mesh_mutex));
+
+       if(!node) {
+               meshlink_errno = MESHLINK_ENOENT;
+       }
+
        return node;
 }
 
@@ -1863,6 +1877,11 @@ meshlink_submesh_t *meshlink_get_submesh(meshlink_handle_t *mesh, const char *na
        pthread_mutex_lock(&(mesh->mesh_mutex));
        submesh = (meshlink_submesh_t *)lookup_submesh(mesh, name);
        pthread_mutex_unlock(&(mesh->mesh_mutex));
+
+       if(!submesh) {
+               meshlink_errno = MESHLINK_ENOENT;
+       }
+
        return submesh;
 }
 
@@ -3494,7 +3513,7 @@ void meshlink_set_dev_class_timeouts(meshlink_handle_t *mesh, dev_class_t devcla
 void handle_network_change(meshlink_handle_t *mesh, bool online) {
        (void)online;
 
-       if(!mesh->connections) {
+       if(!mesh->connections || !mesh->loop.running) {
                return;
        }