aboutsummaryrefslogtreecommitdiff
path: root/server_network.c
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-06-10 04:45:33 -0400
committerTest_User <hax@andrewyu.org>2024-06-10 04:45:33 -0400
commit0bc78fc2d38c2ed79eb0e990c08aee9474f7ae60 (patch)
treec29bec6561aba396c7769d6f7e236dc2877bd338 /server_network.c
parent525b2239812c815bf414d948e09c70f6b6ea2d31 (diff)
downloadhaxircd-0bc78fc2d38c2ed79eb0e990c08aee9474f7ae60.tar.gz
haxircd-0bc78fc2d38c2ed79eb0e990c08aee9474f7ae60.zip
Basic server tracking added
Diffstat (limited to 'server_network.c')
-rw-r--r--server_network.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/server_network.c b/server_network.c
index 5046bab..c193a54 100644
--- a/server_network.c
+++ b/server_network.c
@@ -29,6 +29,7 @@
#include <arpa/inet.h>
#include <pthread.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include "config.h"
@@ -52,6 +53,25 @@ int init_server_network(void) {
}
}
+ server_list.array = malloc(0);
+
+ struct server_info *own_info;
+ own_info = malloc(sizeof(*own_info));
+ own_info->sid.data = malloc(SID.len);
+ if (!own_info->sid.data)
+ return 1;
+ memcpy(own_info->sid.data, SID.data, SID.len);
+ own_info->sid.len = SID.len;
+
+ own_info->next = SID;
+ own_info->connected_to = (struct table){.array = malloc(0), .len = 0};
+ own_info->user_list = (struct table){.array = malloc(0), .len = 0};
+ own_info->distance = 0;
+ own_info->net = 0;
+ own_info->protocol = 0;
+ if (set_table_index(&server_list, SID, own_info) != 0)
+ return 1;
+
return 0;
}
@@ -168,3 +188,81 @@ void * server_accept_thread(void *type) {
}
}
}
+
+int add_server(struct string attached_to, struct string sid, struct string name, struct string fullname, size_t protocol, size_t net) {
+ struct server_info *attached = get_table_index(server_list, attached_to);
+ if (!attached)
+ return 1;
+
+ if (has_table_index(server_list, sid))
+ return 1;
+
+ struct server_info *new_info;
+ new_info = malloc(sizeof(*new_info));
+ if (!new_info)
+ return 1;
+
+ new_info->protocol = protocol;
+ new_info->net = net;
+
+ new_info->sid.data = malloc(sid.len);
+ if (!new_info->sid.data)
+ goto add_server_free_new_info;
+ memcpy(new_info->sid.data, sid.data, sid.len);
+ new_info->sid.len = sid.len;
+
+ // new_info->next shares string with sid of the server it points to
+
+ new_info->connected_to = (struct table){.array = malloc(0), .len = 0};
+ if (set_table_index(&(new_info->connected_to), attached_to, attached) != 0)
+ goto add_server_free_connected_to;
+
+ if (set_table_index(&(attached->connected_to), sid, new_info) != 0)
+ goto add_server_clear_connected_to;
+
+ new_info->user_list = (struct table){.array = malloc(0), .len = 0};
+
+ protocols[protocol].update_propagations();
+
+ if (set_table_index(&(server_list), sid, new_info) != 0)
+ goto add_server_remove_attached_connected_to;
+
+ return 0;
+
+ add_server_remove_attached_connected_to:
+ remove_table_index(&(attached->connected_to), sid);
+ add_server_clear_connected_to:
+ clear_table(&(new_info->connected_to));
+ add_server_free_connected_to:
+ free(new_info->connected_to.array);
+ free(new_info->sid.data);
+ add_server_free_new_info:
+ free(new_info);
+ return 1;
+}
+
+void free_server(struct server_info *server) {
+ free(server->sid.data);
+ clear_table(&(server->connected_to));
+ free(server->connected_to.array);
+ clear_table(&(server->user_list));
+ free(server->user_list.array);
+
+ free(server);
+}
+
+void update_all_propagations(void) {
+#ifdef USE_HAXIRCD_PROTOCOL
+ protocols[HAXIRCD_PROTOCOL].update_propagations();
+#endif
+#ifdef USE_INSPIRCD2_PROTOCOL
+ protocols[INSPIRCD2_PROTOCOL].update_propagations();
+#endif
+}
+
+void unlink_server(struct server_info *a, struct server_info *b, size_t protocol) {
+ if (!has_table_index(a->connected_to, b->sid))
+ return;
+
+ protocols[protocol].do_unlink(a, b);
+}