]> git.meshlink.io Git - meshlink/blob - test/channels.c
Allow meshlink_open() to be called with a NULL name.
[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 reject_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) {
39         (void)mesh;
40         (void)channel;
41         (void)port;
42         (void)data;
43         (void)len;
44
45         return false;
46 }
47
48 static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) {
49         printf("accept_cb: (from %s on port %u) ", channel->node->name, (unsigned int)port);
50
51         if(data) {
52                 fwrite(data, 1, len, stdout);
53         }
54
55         printf("\n");
56
57         if(port != 7) {
58                 return false;
59         }
60
61         meshlink_set_channel_receive_cb(mesh, channel, b_receive_cb);
62
63         if(data) {
64                 b_receive_cb(mesh, channel, data, len);
65         }
66
67         return true;
68 }
69
70 static void poll_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t len) {
71         (void)len;
72
73         meshlink_set_channel_poll_cb(mesh, channel, NULL);
74
75         assert(meshlink_channel_send(mesh, channel, "Hello", 5) == 5);
76 }
77
78 int main() {
79         meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_cb);
80
81         // Open two new meshlink instance.
82
83         meshlink_handle_t *mesh_a, *mesh_b;
84         open_meshlink_pair(&mesh_a, &mesh_b, "channels");
85
86         // Set the callbacks.
87
88         meshlink_set_channel_accept_cb(mesh_a, reject_cb);
89         meshlink_set_channel_accept_cb(mesh_b, accept_cb);
90
91         // Start both instances
92
93         start_meshlink_pair(mesh_a, mesh_b);
94
95         // Open a channel from a to b.
96
97         meshlink_node_t *b = meshlink_get_node(mesh_a, "b");
98         assert(b);
99
100         meshlink_channel_t *channel = meshlink_channel_open(mesh_a, b, 7, a_receive_cb, NULL, 0);
101         assert(channel);
102
103         meshlink_set_channel_poll_cb(mesh_a, channel, poll_cb);
104         assert(wait_sync_flag(&b_responded, 20));
105
106         meshlink_channel_close(mesh_a, channel);
107
108         // Clean up.
109
110         close_meshlink_pair(mesh_a, mesh_b);
111 }