]> git.lizzy.rs Git - dragonnet.git/blob - peer.c
Change asprintf include header
[dragonnet.git] / peer.c
1 #include <assert.h>
2 #include <dragonnet/peer.h>
3 #include <dragonnet/recv.h>
4 #include <dragonnet/recv_thread.h>
5 #include <stdbool.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
10 {
11         pthread_mutex_init(&p->mtx, NULL);
12
13         p->sock = socket(AF_INET6, SOCK_STREAM, 0);
14         p->raddr = dragonnet_addr_parse_str(addr);
15         p->on_disconnect = NULL;
16         p->on_recv = NULL;
17         p->on_recv_type = calloc(sizeof *p->on_recv_type, dragonnet_num_types);
18
19         struct sockaddr_in6 sock_addr = dragonnet_addr_sock(p->raddr);
20         if (connect(p->sock, (const struct sockaddr *) &sock_addr,
21                         sizeof sock_addr) < 0) {
22                 perror("connect");
23                 return false;
24         }
25
26         struct sockaddr_in6 sock_name;
27         socklen_t sock_namelen = sizeof sock_name;
28
29         if (getsockname(p->sock, (struct sockaddr *) &sock_name, &sock_namelen) < 0) {
30                 perror("getsockname");
31                 return false;
32         }
33
34         p->laddr = dragonnet_addr_parse_sock(sock_name);
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                 pthread_mutex_destroy(&p->mtx);
43                 free(p);
44                 return NULL;
45         }
46
47         return p;
48 }
49
50 void dragonnet_peer_run(DragonnetPeer *p)
51 {
52         pthread_create(&p->recv_thread, NULL, &dragonnet_peer_recv_thread, p);
53 }
54
55 void dragonnet_peer_shutdown(DragonnetPeer *p)
56 {
57         shutdown(p->sock, SHUT_RDWR);
58 }