]> git.lizzy.rs Git - dragonnet.git/blob - recv.c
Support nested types
[dragonnet.git] / recv.c
1 #include <stdio.h>
2 #include <unistd.h>
3
4 #include <dragonnet/recv.h>
5
6 void dragonnet_recv_raw(DragonnetPeer *p, void *buf, size_t n)
7 {
8         pthread_rwlock_rdlock(&p->mu);
9         int sock = p->sock;
10         pthread_rwlock_unlock(&p->mu);
11
12         ssize_t len = recv(sock, buf, n, MSG_WAITALL);
13         if (len < 0) {
14                 perror("recv");
15                 dragonnet_peer_delete(p);
16                 return;
17         }
18
19         // Connection closed
20         if (len == 0) {
21                 pthread_rwlock_wrlock(&p->mu);
22
23                 close(p->sock);
24                 p->sock = -1;
25                 p->state++;
26
27                 pthread_rwlock_unlock(&p->mu);
28         }
29 }