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