]> git.lizzy.rs Git - dragonnet.git/blob - peer.c
Remove old timeout detection
[dragonnet.git] / peer.c
1 #include <assert.h>
2 #include <stdbool.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 #include "peer.h"
7 #include "recv_thread.h"
8
9 static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
10 {
11         pthread_rwlock_init(&p->mu, NULL);
12         pthread_rwlock_wrlock(&p->mu);
13
14         p->sock = socket(AF_INET6, SOCK_STREAM, 0);
15         p->raddr = dragonnet_addr_parse_str(addr);
16
17         struct sockaddr_in6 sock_addr = dragonnet_addr_sock(p->raddr);
18         if (connect(p->sock, (const struct sockaddr *) &sock_addr,
19                         sizeof sock_addr) < 0) {
20                 perror("connect");
21                 return false;
22         }
23
24         struct sockaddr_in6 sock_name;
25         socklen_t sock_namelen = sizeof sock_name;
26
27         if (getsockname(p->sock, (struct sockaddr *) &sock_name, &sock_namelen) < 0) {
28                 perror("getsockname");
29                 return false;
30         }
31
32         p->laddr = dragonnet_addr_parse_sock(sock_name);
33
34         pthread_rwlock_unlock(&p->mu);
35         return true;
36 }
37
38 DragonnetPeer *dragonnet_connect(char *addr)
39 {
40         DragonnetPeer *p = malloc(sizeof *p);
41         if (!dragonnet_peer_init(p, addr)) {
42                 dragonnet_peer_delete(p);
43                 return NULL;
44         }
45
46         return p;
47 }
48
49 void dragonnet_peer_run(DragonnetPeer *p)
50 {
51         pthread_t recv_thread;
52         pthread_create(&recv_thread, NULL, &dragonnet_peer_recv_thread, p);
53         pthread_join(recv_thread, NULL);
54 }
55
56 void dragonnet_peer_close(DragonnetPeer *p)
57 {
58         pthread_rwlock_wrlock(&p->mu);
59
60         if (p->state == DRAGONNET_PEER_ACTIVE) {
61                 shutdown(p->sock, SHUT_RDWR);
62                 p->state++;
63         }
64
65         pthread_rwlock_unlock(&p->mu);
66 }
67
68 void dragonnet_peer_delete(DragonnetPeer *p)
69 {
70         pthread_rwlock_destroy(&p->mu);
71         free(p);
72 }