]> git.lizzy.rs Git - dragonnet.git/blob - send.c
Add number (de)serialization
[dragonnet.git] / send.c
1 #include <errno.h>
2 #include <stdio.h>
3
4 #include <dragonnet/send.h>
5
6 static void snd(DragonnetPeer *p, bool confirm, const 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 = send(sock, buf, n, MSG_NOSIGNAL | (confirm ? 0 : MSG_MORE));
13         if (len < 0) {
14                 if (errno == EPIPE) {
15                         dragonnet_peer_close(p);
16                         return;
17                 }
18
19                 perror("send");
20                 dragonnet_peer_delete(p);
21         }
22 }
23
24 void send_u8(DragonnetPeer *p, bool confirm, u8 v)
25 {
26         snd(p, confirm, &v, sizeof v);
27 }
28
29 void send_s8(DragonnetPeer *p, bool confirm, s8 v)
30 {
31         send_u8(p, confirm, (u8) v);
32 }
33
34 void send_u16(DragonnetPeer *p, bool confirm, u16 v)
35 {
36         u16 be = htobe16(v);
37         snd(p, confirm, &be, sizeof be);
38 }
39
40 void send_s16(DragonnetPeer *p, bool confirm, s16 v)
41 {
42         send_u16(p, confirm, (u16) v);
43 }
44
45 void send_u32(DragonnetPeer *p, bool confirm, u32 v)
46 {
47         u32 be = htobe32(v);
48         snd(p, confirm, &be, sizeof be);
49 }
50
51 void send_s32(DragonnetPeer *p, bool confirm, s32 v)
52 {
53         send_u32(p, confirm, (u32) v);
54 }
55
56 void send_u64(DragonnetPeer *p, bool confirm, u64 v)
57 {
58         u64 be = htobe64(v);
59         snd(p, confirm, &be, sizeof be);
60 }
61
62 void send_s64(DragonnetPeer *p, bool confirm, s64 v)
63 {
64         send_u64(p, confirm, (u64) v);
65 }
66
67 void send_f32(DragonnetPeer *p, bool confirm, f32 v)
68 {
69         send_u32(p, confirm, (u32) v);
70 }
71
72 void send_f64(DragonnetPeer *p, bool confirm, f64 v)
73 {
74         send_u64(p, confirm, (u64) v);
75 }