]> git.meshlink.io Git - meshlink/blob - test/channels.c
Merge branch 'everbase' into discovery
[meshlink] / test / channels.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include "meshlink.h"
7
8 volatile bool bar_reachable = false;
9 volatile bool bar_responded = false;
10
11 void status_cb(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
12         if(!strcmp(node->name, "bar"))
13                 bar_reachable = reachable;
14 }
15
16 void foo_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
17         if(len == 5 && !memcmp(data, "Hello", 5))
18                 bar_responded = true;
19 }
20
21 void bar_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
22         // Echo the data back.
23         meshlink_channel_send(mesh, channel, data, len);
24 }
25
26 bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, meshlink_node_t *node, uint16_t port, const void *data, size_t len) {
27         if(port != 7)
28                 return false;
29         meshlink_set_channel_receive_cb(mesh, channel, bar_receive_cb);
30         if(data)
31                 bar_receive_cb(mesh, channel, data, len);
32         return true;
33 }
34
35 int main(int argc, char *argv[]) {
36         // Open two new meshlink instance.
37
38         meshlink_handle_t *mesh1 = meshlink_open("channels_conf.1", "foo", "channels");
39         if(!mesh1) {
40                 fprintf(stderr, "Could not initialize configuration for foo\n");
41                 return 1;
42         }
43
44         meshlink_handle_t *mesh2 = meshlink_open("channels_conf.2", "bar", "channels");
45         if(!mesh2) {
46                 fprintf(stderr, "Could not initialize configuration for bar\n");
47                 return 1;
48         }
49
50         // Import and export both side's data
51
52         meshlink_add_address(mesh1, "localhost");
53         meshlink_add_address(mesh2, "localhost");
54
55         char *data = meshlink_export(mesh1);
56         if(!data) {
57                 fprintf(stderr, "Foo could not export its configuration\n");
58                 return 1;
59         }
60
61         if(!meshlink_import(mesh2, data)) {
62                 fprintf(stderr, "Bar could not import foo's configuration\n");
63                 return 1;
64         }
65
66         free(data);
67
68         data = meshlink_export(mesh2);
69         if(!data) {
70                 fprintf(stderr, "Bar could not export its configuration\n");
71                 return 1;
72         }
73
74
75         if(!meshlink_import(mesh1, data)) {
76                 fprintf(stderr, "Foo could not import bar's configuration\n");
77                 return 1;
78         }
79
80         free(data);
81
82         // Set the channel accept callback on bar.
83         
84         meshlink_set_channel_accept_cb(mesh2, accept_cb);
85
86         // Start both instances
87
88         meshlink_set_node_status_cb(mesh1, status_cb);
89         
90         if(!meshlink_start(mesh1)) {
91                 fprintf(stderr, "Foo could not start\n");
92                 return 1;
93         }
94
95         if(!meshlink_start(mesh2)) {
96                 fprintf(stderr, "Bar could not start\n");
97                 return 1;
98         }
99
100         // Wait for the two to connect.
101
102         for(int i = 0; i < 20; i++) {
103                 sleep(1);
104                 if(bar_reachable)
105                         break;
106         }
107
108         if(!bar_reachable) {
109                 fprintf(stderr, "Bar not reachable for foo after 20 seconds\n");
110                 return 1;
111         }
112
113         // Open a channel from foo to bar.
114         
115         meshlink_node_t *bar = meshlink_get_node(mesh1, "bar");
116         if(!bar) {
117                 fprintf(stderr, "Foo could not find bar\n");
118                 return 1;
119         }
120
121         meshlink_channel_t *channel = meshlink_channel_open(mesh1, bar, 7, foo_receive_cb, "Hello", 5);
122
123         for(int i = 0; i < 5; i++) {
124                 sleep(1);
125                 if(bar_responded)
126                         break;
127         }
128
129         if(!bar_responded) {
130                 fprintf(stderr, "Bar did not respond to foo's channel message\n");
131                 return 1;
132         }
133
134         meshlink_channel_close(mesh1, channel);
135
136         // Clean up.
137
138         meshlink_stop(mesh2);
139         meshlink_stop(mesh1);
140         meshlink_close(mesh2);
141         meshlink_close(mesh1);
142
143         return 0;
144 }