static int check_port(meshlink_handle_t *mesh) {
for(int i = 0; i < 1000; i++) {
- int port = 0x1000 + (rand() & 0x7fff);
+ int port = 0x1000 + prng(mesh, 0x8000);
if(try_bind(port)) {
free(mesh->myport);
mesh->log_cb = global_log_cb;
mesh->log_level = global_log_level;
+ randomize(&mesh->prng_state, sizeof(mesh->prng_state));
+
memcpy(mesh->dev_class_traits, default_class_traits, sizeof(default_class_traits));
if(usingname) {
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) {
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;
}
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;
}
void handle_network_change(meshlink_handle_t *mesh, bool online) {
(void)online;
- if(!mesh->connections) {
+ if(!mesh->connections || !mesh->loop.running) {
return;
}
static void __attribute__((constructor)) meshlink_init(void) {
crypto_init();
- unsigned int seed;
- randomize(&seed, sizeof(seed));
- srand(seed);
}
static void __attribute__((destructor)) meshlink_exit(void) {