]> git.lizzy.rs Git - dragonnet.git/blobdiff - peer.c
Use inline functions
[dragonnet.git] / peer.c
diff --git a/peer.c b/peer.c
index a1bb39d76e861d198698849fabcd0a8c1c47f354..83e91226cbde496a59f2a0157cfde976d1da6765 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -1,19 +1,19 @@
 #include <assert.h>
+#include <dragonnet/peer.h>
+#include <dragonnet/recv.h>
+#include <dragonnet/recv_thread.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "peer.h"
-#include "recv_thread.h"
-
-static bool dragonnet_peer_init(DragonnetPeer *p, char *addr, void (*on_recv_type)(struct dragonnet_peer *, u16))
+static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
 {
        pthread_rwlock_init(&p->mu, NULL);
        pthread_rwlock_wrlock(&p->mu);
 
        p->sock = socket(AF_INET6, SOCK_STREAM, 0);
        p->raddr = dragonnet_addr_parse_str(addr);
-       p->on_recv_type = on_recv_type;
+       p->on_recv_type = calloc(sizeof *p->on_recv_type, dragonnet_num_types);
 
        struct sockaddr_in6 sock_addr = dragonnet_addr_sock(p->raddr);
        if (connect(p->sock, (const struct sockaddr *) &sock_addr,
@@ -36,10 +36,10 @@ static bool dragonnet_peer_init(DragonnetPeer *p, char *addr, void (*on_recv_typ
        return true;
 }
 
-DragonnetPeer *dragonnet_connect(char *addr, void (*on_recv_type)(struct dragonnet_peer *, u16))
+DragonnetPeer *dragonnet_connect(char *addr)
 {
        DragonnetPeer *p = malloc(sizeof *p);
-       if (!dragonnet_peer_init(p, addr, on_recv_type)) {
+       if (!dragonnet_peer_init(p, addr)) {
                dragonnet_peer_delete(p);
                return NULL;
        }
@@ -47,6 +47,21 @@ DragonnetPeer *dragonnet_connect(char *addr, void (*on_recv_type)(struct dragonn
        return p;
 }
 
+void dragonnet_peer_set_recv_hook(DragonnetPeer *p, u16 type_id,
+               void (*on_recv)(struct dragonnet_peer *, void *))
+{
+       pthread_rwlock_rdlock(&p->mu);
+       DragonnetPeerState state = p->state;
+       pthread_rwlock_unlock(&p->mu);
+
+       if (state >= DRAGONNET_PEER_ACTIVE)
+               return;
+
+       pthread_rwlock_wrlock(&p->mu);
+       p->on_recv_type[type_id] = on_recv;
+       pthread_rwlock_unlock(&p->mu);
+}
+
 void dragonnet_peer_run(DragonnetPeer *p)
 {
        pthread_rwlock_wrlock(&p->mu);