]> git.meshlink.io Git - meshlink/blob - test/channels.c
Fix potential NULL pointer dereference.
[meshlink] / test / channels.c
1 #ifdef NDEBUG
2 #undef NDEBUG
3 #endif
4
5 #include <stdio.h>
6 #include <unistd.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <sys/time.h>
10 #include <assert.h>
11
12 #include "utils.h"
13 #include "../src/meshlink.h"
14
15 static struct sync_flag b_responded;
16
17 static void a_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
18         (void)mesh;
19         (void)channel;
20
21         printf("a_receive_cb %zu: ", len);
22         fwrite(data, 1, len, stdout);
23         printf("\n");
24
25         if(len == 5 && !memcmp(data, "Hello", 5)) {
26                 set_sync_flag(&b_responded, true);
27         }
28 }
29
30 static void b_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
31         printf("b_receive_cb %zu: ", len);
32         fwrite(data, 1, len, stdout);
33         printf("\n");
34         // Echo the data back.
35         assert(meshlink_channel_send(mesh, channel, data, len) == (ssize_t)len);
36 }
37
38 static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) {
39         printf("accept_cb: (from %s on port %u) ", channel->node->name, (unsigned int)port);
40
41         if(data) {
42                 fwrite(data, 1, len, stdout);
43         }
44
45         printf("\n");
46
47         if(port != 7) {
48                 return false;
49         }
50
51         meshlink_set_channel_receive_cb(mesh, channel, b_receive_cb);
52
53         if(data) {
54                 b_receive_cb(mesh, channel, data, len);
55         }
56
57         return true;
58 }
59
60 static void poll_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t len) {
61         (void)len;
62
63         meshlink_set_channel_poll_cb(mesh, channel, NULL);
64
65         assert(meshlink_channel_send(mesh, channel, "Hello", 5) == 5);
66 }
67
68 int main(void) {
69         init_sync_flag(&b_responded);
70
71         meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
72
73         // Open two new meshlink instance.
74
75         meshlink_handle_t *mesh_a, *mesh_b;
76         open_meshlink_pair(&mesh_a, &mesh_b, "channels");
77
78         // Set the callbacks.
79
80         meshlink_set_channel_accept_cb(mesh_b, accept_cb);
81
82         // Start both instances
83
84         start_meshlink_pair(mesh_a, mesh_b);
85
86         // Open a channel from a to b.
87
88         meshlink_node_t *b = meshlink_get_node(mesh_a, "b");
89         assert(b);
90
91         meshlink_channel_t *channel = meshlink_channel_open(mesh_a, b, 7, a_receive_cb, NULL, 0);
92         assert(channel);
93
94         meshlink_set_channel_poll_cb(mesh_a, channel, poll_cb);
95         assert(wait_sync_flag(&b_responded, 20));
96
97         meshlink_channel_close(mesh_a, channel);
98
99         // Clean up.
100
101         close_meshlink_pair(mesh_a, mesh_b);
102 }