Enable and fix many extra warnings supported by GCC and Clang.
[tinc] / src / protocol.c
index 1ca24e5..3539ca7 100644 (file)
@@ -1,7 +1,7 @@
 /*
     protocol.c -- handle the meta-protocol, basic functions
     Copyright (C) 1999-2005 Ivo Timmermans,
-                  2000-2013 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2022 Guus Sliepen <guus@tinc-vpn.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
 
 #include "conf.h"
 #include "connection.h"
+#include "crypto.h"
 #include "logger.h"
 #include "meta.h"
 #include "protocol.h"
@@ -48,7 +49,7 @@ static bool (*request_handlers[])(connection_t *, const char *) = {
 
 /* Request names */
 
-static char (*request_name[]) = {
+static const char (*request_name[]) = {
        "ID", "METAKEY", "CHALLENGE", "CHAL_REPLY", "ACK",
        "STATUS", "ERROR", "TERMREQ",
        "PING", "PONG",
@@ -57,7 +58,19 @@ static char (*request_name[]) = {
        "REQ_PUBKEY", "ANS_PUBKEY", "SPTPS_PACKET", "UDP_INFO", "MTU_INFO",
 };
 
-static splay_tree_t *past_request_tree;
+static int past_request_compare(const past_request_t *a, const past_request_t *b) {
+       return strcmp(a->request, b->request);
+}
+
+static void free_past_request(past_request_t *r) {
+       free((char *)r->request);
+       free(r);
+}
+
+static splay_tree_t past_request_tree = {
+       .compare = (splay_compare_t) past_request_compare,
+       .delete = (splay_action_t) free_past_request,
+};
 
 /* Generic request routines - takes care of logging and error
    detection as well */
@@ -104,7 +117,7 @@ void forward_request(connection_t *from, const char *request) {
        logger(DEBUG_META, LOG_DEBUG, "Forwarding %s from %s (%s): %s", request_name[atoi(request)], from->name, from->hostname, request);
 
        // Create a temporary newline-terminated copy of the request
-       int len = strlen(request);
+       size_t len = strlen(request);
        char tmp[len + 1];
        memcpy(tmp, request, len);
        tmp[len] = '\n';
@@ -160,27 +173,15 @@ bool receive_request(connection_t *c, const char *request) {
        return true;
 }
 
-static int past_request_compare(const past_request_t *a, const past_request_t *b) {
-       return strcmp(a->request, b->request);
-}
-
-static void free_past_request(past_request_t *r) {
-       if(r->request) {
-               free((char *)r->request);
-       }
-
-       free(r);
-}
-
 static timeout_t past_request_timeout;
 
 static void age_past_requests(void *data) {
        (void)data;
        int left = 0, deleted = 0;
 
-       for splay_each(past_request_t, p, past_request_tree) {
+       for splay_each(past_request_t, p, &past_request_tree) {
                if(p->firstseen + pinginterval <= now.tv_sec) {
-                       splay_delete_node(past_request_tree, node), deleted++;
+                       splay_delete_node(&past_request_tree, node), deleted++;
                } else {
                        left++;
                }
@@ -192,7 +193,7 @@ static void age_past_requests(void *data) {
 
        if(left)
                timeout_set(&past_request_timeout, &(struct timeval) {
-               10, rand() % 100000
+               10, jitter()
        });
 }
 
@@ -201,27 +202,23 @@ bool seen_request(const char *request) {
 
        p.request = request;
 
-       if(splay_search(past_request_tree, &p)) {
+       if(splay_search(&past_request_tree, &p)) {
                logger(DEBUG_SCARY_THINGS, LOG_DEBUG, "Already seen request");
                return true;
        } else {
                new = xmalloc(sizeof(*new));
                new->request = xstrdup(request);
                new->firstseen = now.tv_sec;
-               splay_insert(past_request_tree, new);
+               splay_insert(&past_request_tree, new);
                timeout_add(&past_request_timeout, age_past_requests, NULL, &(struct timeval) {
-                       10, rand() % 100000
+                       10, jitter()
                });
                return false;
        }
 }
 
-void init_requests(void) {
-       past_request_tree = splay_alloc_tree((splay_compare_t) past_request_compare, (splay_action_t) free_past_request);
-}
-
 void exit_requests(void) {
-       splay_delete_tree(past_request_tree);
+       splay_empty_tree(&past_request_tree);
 
        timeout_del(&past_request_timeout);
 }