X-Git-Url: http://git.meshlink.io/?p=meshlink;a=blobdiff_plain;f=src%2Fgraph.c;h=e6d70afa3f9742bf9e264dbc04ed6cf915d080b5;hp=5bf6361e737417865a07252c672fdfc9b4bff817;hb=6eaefb4dbce240334e35f67d9f3db5d4f44e49c9;hpb=50ad3f2a895c38f8d546f87490ca96ab7d9e011e diff --git a/src/graph.c b/src/graph.c index 5bf6361e..e6d70afa 100644 --- a/src/graph.c +++ b/src/graph.c @@ -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) { +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}); }