]> git.lizzy.rs Git - dragonnet.git/blob - peer.c
Change warning format
[dragonnet.git] / peer.c
1 #include <assert.h>
2 #include <dragonnet/addr.h>
3 #include <dragonnet/peer.h>
4 #include <dragonnet/recv.h>
5 #include <dragonnet/recv_thread.h>
6 #include <stdbool.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
11 {
12         pthread_mutex_init(&p->mtx, NULL);
13
14         struct addrinfo *info = dragonnet_str2addr(addr);
15         if (!info)
16                 return false;
17
18         p->sock = socket(info->ai_family, info->ai_socktype, info->ai_protocol);
19         p->address = dragonnet_addr2str(info->ai_addr, info->ai_addrlen);
20
21         if (connect(p->sock, info->ai_addr, info->ai_addrlen) < 0) {
22                 freeaddrinfo(info);
23                 perror("connect");
24                 return false;
25         }
26
27         freeaddrinfo(info);
28
29         p->on_disconnect = NULL;
30         p->on_recv = NULL;
31         p->on_recv_type = calloc(sizeof *p->on_recv_type, dragonnet_num_types); // fixme: memory leak
32
33         return true;
34 }
35
36 DragonnetPeer *dragonnet_connect(char *addr)
37 {
38         DragonnetPeer *p = malloc(sizeof *p);
39         if (!dragonnet_peer_init(p, addr)) {
40                 pthread_mutex_destroy(&p->mtx);
41                 free(p);
42                 return NULL;
43         }
44
45         return p;
46 }
47
48 void dragonnet_peer_run(DragonnetPeer *p)
49 {
50         pthread_create(&p->recv_thread, NULL, &dragonnet_peer_recv_thread, p);
51 }
52
53 void dragonnet_peer_shutdown(DragonnetPeer *p)
54 {
55         shutdown(p->sock, SHUT_RDWR);
56 }