#include "node.h"
#include "protocol.h"
#include "route.h"
+#include "sockaddr.h"
#include "utils.h"
#include "xalloc.h"
#include "ed25519/sha512.h"
// Stop discovery
discovery_stop(mesh);
- // Shut down a listening socket to signal the main thread to shut down
+ pthread_mutex_lock(&(mesh->mesh_mutex));
+ logger(mesh, MESHLINK_DEBUG, "meshlink_stop called\n");
+
+ // Shut down the main thread
+ event_loop_stop(&mesh->loop);
+ // Fake a connection to kick the event loop
listen_socket_t *s = &mesh->listen_socket[0];
- shutdown(s->tcp.fd, SHUT_RDWR);
+ int fd = socket(s->sa.sa.sa_family, SOCK_STREAM, IPPROTO_TCP);
+ connect(fd, &s->sa.sa, SALEN(s->sa.sa));
+ close(fd);
// Wait for the main thread to finish
pthread_mutex_unlock(&(mesh->mesh_mutex));
mesh->threadstarted = false;
- // Fix the socket
-
- closesocket(s->tcp.fd);
- io_del(&mesh->loop, &s->tcp);
- s->tcp.fd = setup_listen_socket(&s->sa);
- if(s->tcp.fd < 0)
- logger(mesh, MESHLINK_ERROR, "Could not repair listenen socket!");
- else
- io_add(&mesh->loop, &s->tcp, handle_new_meta_connection, s, s->tcp.fd, IO_READ);
-
pthread_mutex_unlock(&(mesh->mesh_mutex));
}