2 #include <dragonnet/addr.h>
3 #include <dragonnet/peer.h>
4 #include <dragonnet/recv.h>
5 #include <dragonnet/recv_thread.h>
10 static bool dragonnet_peer_init(DragonnetPeer *p, char *addr)
12 pthread_mutex_init(&p->mtx, NULL);
14 struct addrinfo *info = dragonnet_str2addr(addr);
18 p->sock = socket(info->ai_family, info->ai_socktype, info->ai_protocol);
19 p->address = dragonnet_addr2str(info->ai_addr, info->ai_addrlen);
21 if (connect(p->sock, info->ai_addr, info->ai_addrlen) < 0) {
29 p->on_disconnect = NULL;
31 p->on_recv_type = calloc(sizeof *p->on_recv_type, dragonnet_num_types); // fixme: memory leak
36 DragonnetPeer *dragonnet_connect(char *addr)
38 DragonnetPeer *p = malloc(sizeof *p);
39 if (!dragonnet_peer_init(p, addr)) {
40 pthread_mutex_destroy(&p->mtx);
48 void dragonnet_peer_run(DragonnetPeer *p)
50 pthread_create(&p->recv_thread, NULL, &dragonnet_peer_recv_thread, p);
53 void dragonnet_peer_shutdown(DragonnetPeer *p)
55 shutdown(p->sock, SHUT_RDWR);