]> git.meshlink.io Git - meshlink/blobdiff - examples/chat.c
Never automatically try to bind to ports >= 32768.
[meshlink] / examples / chat.c
index 7cf5a4808919d4ab7f65811352f447b7b698a4e1..88fe127a1df25368512078c89868a0dddc2336c6 100644 (file)
@@ -5,17 +5,22 @@
 #include "../src/meshlink.h"
 
 static void log_message(meshlink_handle_t *mesh, meshlink_log_level_t level, const char *text) {
-       const char *levelstr[] = {
+       (void)mesh;
+
+       static const char *levelstr[] = {
                [MESHLINK_DEBUG] = "\x1b[34mDEBUG",
                [MESHLINK_INFO] = "\x1b[32mINFO",
                [MESHLINK_WARNING] = "\x1b[33mWARNING",
                [MESHLINK_ERROR] = "\x1b[31mERROR",
                [MESHLINK_CRITICAL] = "\x1b[31mCRITICAL",
        };
+
        fprintf(stderr, "%s:\x1b[0m %s\n", levelstr[level], text);
 }
 
 static void receive(meshlink_handle_t *mesh, meshlink_node_t *source, const void *data, size_t len) {
+       (void)mesh;
+
        const char *msg = data;
 
        if(!len || msg[len - 1]) {
@@ -27,6 +32,8 @@ static void receive(meshlink_handle_t *mesh, meshlink_node_t *source, const void
 }
 
 static void node_status(meshlink_handle_t *mesh, meshlink_node_t *node, bool reachable) {
+       (void)mesh;
+
        if(reachable) {
                printf("%s joined.\n", node->name);
        } else {
@@ -52,7 +59,7 @@ static void parse_command(meshlink_handle_t *mesh, char *buf) {
                        return;
                }
 
-               invitation = meshlink_invite(mesh, arg);
+               invitation = meshlink_invite(mesh, NULL, arg);
 
                if(!invitation) {
                        fprintf(stderr, "Could not invite '%s': %s\n", arg, meshlink_strerror(meshlink_errno));
@@ -92,9 +99,31 @@ static void parse_command(meshlink_handle_t *mesh, char *buf) {
                        return;
                }
 
-               meshlink_blacklist(mesh, node);
+               if(!meshlink_blacklist(mesh, node)) {
+                       fprintf(stderr, "Error blacklising '%s': %s", arg, meshlink_strerror(meshlink_errno));
+                       return;
+               }
 
                printf("Node '%s' blacklisted.\n", arg);
+       } else if(!strcasecmp(buf, "whitelist")) {
+               if(!arg) {
+                       fprintf(stderr, "/whitelist requires an argument!\n");
+                       return;
+               }
+
+               meshlink_node_t *node = meshlink_get_node(mesh, arg);
+
+               if(!node) {
+                       fprintf(stderr, "Error looking up '%s': %s\n", arg, meshlink_strerror(meshlink_errno));
+                       return;
+               }
+
+               if(!meshlink_whitelist(mesh, node)) {
+                       fprintf(stderr, "Error whitelising '%s': %s", arg, meshlink_strerror(meshlink_errno));
+                       return;
+               }
+
+               printf("Node '%s' whitelisted.\n", arg);
        } else if(!strcasecmp(buf, "who")) {
                if(!arg) {
                        nodes = meshlink_get_all_nodes(mesh, nodes, &nnodes);
@@ -104,7 +133,7 @@ static void parse_command(meshlink_handle_t *mesh, char *buf) {
                        } else {
                                printf("%zu known nodes:", nnodes);
 
-                               for(int i = 0; i < nnodes; i++) {
+                               for(size_t i = 0; i < nnodes; i++) {
                                        printf(" %s", nodes[i]->name);
                                }
 
@@ -166,7 +195,8 @@ static void parse_input(meshlink_handle_t *mesh, char *buf) {
        // Commands start with '/'
 
        if(*buf == '/') {
-               return parse_command(mesh, buf + 1);
+               parse_command(mesh, buf + 1);
+               return;
        }
 
        // Lines in the form "name: message..." set the destination node.