From 9589c63acacbc31945e4e12ba9a8ad9d67a5c946 Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Sun, 3 Oct 2021 18:45:31 +0200 Subject: [PATCH] Make peer initialisation error handling less reptitive --- listen.c | 21 +++++++++++++++------ peer.c | 27 +++++++++++++++++---------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/listen.c b/listen.c index 60644dd..662958f 100644 --- a/listen.c +++ b/listen.c @@ -11,10 +11,9 @@ // Peer // ---- -static DragonnetPeer *dragonnet_peer_accept(int sock, struct sockaddr_in6 addr, - DragonnetListener *l) +static bool dragonnet_peer_init_accepted(DragonnetPeer *p, int sock, + struct sockaddr_in6 addr, DragonnetListener *l) { - DragonnetPeer *p = malloc(sizeof *p); p->mu = malloc(sizeof *p->mu); pthread_rwlock_init(p->mu, NULL); pthread_rwlock_wrlock(p->mu); @@ -26,18 +25,28 @@ static DragonnetPeer *dragonnet_peer_accept(int sock, struct sockaddr_in6 addr, if (setsockopt(p->sock, SOL_SOCKET, SO_RCVTIMEO, &dragonnet_timeout, sizeof dragonnet_timeout) < 0) { perror("setsockopt"); - dragonnet_peer_delete(p); - return NULL; + return false; } if (setsockopt(p->sock, SOL_SOCKET, SO_SNDTIMEO, &dragonnet_timeout, sizeof dragonnet_timeout) < 0) { perror("setsockopt"); + return false; + } + + pthread_rwlock_unlock(p->mu); + return true; +} + +static DragonnetPeer *dragonnet_peer_accept(int sock, struct sockaddr_in6 addr, + DragonnetListener *l) +{ + DragonnetPeer *p = malloc(sizeof *p); + if (!dragonnet_peer_init_accepted(p, sock, addr, l)) { dragonnet_peer_delete(p); return NULL; } - pthread_rwlock_unlock(p->mu); return p; } diff --git a/peer.c b/peer.c index 3dfa03a..ab73641 100644 --- a/peer.c +++ b/peer.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -10,9 +11,8 @@ const struct timeval dragonnet_timeout = { .tv_usec = 0 }; -DragonnetPeer *dragonnet_connect(char *addr) +static bool dragonnet_peer_init(DragonnetPeer *p, char *addr) { - DragonnetPeer *p = malloc(sizeof *p); p->mu = malloc(sizeof *p->mu); pthread_rwlock_init(p->mu, NULL); pthread_rwlock_wrlock(p->mu); @@ -23,23 +23,20 @@ DragonnetPeer *dragonnet_connect(char *addr) if (setsockopt(p->sock, SOL_SOCKET, SO_RCVTIMEO, &dragonnet_timeout, sizeof dragonnet_timeout) < 0) { perror("setsockopt"); - dragonnet_peer_delete(p); - return NULL; + return false; } if (setsockopt(p->sock, SOL_SOCKET, SO_SNDTIMEO, &dragonnet_timeout, sizeof dragonnet_timeout) < 0) { perror("setsockopt"); - dragonnet_peer_delete(p); - return NULL; + return false; } 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; + return false; } struct sockaddr_in6 sock_name; @@ -47,13 +44,23 @@ DragonnetPeer *dragonnet_connect(char *addr) if (getsockname(p->sock, (struct sockaddr *) &sock_name, &sock_namelen) < 0) { perror("getsockname"); - dragonnet_peer_delete(p); - return NULL; + return false; } p->laddr = dragonnet_addr_parse_sock(sock_name); pthread_rwlock_unlock(p->mu); + return true; +} + +DragonnetPeer *dragonnet_connect(char *addr) +{ + DragonnetPeer *p = malloc(sizeof *p); + if (!dragonnet_peer_init(p, addr)) { + dragonnet_peer_delete(p); + return NULL; + } + return p; } -- 2.44.0