X-Git-Url: http://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fgraph.c;h=e6d70afa3f9742bf9e264dbc04ed6cf915d080b5;hb=636200d1a2024982fe5b3062153daa72a8253015;hp=c04cef40e01e48cc8fc67471e6c4c51a903a915f;hpb=f02d3ed3e135b5326003e7f69f8331ff6a3cc219;p=tinc diff --git a/src/graph.c b/src/graph.c index c04cef40..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" @@ -64,7 +64,7 @@ */ void mst_kruskal(void) { - avl_node_t *node, *next; + splay_node_t *node, *next; edge_t *e; node_t *n; connection_t *c; @@ -147,7 +147,7 @@ void mst_kruskal(void) { */ void sssp_bfs(void) { - avl_node_t *node, *next, *to; + splay_node_t *node, *next, *to; edge_t *e; node_t *n; list_t *todo_list; @@ -223,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); @@ -233,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; @@ -265,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; @@ -313,66 +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; + + return 0; } void graph(void) { - static struct event ev; - sssp_bfs(); mst_kruskal(); - - if(!timeout_initialized(&ev)) - timeout_set(&ev, dump_graph, NULL); - event_add(&ev, &(struct timeval){5, 0}); }