network: add support for configuring extra peers via a separate json file
[project/unetd.git] / network.c
index 15429ad0591228c8ea8059ed72cf33475af22f22..48b0716c04ca3156ed9564cff2945f034ee3fbba 100644 (file)
--- a/network.c
+++ b/network.c
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2022 Felix Fietkau <nbd@nbd.name>
  */
+#define _GNU_SOURCE
 #include <arpa/inet.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -54,6 +55,7 @@ const struct blobmsg_policy network_policy[__NETWORK_ATTR_MAX] = {
        [NETWORK_ATTR_UPDATE_CMD] = { "update-cmd", BLOBMSG_TYPE_STRING },
        [NETWORK_ATTR_TUNNELS] = { "tunnels", BLOBMSG_TYPE_TABLE },
        [NETWORK_ATTR_AUTH_CONNECT] = { "auth_connect", BLOBMSG_TYPE_ARRAY },
+       [NETWORK_ATTR_PEER_DATA] = { "peer_data", BLOBMSG_TYPE_ARRAY },
 };
 
 AVL_TREE(networks, avl_strcmp, false, NULL);
@@ -127,7 +129,9 @@ static int network_load_dynamic(struct network *net)
        FILE *f = NULL;
        int ret = -1;
 
-       asprintf(&fname, "%s/%s.bin", data_dir, network_name(net));
+       if (asprintf(&fname, "%s/%s.bin", data_dir, network_name(net)) < 0)
+               return -1;
+
        f = fopen(fname, "r");
        free(fname);
 
@@ -174,7 +178,9 @@ int network_save_dynamic(struct network *net)
            !net->net_data_len)
                return -1;
 
-       asprintf(&fname, "%s/%s.bin.XXXXXXXX", data_dir, network_name(net));
+       if (asprintf(&fname, "%s/%s.bin.XXXXXXXX", data_dir, network_name(net)) < 0)
+               return -1;
+
        fd = mkstemp(fname);
        if (fd < 0)
                goto error;
@@ -436,9 +442,11 @@ static int network_setup(struct network *net)
 
 static void network_teardown(struct network *net)
 {
+       uloop_timeout_cancel(&net->connect_timer);
        uloop_timeout_cancel(&net->reload_timer);
        network_do_update(net, false);
        network_pex_close(net);
+       network_pex_free(net);
        network_hosts_free(net);
        network_services_free(net);
        wg_cleanup_network(net);
@@ -530,6 +538,10 @@ network_set_config(struct network *net, struct blob_attr *config)
            blobmsg_check_array(cur, BLOBMSG_TYPE_STRING) > 0)
                net->config.auth_connect = cur;
 
+       if ((cur = tb[NETWORK_ATTR_PEER_DATA]) != NULL &&
+           blobmsg_check_array(cur, BLOBMSG_TYPE_STRING) > 0)
+               net->config.peer_data = cur;
+
        if ((cur = tb[NETWORK_ATTR_KEY]) == NULL)
                goto invalid;