]> git.meshlink.io Git - meshlink/commitdiff
Merge branch 'meshlink_blacklist2'
authorGuus Sliepen <guus@meshlink.io>
Sun, 25 May 2014 18:51:02 +0000 (20:51 +0200)
committerGuus Sliepen <guus@meshlink.io>
Sun, 25 May 2014 18:51:02 +0000 (20:51 +0200)
src/crypto.c
src/ed25519/seed.c
src/event.c
src/event.h
src/meshlink.c
src/meshlink.h
src/meshlink_internal.h
src/net_socket.c

index cf000c8a0824f855a1f6e6815603e00500c6ed33..2e2fa5386555c02b1e8c5632ee597c6c52bd513d 100644 (file)
@@ -23,6 +23,8 @@
 
 //TODO: use a strict random source once to seed a PRNG?
 
+#ifndef HAVE_MINGW
+
 static int random_fd = -1;
 
 void crypto_init(void) {
@@ -36,11 +38,30 @@ void crypto_init(void) {
 }
 
 void crypto_exit(void) {
+       close(random_fd);
+}
+
+#else
+
+#include <wincrypt.h>
+HCRYPTPROV prov;
+
+void crypto_init(void) {
+       if(!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
+               fprintf(stderr, "CryptAcquireContext() failed!\n");
+               abort();
+       }
+}
+
+void crypto_exit(void) {
+       CryptReleaseContext(prov, 0);
 }
 
 void randomize(void *out, size_t outlen) {
-       if(read(random_fd, out, outlen) != outlen) {
-               fprintf(stderr, "Error reading random numbers: %s\n", strerror(errno));
+       if(!CryptGenRandom(prov, outlen, out)) {
+               fprintf(stderr, "CryptGenRandom() failed\n");
                abort();
        }
 }
+
+#endif
index 25e518220f742c970bf07299a32a7379ecd20c72..11a2e3ec460e22aa682b501fb171fbd3e9052891 100644 (file)
@@ -3,8 +3,8 @@
 #ifndef ED25519_NO_SEED
 
 #ifdef _WIN32
-#include <Windows.h>
-#include <Wincrypt.h>
+#include <windows.h>
+#include <wincrypt.h>
 #else
 #include <stdio.h>
 #endif
@@ -37,4 +37,4 @@ int ed25519_create_seed(unsigned char *seed) {
     return 0;
 }
 
-#endif
\ No newline at end of file
+#endif
index d23f43bb03c9df683a4ac9a967346f1b7d9aeee5..cfc6d899eead2fad4e2dddb8295c8306f975fb49 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    event.c -- I/O, timeout and signal event handling
+    event.c -- I/O and timeout event handling
     Copyright (C) 2014 Guus Sliepen <guus@meshlink.io>
 
     This program is free software; you can redistribute it and/or modify
@@ -117,49 +117,6 @@ void timeout_del(event_loop_t *loop, timeout_t *timeout) {
        timeout->tv = (struct timeval){0, 0};
 }
 
-static int signal_compare(const signal_t *a, const signal_t *b) {
-       return (int)a->signum - (int)b->signum;
-}
-
-static void signalio_handler(event_loop_t *loop, void *data, int flags) {
-       unsigned char signum;
-       if(read(loop->pipefd[0], &signum, 1) != 1)
-               return;
-
-       signal_t *sig = splay_search(&loop->signals, &((signal_t){.signum = signum}));
-       if(sig)
-               sig->cb(loop, sig->data);
-}
-
-static void pipe_init(event_loop_t *loop) {
-       if(!pipe(loop->pipefd))
-               io_add(loop, &loop->signalio, signalio_handler, NULL, loop->pipefd[0], IO_READ);
-}
-
-void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, uint8_t signum) {
-       if(sig->cb)
-               return;
-
-       sig->cb = cb;
-       sig->data = data;
-       sig->signum = signum;
-       sig->node.data = sig;
-
-       if(loop->pipefd[0] == -1)
-               pipe_init(loop);
-
-       if(!splay_insert_node(&loop->signals, &sig->node))
-               abort();
-}
-
-void signal_del(event_loop_t *loop, signal_t *sig) {
-       if(!sig->cb)
-               return;
-
-       splay_unlink_node(&loop->signals, &sig->node);
-       sig->cb = NULL;
-}
-
 bool event_loop_run(event_loop_t *loop) {
        loop->running = true;
 
@@ -230,9 +187,6 @@ void event_loop_stop(event_loop_t *loop) {
 void event_loop_init(event_loop_t *loop) {
        loop->ios.compare = (splay_compare_t)io_compare;
        loop->timeouts.compare = (splay_compare_t)timeout_compare;
-       loop->signals.compare = (splay_compare_t)signal_compare;
-       loop->pipefd[0] = -1;
-       loop->pipefd[1] = -1;
        gettimeofday(&loop->now, NULL);
 }
 
@@ -241,6 +195,4 @@ void event_loop_exit(event_loop_t *loop) {
                splay_free_node(&loop->ios, node);
        for splay_each(timeout_t, timeout, &loop->timeouts)
                splay_free_node(&loop->timeouts, node);
-       for splay_each(signal_t, signal, &loop->signals)
-               splay_free_node(&loop->signals, node);
 }
index fa21bd0f7f4d2e64a158fa3e95dee2c4855c9d44..90a5905654629c4fcd71ae858cbc6c56cfc5c466 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    event.h -- I/O, timeout and signal event handling
+    event.h -- I/O and timeout event handling
     Copyright (C) 2014 Guus Sliepen <guus@meshlink.io>
 
     This program is free software; you can redistribute it and/or modify
@@ -29,7 +29,6 @@ typedef struct event_loop_t event_loop_t;
 
 typedef void (*io_cb_t)(event_loop_t *loop, void *data, int flags);
 typedef void (*timeout_cb_t)(event_loop_t *loop, void *data);
-typedef void (*signal_cb_t)(event_loop_t *loop, void *data);
 
 typedef struct io_t {
        int fd;
@@ -46,13 +45,6 @@ typedef struct timeout_t {
        struct splay_node_t node;
 } timeout_t;
 
-typedef struct signal_t {
-       int signum;
-       signal_cb_t cb;
-       void *data;
-       struct splay_node_t node;
-} signal_t;
-
 struct event_loop_t {
        fd_set readfds;
        fd_set writefds;
@@ -62,10 +54,6 @@ struct event_loop_t {
        
        splay_tree_t ios;
        splay_tree_t timeouts;
-       splay_tree_t signals;
-
-       io_t signalio;
-       int pipefd[2];
 
        void *data;
 };
@@ -78,10 +66,6 @@ extern void timeout_add(event_loop_t *loop, timeout_t *timeout, timeout_cb_t cb,
 extern void timeout_del(event_loop_t *loop, timeout_t *timeout);
 extern void timeout_set(event_loop_t *loop, timeout_t *timeout, struct timeval *tv);
 
-extern void signal_add(event_loop_t *loop, signal_t *sig, signal_cb_t cb, void *data, uint8_t signum);
-extern void signal_trigger(event_loop_t *loop, signal_t *sig);
-extern void signal_del(event_loop_t *loop, signal_t *sig);
-
 extern void event_loop_init(event_loop_t *loop);
 extern void event_loop_exit(event_loop_t *loop);
 extern bool event_loop_run(event_loop_t *loop);
index 816f77abe630540d7f3f2724be887d505c0cd4e0..cd5b5642538a97ef441995bba9dca5c26e634e99 100644 (file)
@@ -40,6 +40,9 @@ typedef struct {
 #include "xalloc.h"
 #include "ed25519/sha512.h"
 
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
 
 //TODO: this can go away completely
 const var_t variables[] = {
@@ -794,6 +797,11 @@ meshlink_handle_t *meshlink_open(const char *confbase, const char *name) {
        if(!read_server_config(mesh))
                return meshlink_close(mesh), NULL;
 
+#ifdef HAVE_MINGW
+       struct WSAData wsa_state;
+       WSAStartup(MAKEWORD(2, 2), &wsa_state);
+#endif
+
        // Setup up everything
        // TODO: we should not open listening sockets yet
 
@@ -849,6 +857,10 @@ void meshlink_close(meshlink_handle_t *mesh) {
 
        exit_configuration(&mesh->config);
        event_loop_exit(&mesh->loop);
+
+#ifdef HAVE_MINGW
+       WSACleanup();
+#endif
 }
 
 void meshlink_set_receive_cb(meshlink_handle_t *mesh, meshlink_receive_cb_t cb) {
index 86d2587cfc13bbb0ca4ec5040aa4ad8f1a12bf85..fdf0896e3e51786612ff47b5f61529786bc8c981 100644 (file)
 #include <stdbool.h>
 #include <stddef.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /// A handle for an instance of MeshLink.
 typedef struct meshlink_handle meshlink_handle_t;
 
@@ -294,4 +298,8 @@ extern bool meshlink_import(meshlink_handle_t *mesh, const char *data);
  */
 extern void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif // MESHLINK_H
index 7976a55a7bb21a6be21c683b0e8b317df9dce895..ca2e0bc5c4904bf32931375dcd7d8c4356f0e240 100644 (file)
@@ -29,6 +29,8 @@
 #include "sockaddr.h"
 #include "sptps.h"
 
+#include <pthread.h>
+
 #define MAXSOCKETS 8    /* Probably overkill... */
 
 typedef struct listen_socket_t {
index 2ddf837b0a357589df87b280ccb9c512dfa6880b..7b6c493baeb30cc84935479a95d5e62e87a644f3 100644 (file)
@@ -58,13 +58,13 @@ static void configure_tcp(connection_t *c) {
 #endif
 
 #if defined(SOL_TCP) && defined(TCP_NODELAY)
-       option = 1;
-       setsockopt(c->socket, SOL_TCP, TCP_NODELAY, (void *)&option, sizeof option);
+       int nodelay = 1;
+       setsockopt(c->socket, SOL_TCP, TCP_NODELAY, (void *)&nodelay, sizeof nodelay);
 #endif
 
 #if defined(SOL_IP) && defined(IP_TOS) && defined(IPTOS_LOWDELAY)
-       option = IPTOS_LOWDELAY;
-       setsockopt(c->socket, SOL_IP, IP_TOS, (void *)&option, sizeof option);
+       int lowdelay = IPTOS_LOWDELAY;
+       setsockopt(c->socket, SOL_IP, IP_TOS, (void *)&lowdelay, sizeof lowdelay);
 #endif
 }