]> git.lizzy.rs Git - dragonnet.git/blob - recv.c
927602068a78c736d24f50a0ad551fe2640255a1
[dragonnet.git] / recv.c
1 #include <dragonnet/recv.h>
2
3 static void rcv(DragonnetPeer *p, const void *buf, size_t n)
4 {
5         pthread_rwlock_rdlock(&p->mu);
6         int sock = p->sock;
7         pthread_rwlock_unlock(&p->mu);
8
9         ssize_t len = recv(sock, buf, n, MSG_WAITALL);
10         if (len < 0) {
11                 perror("recv");
12                 dragonnet_peer_delete(p);
13                 return;
14         }
15
16         // Connection closed
17         if (len == 0) {
18                 pthread_rwlock_wrlock(&p->mu);
19
20                 close(p->sock);
21                 p->sock = -1;
22                 p->state++;
23
24                 pthread_rwlock_unlock(&p->mu);
25         }
26 }
27
28 u8 recv_u8(DragonnetPeer *p)
29 {
30         u8 v;
31         rcv(p, &v, sizeof v);
32         return v;
33 }
34
35 s8 recv_s8(DragonnetPeer *p)
36 {
37         return (s8) recv_u8(p);
38 }
39
40 u16 recv_u16(DragonnetPeer *p)
41 {
42         u16 be;
43         rcv(p, &be, sizeof be);
44         return be16toh(be);
45 }
46
47 s16 recv_s16(DragonnetPeer *p)
48 {
49         return (s16) recv_u16(p);
50 }
51
52 u32 recv_u32(DragonnetPeer *p)
53 {
54         u32 be;
55         rcv(p, &be, sizeof be);
56         return be32toh(be);
57 }
58
59 s32 recv_s32(DragonnetPeer *p)
60 {
61         return (s32) recv_u32(p);
62 }
63
64 u64 recv_u64(DragonnetPeer *p)
65 {
66         u64 be;
67         rcv(p, &be, sizeof be);
68         return be64toh(be);
69 }
70
71 s64 recv_s64(DragonnetPeer *p)
72 {
73         return (s64) recv_u64(p);
74 }
75
76 f32 recv_f32(DragonnetPeer *p)
77 {
78         return (f32) recv_u32(p);
79 }
80
81 f64 recv_f64(DragonnetPeer *p)
82 {
83         return (f64) recv_u64(p);
84 }