]> git.lizzy.rs Git - dragonnet.git/blobdiff - peer.c
Set thread names using GNU extension
[dragonnet.git] / peer.c
diff --git a/peer.c b/peer.c
index ab73641f07c14df5b4597878e8f03b22e76f0f95..75eb6abe18876f5059965771e67613a3730a6d4a 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -1,36 +1,20 @@
 #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"
-
-const struct timeval dragonnet_timeout = {
-       .tv_sec = 30,
-       .tv_usec = 0
-};
-
 static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
 {
-       p->mu = malloc(sizeof *p->mu);
-       pthread_rwlock_init(p->mu, NULL);
-       pthread_rwlock_wrlock(p->mu);
+       pthread_mutex_init(&p->mtx, NULL);
 
        p->sock = socket(AF_INET6, SOCK_STREAM, 0);
        p->raddr = dragonnet_addr_parse_str(addr);
-
-       if (setsockopt(p->sock, SOL_SOCKET, SO_RCVTIMEO, &dragonnet_timeout,
-                       sizeof dragonnet_timeout) < 0) {
-               perror("setsockopt");
-               return false;
-       }
-
-       if (setsockopt(p->sock, SOL_SOCKET, SO_SNDTIMEO, &dragonnet_timeout,
-                       sizeof dragonnet_timeout) < 0) {
-               perror("setsockopt");
-               return false;
-       }
+       p->on_disconnect = NULL;
+       p->on_recv = NULL;
+       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,
@@ -48,8 +32,6 @@ static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
        }
 
        p->laddr = dragonnet_addr_parse_sock(sock_name);
-
-       pthread_rwlock_unlock(p->mu);
        return true;
 }
 
@@ -57,7 +39,8 @@ DragonnetPeer *dragonnet_connect(char *addr)
 {
        DragonnetPeer *p = malloc(sizeof *p);
        if (!dragonnet_peer_init(p, addr)) {
-               dragonnet_peer_delete(p);
+               pthread_mutex_destroy(&p->mtx);
+               free(p);
                return NULL;
        }
 
@@ -66,25 +49,10 @@ DragonnetPeer *dragonnet_connect(char *addr)
 
 void dragonnet_peer_run(DragonnetPeer *p)
 {
-       pthread_t recv_thread;
-       pthread_create(&recv_thread, NULL, &dragonnet_peer_recv_thread, p);
-       pthread_join(recv_thread, NULL);
-}
-
-void dragonnet_peer_close(DragonnetPeer *p)
-{
-       pthread_rwlock_wrlock(p->mu);
-
-       if (p->state == DRAGONNET_PEER_ACTIVE) {
-               shutdown(p->sock, SHUT_RDWR);
-               p->state++;
-       }
-
-       pthread_rwlock_unlock(p->mu);
+       pthread_create(&p->recv_thread, NULL, &dragonnet_peer_recv_thread, p);
 }
 
-void dragonnet_peer_delete(DragonnetPeer *p)
+void dragonnet_peer_shutdown(DragonnetPeer *p)
 {
-       pthread_rwlock_destroy(p->mu);
-       free(p);
+       shutdown(p->sock, SHUT_RDWR);
 }