]> git.lizzy.rs Git - dragonnet.git/blob - recv.c
Fix #include order
[dragonnet.git] / recv.c
1 #include <dragonnet/recv.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <unistd.h>
6
7 void dragonnet_recv_raw(DragonnetPeer *p, void *buf, size_t n)
8 {
9         pthread_rwlock_rdlock(&p->mu);
10         int sock = p->sock;
11         pthread_rwlock_unlock(&p->mu);
12
13         ssize_t len = recv(sock, buf, n, MSG_WAITALL);
14         if (len < 0) {
15                 perror("recv");
16                 dragonnet_peer_delete(p);
17                 return;
18         }
19
20         // Connection closed
21         if (len == 0) {
22                 pthread_rwlock_wrlock(&p->mu);
23
24                 close(p->sock);
25                 p->sock = -1;
26                 p->state++;
27
28                 pthread_rwlock_unlock(&p->mu);
29         }
30 }
31
32 void dragonnet_read_raw(u8 **buf, size_t *n, void *data, size_t len)
33 {
34         memcpy(data, *buf, len);
35         memcpy(*buf, &((*buf)[len]), -len + *n);
36
37         *buf = realloc(*buf, -len + *n);
38         *n -= len;
39 }