X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fgraph.c;h=e6d70afa3f9742bf9e264dbc04ed6cf915d080b5;hb=6eaefb4dbce240334e35f67d9f3db5d4f44e49c9;hp=958947721f4446a4d2fd3eebf6dfbb5cb593e92c;hpb=531d5a904a3a91bca8b7d373fb6ab2869b31e7fa;p=tinc diff --git a/src/graph.c b/src/graph.c index 95894772..e6d70afa 100644 --- a/src/graph.c +++ b/src/graph.c @@ -46,7 +46,7 @@ #include "system.h" -#include "avl_tree.h" +#include "splay_tree.h" #include "config.h" #include "connection.h" #include "device.h" @@ -63,9 +63,8 @@ Please note that sorting on weight is already done by add_edge(). */ -void mst_kruskal(void) -{ - avl_node_t *node, *next; +void mst_kruskal(void) { + splay_node_t *node, *next; edge_t *e; node_t *n; connection_t *c; @@ -147,9 +146,8 @@ void mst_kruskal(void) Running time: O(E) */ -void sssp_bfs(void) -{ - avl_node_t *node, *next, *to; +void sssp_bfs(void) { + splay_node_t *node, *next, *to; edge_t *e; node_t *n; list_t *todo_list; @@ -225,7 +223,7 @@ void sssp_bfs(void) e->to->options = e->options; if(sockaddrcmp(&e->to->address, &e->address)) { - node = avl_unlink(node_udp_tree, e->to); + node = splay_unlink(node_udp_tree, e->to); sockaddrfree(&e->to->address); sockaddrcpy(&e->to->address, &e->address); @@ -235,7 +233,7 @@ void sssp_bfs(void) e->to->hostname = sockaddr2hostname(&e->to->address); if(node) - avl_insert_node(node_udp_tree, node); + splay_insert_node(node_udp_tree, node); if(e->to->options & OPTION_PMTU_DISCOVERY) { e->to->mtuprobes = 0; @@ -267,11 +265,11 @@ void sssp_bfs(void) if(n->status.reachable) { ifdebug(TRAFFIC) logger(LOG_DEBUG, _("Node %s (%s) became reachable"), n->name, n->hostname); - avl_insert(node_udp_tree, n); + splay_insert(node_udp_tree, n); } else { ifdebug(TRAFFIC) logger(LOG_DEBUG, _("Node %s (%s) became unreachable"), n->name, n->hostname); - avl_delete(node_udp_tree, n); + splay_delete(node_udp_tree, n); } n->status.validkey = false; @@ -315,68 +313,37 @@ void sssp_bfs(void) dot -Tpng graph_filename -o image_filename.png -Gconcentrate=true */ -static void dump_graph(int fd, short events, void *data) -{ - avl_node_t *node; +int dump_graph(struct evbuffer *out) { + splay_node_t *node; node_t *n; edge_t *e; - char *filename = NULL, *tmpname = NULL; - FILE *file; - - if(!get_config_string(lookup_config(config_tree, "GraphDumpFile"), &filename)) - return; - ifdebug(PROTOCOL) logger(LOG_NOTICE, "Dumping graph"); - - if(filename[0] == '|') { - file = popen(filename + 1, "w"); - } else { - asprintf(&tmpname, "%s.new", filename); - file = fopen(tmpname, "w"); - } - - if(!file) { - logger(LOG_ERR, "Unable to open graph dump file %s: %s", filename, strerror(errno)); - free(tmpname); - return; - } - - fprintf(file, "digraph {\n"); + if(evbuffer_add_printf(out, "digraph {\n") == -1) + return errno; /* dump all nodes first */ for(node = node_tree->head; node; node = node->next) { n = node->data; - fprintf(file, " %s [label = \"%s\"];\n", n->name, n->name); + if(evbuffer_add_printf(out, " %s [label = \"%s\"];\n", + n->name, n->name) == -1) + return errno; } /* now dump all edges */ for(node = edge_weight_tree->head; node; node = node->next) { e = node->data; - fprintf(file, " %s -> %s;\n", e->from->name, e->to->name); + if(evbuffer_add_printf(out, " %s -> %s;\n", + e->from->name, e->to->name) == -1) + return errno; } - fprintf(file, "}\n"); - - if(filename[0] == '|') { - pclose(file); - } else { - fclose(file); -#ifdef HAVE_MINGW - unlink(filename); -#endif - rename(tmpname, filename); - free(tmpname); - } -} + if(evbuffer_add_printf(out, "}\n") == -1) + return errno; -void graph(void) -{ - static struct event ev; + return 0; +} +void graph(void) { sssp_bfs(); mst_kruskal(); - - if(!timeout_initialized(&ev)) - timeout_set(&ev, dump_graph, NULL); - event_add(&ev, &(struct timeval){5, 0}); }