]> git.lizzy.rs Git - dragonnet.git/commitdiff
Initial peer implementation
authorHimbeerserverDE <himbeerserverde@gmail.com>
Sun, 3 Oct 2021 14:04:37 +0000 (16:04 +0200)
committerHimbeerserverDE <himbeerserverde@gmail.com>
Sun, 3 Oct 2021 14:04:37 +0000 (16:04 +0200)
listen.c
peer.c

index 440f889f944f0aecd8f12ae15aeccf4b5ae843b2..b5049242890fe5267a053c0cedac1cd47e680d5f 100644 (file)
--- a/listen.c
+++ b/listen.c
@@ -23,9 +23,7 @@ static DragonnetPeer *dragonnet_peer_accept(int sock, struct sockaddr_in6 addr,
        p->laddr = l->laddr;
        p->raddr = dragonnet_addr_parse_sock(addr);
 
-       if (p != NULL)
-               pthread_rwlock_unlock(p->mu);
-
+       pthread_rwlock_unlock(p->mu);
        return p;
 }
 
diff --git a/peer.c b/peer.c
index 3506767d2b43609f30eeac7d73a7d6eb97ff4bec..9a6d57b318339d074c81ceaec37422470c60c78c 100644 (file)
--- a/peer.c
+++ b/peer.c
@@ -1,16 +1,54 @@
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
 #include "peer.h"
 
 DragonnetPeer *dragonnet_connect(char *addr)
 {
-       return NULL;
+       DragonnetPeer *p = malloc(sizeof *p);
+       p->mu = malloc(sizeof *p->mu);
+       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);
+
+       struct sockaddr_in6 sock_addr = dragonnet_addr_sock(p->raddr);
+       if (connect(p->sock, (const struct sockaddr *) &sock_addr, sizeof sock_addr) < 0) {
+               perror("connect");
+               dragonnet_peer_delete(p);
+               return NULL;
+       }
+
+       struct sockaddr_in6 sock_name;
+       socklen_t sock_namelen = sizeof sock_name;
+
+       if (getsockname(p->sock, (struct sockaddr *) &sock_name, &sock_namelen) < 0) {
+               perror("getsockname");
+               dragonnet_peer_delete(p);
+               return NULL;
+       }
+
+       p->laddr = dragonnet_addr_parse_sock(sock_name);
+
+       pthread_rwlock_unlock(p->mu);
+       return p;
 }
 
 void dragonnet_peer_close(DragonnetPeer *p)
 {
-       
+       pthread_rwlock_wrlock(p->mu);
+
+       assert(p->state == DRAGONNET_PEER_ACTIVE);
+       shutdown(p->sock, SHUT_RDWR);
+       p->state++;
+
+       pthread_rwlock_unlock(p->mu);
 }
 
 void dragonnet_peer_delete(DragonnetPeer *p)
 {
-       
+       pthread_rwlock_destroy(p->mu);
+       free(p);
 }