From 127ad2411af8290f1ff6014e2cdf07baccf7a9fb Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Sun, 3 Oct 2021 16:04:37 +0200 Subject: [PATCH] Initial peer implementation --- listen.c | 4 +--- peer.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/listen.c b/listen.c index 440f889..b504924 100644 --- 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 3506767..9a6d57b 100644 --- a/peer.c +++ b/peer.c @@ -1,16 +1,54 @@ +#include +#include +#include + #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); } -- 2.44.0