Another file moved; random interface stuff.

This commit is contained in:
Ivo Timmermans 2002-05-02 11:50:07 +00:00
parent a77b35e748
commit 4c1a4e8a79
15 changed files with 679 additions and 135 deletions

View file

@ -1,5 +1,5 @@
## Produce this file with automake to get Makefile.in
# $Id: Makefile.am,v 1.10 2002/04/28 12:46:26 zarq Exp $
# $Id: Makefile.am,v 1.11 2002/05/02 11:50:07 zarq Exp $
SUBDIRS = pokey
@ -7,14 +7,14 @@ sbin_PROGRAMS = tincd
EXTRA_DIST = linux/device.c freebsd/device.c openbsd/device.c solaris/device.c
tincd_SOURCES = read_conf.c device.c event.c graph.c meta.c net_packet.c net_setup.c \
tincd_SOURCES = read_conf.c device.c event.c meta.c net_packet.c net_setup.c \
net_socket.c process.c protocol.c protocol_auth.c protocol_edge.c protocol_misc.c \
protocol_key.c protocol_subnet.c route.c tincd.c net.c
protocol_key.c protocol_subnet.c route.c tincd.c net.c callbacks.c
INCLUDES = @INCLUDES@ -I$(top_builddir) -I$(top_srcdir)/lib -I$(top_srcdir)/intl
noinst_HEADERS = read_conf.h device.h event.h graph.h meta.h process.h \
protocol.h route.h
noinst_HEADERS = read_conf.h device.h event.h meta.h process.h \
protocol.h route.h callbacks.h
LIBS = @LIBS@ @INTLLIBS@

View file

@ -1,290 +0,0 @@
/*
graph.c -- graph algorithms
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: graph.c,v 1.4 2002/04/28 12:46:26 zarq Exp $
*/
/* We need to generate two trees from the graph:
1. A minimum spanning tree for broadcasts,
2. A single-source shortest path tree for unicasts.
Actually, the first one alone would suffice but would make unicast packets
take longer routes than necessary.
For the MST algorithm we can choose from Prim's or Kruskal's. I personally
favour Kruskal's, because we make an extra AVL tree of edges sorted on
weights (metric). That tree only has to be updated when an edge is added or
removed, and during the MST algorithm we just have go linearly through that
tree, adding safe edges until #edges = #nodes - 1. The implementation here
however is not so fast, because I tried to avoid having to make a forest and
merge trees.
For the SSSP algorithm Dijkstra's seems to be a nice choice. Currently a
simple breadth-first search is presented here.
The SSSP algorithm will also be used to determine whether nodes are directly,
indirectly or not reachable from the source. It will also set the correct
destination address and port of a node if possible.
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(HAVE_FREEBSD) || defined(HAVE_OPENBSD)
#include <sys/param.h>
#endif
#include <netinet/in.h>
#include <avl_tree.h>
#include <utils.h>
#include "netutl.h"
#include "node.h"
#include "edge.h"
#include "connection.h"
#include "process.h"
#include "logging.h"
#include "system.h"
/* Implementation of Kruskal's algorithm.
Running time: O(EN)
Please note that sorting on weight is already done by add_edge().
*/
void mst_kruskal(void)
{
avl_node_t *node, *next;
edge_t *e;
node_t *n;
connection_t *c;
int nodes = 0;
int safe_edges = 0;
int skipped;
/* Clear MST status on connections */
for(node = connection_tree->head; node; node = node->next)
{
c = (connection_t *)node->data;
c->status.mst = 0;
}
/* Do we have something to do at all? */
if(!edge_weight_tree->head)
return;
if(debug_lvl >= DEBUG_SCARY_THINGS)
syslog(LOG_DEBUG, "Running Kruskal's algorithm:");
/* Clear visited status on nodes */
for(node = node_tree->head; node; node = node->next)
{
n = (node_t *)node->data;
n->status.visited = 0;
nodes++;
}
/* Starting point */
((edge_t *)edge_weight_tree->head->data)->from.node->status.visited = 1;
/* Add safe edges */
for(skipped = 0, node = edge_weight_tree->head; node; node = next)
{
next = node->next;
e = (edge_t *)node->data;
if(e->from.node->status.visited == e->to.node->status.visited)
{
skipped = 1;
continue;
}
e->from.node->status.visited = 1;
e->to.node->status.visited = 1;
if(e->connection)
e->connection->status.mst = 1;
safe_edges++;
if(debug_lvl >= DEBUG_SCARY_THINGS)
syslog(LOG_DEBUG, " Adding edge %s - %s weight %d", e->from.node->name, e->to.node->name, e->weight);
if(skipped)
{
next = edge_weight_tree->head;
continue;
}
}
if(debug_lvl >= DEBUG_SCARY_THINGS)
syslog(LOG_DEBUG, "Done, counted %d nodes and %d safe edges.", nodes, safe_edges);
}
/* Implementation of a simple breadth-first search algorithm.
Running time: O(E)
*/
void sssp_bfs(void)
{
avl_node_t *node, *from, *next, *to;
edge_t *e;
node_t *n;
halfconnection_t to_hc, from_hc;
avl_tree_t *todo_tree;
int indirect;
char *name;
todo_tree = avl_alloc_tree(NULL, NULL);
/* Clear visited status on nodes */
for(node = node_tree->head; node; node = node->next)
{
n = (node_t *)node->data;
n->status.visited = 0;
n->status.indirect = 1;
}
/* Begin with myself */
myself->status.visited = 1;
myself->status.indirect = 0;
myself->nexthop = myself;
myself->via = myself;
node = avl_alloc_node();
node->data = myself;
avl_insert_top(todo_tree, node);
/* Loop while todo_tree is filled */
while(todo_tree->head)
{
for(from = todo_tree->head; from; from = next) /* "from" is the node from which we start */
{
next = from->next;
n = (node_t *)from->data;
for(to = n->edge_tree->head; to; to = to->next) /* "to" is the edge connected to "from" */
{
e = (edge_t *)to->data;
if(e->from.node == n) /* "from_hc" is the halfconnection with .node == from */
to_hc = e->to, from_hc = e->from;
else
to_hc = e->from, from_hc = e->to;
/* Situation:
/
/
------(n)from_hc-----to_hc
\
\
n->address is set to the to_hc.udpaddress of the edge left of n.
We are currently examining the edge right of n:
- If from_hc.udpaddress != n->address, then to_hc.node is probably
not reachable for the nodes left of n. We do as if the indirectdata
flag is set on edge e.
- If edge e provides for better reachability of to_hc.node, update
to_hc.node and (re)add it to the todo_tree to (re)examine the reachability
of nodes behind it.
*/
indirect = n->status.indirect || e->options & OPTION_INDIRECT || ((n != myself) && sockaddrcmp(&n->address, &from_hc.udpaddress));
if(to_hc.node->status.visited && (!to_hc.node->status.indirect || indirect))
continue;
to_hc.node->status.visited = 1;
to_hc.node->status.indirect = indirect;
to_hc.node->nexthop = (n->nexthop == myself) ? to_hc.node : n->nexthop;
to_hc.node->via = indirect ? n->via : to_hc.node;
to_hc.node->options = e->options;
if(sockaddrcmp(&to_hc.node->address, &to_hc.udpaddress))
{
node = avl_unlink(node_udp_tree, to_hc.node);
to_hc.node->address = to_hc.udpaddress;
if(to_hc.node->hostname)
free(to_hc.node->hostname);
to_hc.node->hostname = sockaddr2hostname(&to_hc.udpaddress);
avl_insert_node(node_udp_tree, node);
}
node = avl_alloc_node();
node->data = to_hc.node;
avl_insert_before(todo_tree, from, node);
}
avl_delete_node(todo_tree, from);
}
}
avl_free_tree(todo_tree);
/* Check reachability status. */
for(node = node_tree->head; node; node = next)
{
next = node->next;
n = (node_t *)node->data;
if(n->status.visited)
{
if(!n->status.reachable)
{
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_DEBUG, _("Node %s (%s) became reachable"), n->name, n->hostname);
n->status.reachable = 1;
asprintf(&name, "hosts/%s-up", n->name);
execute_script(name);
free(name);
}
}
else
{
if(n->status.reachable)
{
if(debug_lvl >= DEBUG_TRAFFIC)
syslog(LOG_DEBUG, _("Node %s (%s) became unreachable"), n->name, n->hostname);
n->status.reachable = 0;
n->status.validkey = 0;
n->status.waitingforkey = 0;
n->sent_seqno = 0;
asprintf(&name, "hosts/%s-down", n->name);
execute_script(name);
free(name);
}
}
}
}
void graph(void)
{
mst_kruskal();
sssp_bfs();
}

View file

@ -1,25 +0,0 @@
/*
graph.h -- header for graph.c
Copyright (C) 2001-2002 Guus Sliepen <guus@sliepen.warande.net>,
2001-2002 Ivo Timmermans <itimmermans@bigfoot.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: graph.h,v 1.2 2002/04/09 15:26:00 zarq Exp $
*/
extern void graph(void);
extern void mst_kruskal(void);
extern void sssp_bfs(void);

View file

@ -1,18 +1,18 @@
## Produce this file with automake to get Makefile.in
# $Id: Makefile.am,v 1.2 2002/04/28 12:46:26 zarq Exp $
# $Id: Makefile.am,v 1.3 2002/05/02 11:50:07 zarq Exp $
sbin_PROGRAMS = pokey
pokey_SOURCES = event.c graph.c \
interface.c logging.c meta.c net.c net_packet.c net_setup.c net_socket.c netutl.c \
interface.c meta.c net.c net_packet.c net_setup.c net_socket.c netutl.c \
process.c protocol.c protocol_auth.c protocol_edge.c \
protocol_misc.c protocol_key.c protocol_subnet.c route.c \
pokey.c
pokey.c read_conf.c
INCLUDES = @INCLUDES@ -I$(top_builddir) -I$(top_srcdir)/lib -I$(top_srcdir)/intl -I$(top_srcdir)/src -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/include/libglade-1.0 -I/usr/include/gnome-1.0 -I/usr/include/gnome-xml -I/usr/include/libglade-1.0 -I/usr/include/gnome-1.0 -DNEED_GNOMESUPPORT_H -I/usr/lib/gnome-libs/include -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/include/orbit-1.0 -I/usr/include/gtk-1.2 -I/usr/X11R6/include
noinst_HEADERS = device.h event.h graph.h meta.h net.h netutl.h process.h \
protocol.h route.h
protocol.h route.h read_conf.h
LIBS = @LIBS@ @INTLLIBS@

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: interface.c,v 1.4 2002/04/28 12:46:26 zarq Exp $
$Id: interface.c,v 1.5 2002/05/02 11:50:07 zarq Exp $
*/
#include "config.h"
@ -50,13 +50,23 @@
#include "system.h"
extern GladeXML *xml;
/* Node tree & main window stuff */
static GladeXML *xml;
static GtkWidget *nodetree;
static GtkCTreeNode *hosts_ctn;
#ifdef MAXBUFSIZE
#undef MAXBUFSIZE
#endif
#define MAXBUFSIZE 1024
/* Graph canvas stuff */
static GladeXML *canvas_xml;
static GnomeCanvasGroup *edge_group = NULL;
static int canvas_width;
static int canvas_height;
static GtkWidget *canvas = NULL;
static int canvas_visible = 0;
int build_graph = 0;
@ -77,30 +87,30 @@ double y[MAX_NODES];
double k[MAX_NODES][MAX_NODES];
double d[MAX_NODES][MAX_NODES];
double l[MAX_NODES][MAX_NODES];
const double epsilon = 0.001;
static const double epsilon = 0.001;
static int inited = 0;
static int number_of_nodes = 0;
static GtkWidget *nodetree;
static GtkCTreeNode *hosts_ctn;
static double canvas_zoom = 1.00;
static GnomeCanvasGroup *edge_group = NULL;
static int canvas_width;
static int canvas_height;
/* Log window stuff */
#ifdef MAXBUFSIZE
#undef MAXBUFSIZE
#endif
static GtkWidget *canvas = NULL;
#define MAXBUFSIZE 1024
static int log_inited = 0;
static int follow_log = 1;
static int keep_drawing = 1;
static GtkCList *connlist = NULL;
static int log_visible = 0;
static GtkWidget *log_window = NULL;
static double canvas_zoom = 1.00;
void if_node_add(const char *hooktype, va_list ap);
void if_node_del(const char *hooktype, va_list ap);
@ -111,8 +121,19 @@ void if_edge_del(const char *hooktype, va_list ap);
void if_node_visible(const char *hooktype, va_list ap);
void if_node_invisible(const char *hooktype, va_list ap);
void if_node_create(node_t *n);
GtkWidget *create_canvas(void)
{
canvas_xml = glade_xml_new(INTERFACE_FILE, "GraphWindow");
if(!canvas_xml)
{
log(0, TLOG_ERROR,
_("Could not find widget `%s'"),
"GraphWindow");
return NULL;
}
canvas = glade_xml_get_widget(xml, "canvas1");
if(!canvas)
{
@ -120,7 +141,7 @@ GtkWidget *create_canvas(void)
return NULL;
}
gnome_canvas_set_scroll_region(GNOME_CANVAS(canvas), -00.0, -00.0, 700, 500);
gnome_canvas_set_scroll_region(GNOME_CANVAS(canvas), 0.0, 0.0, 700, 500);
canvas_width = 300.0;
canvas_height = 500.0;
@ -132,17 +153,12 @@ void log_gtk(int level, int priority, char *fmt, va_list ap)
{
char buffer1[MAXBUFSIZE];
char buffer2[MAXBUFSIZE];
GtkWidget *w;
int len;
char *p;
struct tm *tm;
time_t t;
if(!xml)
return;
w = glade_xml_get_widget(xml, "Messages");
if(!w)
if(!log_visible)
return;
/* Use vsnprintf instead of vasprintf: faster, no memory
@ -172,19 +188,19 @@ void log_gtk(int level, int priority, char *fmt, va_list ap)
}
}
gtk_text_freeze(GTK_TEXT(w));
gtk_text_freeze(GTK_TEXT(log_window));
if(log_inited)
gtk_text_insert(GTK_TEXT(w), NULL, NULL, NULL, "\n", 1);
gtk_text_insert(GTK_TEXT(log_window), NULL, NULL, NULL, "\n", 1);
gtk_text_insert(GTK_TEXT(w), NULL, &timecolor, NULL, buffer2, strlen(buffer2));
gtk_text_insert(GTK_TEXT(w), NULL, NULL, NULL, buffer1, len);
gtk_text_thaw(GTK_TEXT(w));
gtk_text_insert(GTK_TEXT(log_window), NULL, &timecolor, NULL, buffer2, strlen(buffer2));
gtk_text_insert(GTK_TEXT(log_window), NULL, NULL, NULL, buffer1, len);
gtk_text_thaw(GTK_TEXT(log_window));
log_inited = 1;
if(follow_log)
/* gtk_text_set_point(GTK_TEXT(w), -1); */
gtk_editable_set_position(GTK_EDITABLE(w), gtk_text_get_length(GTK_TEXT(w)));
gtk_editable_set_position(GTK_EDITABLE(log_window), gtk_text_get_length(GTK_TEXT(log_window)));
}
void if_hostinfoclosebutton_clicked(GtkWidget *w, gpointer data)
@ -272,7 +288,7 @@ void update_hostinfo_dialog(GladeXML *x, node_t *n)
}
}
void on_settings1_activate(GtkMenuItem *mi, gpointer data)
void on_preferences1_activate(GtkMenuItem *mi, gpointer data)
{
GtkWidget *w;
GladeXML *x;
@ -293,9 +309,7 @@ void on_settings1_activate(GtkMenuItem *mi, gpointer data)
void on_logcontext_clear_activate(GtkMenuItem *mi, gpointer data)
{
GtkWidget *l = glade_xml_get_widget(xml, "Messages");
if(!l) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "Messages"); return; }
gtk_editable_delete_text(GTK_EDITABLE(l), 0, -1); /* Delete from 0 to end of buffer */
gtk_editable_delete_text(GTK_EDITABLE(log_window), 0, -1); /* Delete from 0 to end of buffer */
log_inited = 0;
}
@ -304,6 +318,11 @@ void on_logcontext_follow_activate(GtkMenuItem *mi, gpointer data)
follow_log = !follow_log;
}
void on_logcontext_close1_activate(GtkMenuItem *mi, gpointer data)
{
}
void on_messages_button_press_event(GtkWidget *w, GdkEventButton *event, gpointer data)
{
GladeXML *x;
@ -333,7 +352,7 @@ void on_messages_button_press_event(GtkWidget *w, GdkEventButton *event, gpointe
}
}
void on_canvascontext_shuffle_activate(GtkMenuItem *mi, gpointer data)
void shuffle_nodes(void)
{
avl_node_t *avlnode;
double newx, newy;
@ -355,9 +374,23 @@ void on_canvascontext_shuffle_activate(GtkMenuItem *mi, gpointer data)
build_graph = 1;
}
void on_canvascontext_shuffle_activate(GtkMenuItem *mi, gpointer data)
{
shuffle_nodes();
}
void on_canvascontext_keep_drawing_activate(GtkMenuItem *mi, gpointer data)
{
GtkWidget *w;
keep_drawing = !keep_drawing;
/* No need to fuss with the checkbox in the menu, because that is
transient. Do need to update the checkbox at the bottom of the
window though. */
w = glade_xml_get_widget(canvas_xml, "KeepDrawingButton");
if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "KeepDrawingButton"); return; }
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), keep_drawing);
}
void on_canvascontext_minus50_activate(GtkMenuItem *mi, gpointer data)
@ -491,7 +524,7 @@ void on_exit1_activate(GtkMenuItem *mi, gpointer data)
gtk_exit(0);
}
void on_info1_activate(GtkMenuItem *mi, gpointer data)
void on_about1_activate(GtkMenuItem *mi, gpointer data)
{
GladeXML *x;
x = glade_xml_new(INTERFACE_FILE, "AboutWindow");
@ -502,6 +535,150 @@ void on_info1_activate(GtkMenuItem *mi, gpointer data)
"AboutWindow");
return;
}
glade_xml_signal_autoconnect(x);
}
void on_graph_window1_activate(GtkMenuItem *mi, gpointer data)
{
int i;
avl_node_t *avlnode;
double newx, newy;
canvas_xml = glade_xml_new(INTERFACE_FILE, "GraphWindow");
if(canvas_xml == NULL)
{
log(0, TLOG_ERROR,
_("Could not find widget `%s'"),
"GraphWindow");
return;
}
glade_xml_signal_autoconnect(canvas_xml);
canvas = glade_xml_get_widget(canvas_xml, "canvas1");
if(canvas == NULL) { log(0, TLOG_ERROR, _("Could not find widget `%s'"), "canvas1"); return; }
for(i = 0, avlnode = node_tree->head; avlnode; avlnode = avlnode->next)
{
node_t *n = (node_t*)(avlnode->data);
if(!((struct if_node_data*)(n->data))->item)
if_node_create(n);
if(!n->status.reachable)
continue;
newx = 250.0 + 200.0 * sin(i / 10.0 * M_PI);
newy = 150.0 - 100.0 * cos(i / 10.0 * M_PI);
gnome_canvas_item_move(GNOME_CANVAS_ITEM(((struct if_node_data*)(n->data))->item), newx - ((struct if_node_data*)(n->data))->x, newy - ((struct if_node_data*)(n->data))->y);
((struct if_node_data*)(n->data))->x = newx;
((struct if_node_data*)(n->data))->y = newy;
((struct if_node_data*)(n->data))->id = i;
gnome_canvas_item_show(GNOME_CANVAS_ITEM(((struct if_node_data*)(n->data))->item));
gnome_canvas_update_now(GNOME_CANVAS(canvas));
nodes[i] = n;
i++;
}
number_of_nodes = i;
inited = 0;
build_graph = 1;
canvas_visible = 1;
}
void on_log_window1_activate(GtkMenuItem *mi, gpointer data)
{
GladeXML *x;
GtkWidget *w;
x = glade_xml_new(INTERFACE_FILE, "LogWindow");
if(x == NULL)
{
log(0, TLOG_ERROR,
_("Could not find widget `%s'"),
"LogWindow");
return;
}
log_window = glade_xml_get_widget(x, "Messages");
if(!log_window)
{
log(0, TLOG_ERROR,
_("Could not find widget `%s'"),
"Messages");
return;
}
w = glade_xml_get_widget(x, "DebugLevelSpinbutton");
if(!w)
{
log(0, TLOG_ERROR,
_("Could not find widget `%s'"),
"DebugLevelSpinbutton");
return;
}
gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), (float)debug_lvl);
glade_xml_signal_autoconnect(x);
log_visible = 1;
log_add_hook(log_gtk);
log(0, TLOG_NOTICE, "Logging started.\n");
}
void on_debug_level_changed(GtkSpinButton *sb, gpointer data)
{
debug_lvl = gtk_spin_button_get_value_as_int(sb);
}
void on_logwindow_close_clicked(GtkButton *b, gpointer data)
{
GladeXML *x;
GtkWidget *w;
x = glade_xml_new(INTERFACE_FILE, "LogWindow");
if(x == NULL)
{
log(0, TLOG_ERROR,
_("Could not find widget `%s'"),
"LogWindow");
return;
}
w = glade_xml_get_widget(x, "LogWindow");
if(!w)
{
log(0, TLOG_ERROR,
_("Could not find widget `%s'"),
"LogWindow");
return;
}
gtk_widget_destroy(w);
}
void on_spinbutton2_changed(GtkSpinButton *sb, gpointer data)
{
canvas_zoom = gtk_spin_button_get_value_as_float(sb) / 100.0;
gnome_canvas_set_pixels_per_unit(GNOME_CANVAS(canvas), canvas_zoom);
}
void on_checkbutton1_toggled(GtkCheckButton *cb, gpointer data)
{
keep_drawing = !keep_drawing;
}
void on_button19_clicked(GtkWidget *bt, GdkEventButton *ev, gpointer data)
{
shuffle_nodes();
}
void on_button18_clicked(GtkWidget *bt, GdkEventButton *ev, gpointer data)
{
GtkWidget *w;
w = glade_xml_get_widget(canvas_xml, "GraphWindow");
if(!w) { log(0, TLOG_ERROR, _("Couldn't find widget `%s'"), "GraphWindow"); return; }
gtk_object_destroy(GTK_OBJECT(w));
build_graph = 0;
canvas_visible = 0;
}
int init_interface(void)
@ -536,11 +713,8 @@ int init_interface(void)
FALSE, TRUE);
gtk_clist_thaw(GTK_CLIST(nodetree));
create_canvas();
glade_xml_signal_autoconnect(xml);
log_add_hook(log_gtk);
log_del_hook(log_default);
add_hook("node-add", if_node_add);
@ -660,8 +834,12 @@ void if_node_visible(const char *hooktype, va_list ap)
avl_node_t *avlnode;
double newx, newy;
node_t *n = va_arg(ap, node_t*);
if(!n->data)
return;
if(!((struct if_node_data*)(n->data))->item)
/* No GnomeCanvasItem has been created for this node yet */
return;
if(((struct if_node_data*)(n->data))->visible)
@ -736,7 +914,7 @@ void if_node_add(const char *hooktype, va_list ap)
if(!xml)
return;
nd = xmalloc(sizeof(*nd));
nd = xmalloc_and_zero(sizeof(*nd));
l[0] = n->name;
gtk_clist_freeze(GTK_CLIST(nodetree));
nd->ctn = gtk_ctree_insert_node(GTK_CTREE(nodetree),
@ -748,8 +926,11 @@ void if_node_add(const char *hooktype, va_list ap)
n->data = (void*)nd;
if_node_create(n);
if_node_visible(hooktype, ap);
if(canvas_visible)
{
if_node_create(n);
if_node_visible(hooktype, ap);
}
}
void if_node_del(const char *hooktype, va_list ap)
@ -765,7 +946,10 @@ void if_node_del(const char *hooktype, va_list ap)
gtk_clist_thaw(GTK_CLIST(nodetree));
}
if_node_invisible(hooktype, ap);
if(canvas_visible)
{
if_node_invisible(hooktype, ap);
}
free(nd);
n->data = NULL;
@ -778,7 +962,7 @@ void if_subnet_add(const char *hooktype, va_list ap)
struct if_subnet_data *sd;
GtkCTreeNode *parent;
sd = xmalloc(sizeof(*sd));
sd = xmalloc_and_zero(sizeof(*sd));
l[0] = net2str(subnet);
parent = subnet->owner->data ?
((struct if_subnet_data*)(subnet->owner->data))->ctn
@ -1045,10 +1229,10 @@ void if_build_graph(void)
}
}
min_d = 0.0;
min_d = INFINITY;
for(i = 0; i < number_of_nodes; i++)
for(j = i + 1; j < number_of_nodes; j++)
if(d[i][j] < min_d && d[i][j] > 0)
if(d[i][j] < min_d && d[i][j] > 0.0)
min_d = d[i][j];
L = 5.0 / sqrt(min_d + 1.0);

View file

@ -1703,7 +1703,8 @@ Ivo Timmermans &lt;ivo@o2w.nl&gt;
<class>GtkScrolledWindow</class>
<child_name>GnomeDock:contents</child_name>
<name>scrolledwindow1</name>
<width>250</width>
<width>300</width>
<height>200</height>
<hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
@ -1766,25 +1767,124 @@ Ivo Timmermans &lt;ivo@o2w.nl&gt;
<auto_shrink>False</auto_shrink>
<widget>
<class>GtkScrolledWindow</class>
<name>scrolledwindow2</name>
<hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
<class>GtkVBox</class>
<name>vbox7</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<widget>
<class>GtkText</class>
<name>Messages</name>
<width>500</width>
<height>300</height>
<signal>
<name>button_press_event</name>
<handler>on_messages_button_press_event</handler>
<last_modification_time>Sun, 14 Apr 2002 19:34:28 GMT</last_modification_time>
</signal>
<editable>False</editable>
<text></text>
<class>GtkScrolledWindow</class>
<name>scrolledwindow2</name>
<hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkText</class>
<name>Messages</name>
<width>500</width>
<height>300</height>
<signal>
<name>button_press_event</name>
<handler>on_messages_button_press_event</handler>
<last_modification_time>Sun, 14 Apr 2002 19:34:28 GMT</last_modification_time>
</signal>
<editable>False</editable>
<text></text>
</widget>
</widget>
<widget>
<class>GtkHBox</class>
<name>hbox4</name>
<homogeneous>False</homogeneous>
<spacing>10</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkHBox</class>
<name>hbox5</name>
<homogeneous>False</homogeneous>
<spacing>9</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label32</name>
<label>Debug level</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkSpinButton</class>
<name>DebugLevelSpinbutton</name>
<can_focus>True</can_focus>
<signal>
<name>changed</name>
<handler>on_debug_level_changed</handler>
<last_modification_time>Mon, 29 Apr 2002 21:31:08 GMT</last_modification_time>
</signal>
<climb_rate>1</climb_rate>
<digits>0</digits>
<numeric>True</numeric>
<update_policy>GTK_UPDATE_IF_VALID</update_policy>
<snap>False</snap>
<wrap>False</wrap>
<value>1</value>
<lower>0</lower>
<upper>1000</upper>
<step>1</step>
<page>10</page>
<page_size>10</page_size>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
</widget>
<widget>
<class>GtkButton</class>
<name>button17</name>
<can_focus>True</can_focus>
<signal>
<name>clicked</name>
<handler>on_logwindow_close_clicked</handler>
<last_modification_time>Mon, 29 Apr 2002 21:37:37 GMT</last_modification_time>
</signal>
<stock_button>GNOME_STOCK_BUTTON_CLOSE</stock_button>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
</widget>
</widget>
</widget>
@ -1801,30 +1901,168 @@ Ivo Timmermans &lt;ivo@o2w.nl&gt;
<auto_shrink>False</auto_shrink>
<widget>
<class>GtkScrolledWindow</class>
<name>scrolledwindow3</name>
<hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
<class>GtkVBox</class>
<name>vbox8</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<widget>
<class>GnomeCanvas</class>
<name>canvas1</name>
<width>500</width>
<height>300</height>
<can_focus>True</can_focus>
<signal>
<name>button_press_event</name>
<handler>on_canvas_button_press_event</handler>
<last_modification_time>Sun, 14 Apr 2002 15:21:11 GMT</last_modification_time>
</signal>
<anti_aliased>True</anti_aliased>
<scroll_x1>0</scroll_x1>
<scroll_y1>0</scroll_y1>
<scroll_x2>100</scroll_x2>
<scroll_y2>100</scroll_y2>
<pixels_per_unit>1</pixels_per_unit>
<class>GtkScrolledWindow</class>
<name>scrolledwindow3</name>
<hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
<vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
<vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GnomeCanvas</class>
<name>canvas1</name>
<width>500</width>
<height>300</height>
<can_focus>True</can_focus>
<signal>
<name>button_press_event</name>
<handler>on_canvas_button_press_event</handler>
<last_modification_time>Sun, 14 Apr 2002 15:21:11 GMT</last_modification_time>
</signal>
<anti_aliased>True</anti_aliased>
<scroll_x1>0</scroll_x1>
<scroll_y1>0</scroll_y1>
<scroll_x2>100</scroll_x2>
<scroll_y2>100</scroll_y2>
<pixels_per_unit>1</pixels_per_unit>
</widget>
</widget>
<widget>
<class>GtkHBox</class>
<name>hbox6</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
<widget>
<class>GtkHBox</class>
<name>hbox7</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label33</name>
<label>Zoom</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkSpinButton</class>
<name>spinbutton2</name>
<can_focus>True</can_focus>
<signal>
<name>changed</name>
<handler>on_spinbutton2_changed</handler>
<last_modification_time>Wed, 01 May 2002 17:18:44 GMT</last_modification_time>
</signal>
<climb_rate>1</climb_rate>
<digits>0</digits>
<numeric>True</numeric>
<update_policy>GTK_UPDATE_IF_VALID</update_policy>
<snap>False</snap>
<wrap>False</wrap>
<value>100</value>
<lower>1</lower>
<upper>1000</upper>
<step>1</step>
<page>10</page>
<page_size>10</page_size>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
</widget>
<widget>
<class>GtkCheckButton</class>
<name>KeepDrawingButton</name>
<can_focus>True</can_focus>
<signal>
<name>toggled</name>
<handler>on_checkbutton1_toggled</handler>
<last_modification_time>Wed, 01 May 2002 17:18:37 GMT</last_modification_time>
</signal>
<label>Keep drawing</label>
<active>False</active>
<draw_indicator>True</draw_indicator>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkButton</class>
<name>button18</name>
<can_focus>True</can_focus>
<signal>
<name>clicked</name>
<handler>on_button18_clicked</handler>
<last_modification_time>Wed, 01 May 2002 17:18:25 GMT</last_modification_time>
</signal>
<stock_button>GNOME_STOCK_BUTTON_CLOSE</stock_button>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
<pack>GTK_PACK_END</pack>
</child>
</widget>
<widget>
<class>GtkButton</class>
<name>button19</name>
<can_focus>True</can_focus>
<signal>
<name>clicked</name>
<handler>on_button19_clicked</handler>
<last_modification_time>Wed, 01 May 2002 17:18:19 GMT</last_modification_time>
</signal>
<label>Shuffle</label>
<relief>GTK_RELIEF_NORMAL</relief>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
<pack>GTK_PACK_END</pack>
</child>
</widget>
</widget>
</widget>
</widget>

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: protocol.c,v 1.1 2002/04/28 12:46:26 zarq Exp $
$Id: protocol.c,v 1.2 2002/05/02 11:50:07 zarq Exp $
*/
#include "config.h"
@ -226,7 +226,7 @@ int (*request_handlers[])(connection_t*) = {
id_h, metakey_h, challenge_h, chal_reply_h, ack_h,
status_h, error_h, termreq_h,
ping_h, pong_h,
// add_node_h, del_node_h,
/* add_node_h, del_node_h,*/
add_subnet_h, del_subnet_h,
add_edge_h, del_edge_h,
key_changed_h, req_key_h, ans_key_h,
@ -238,7 +238,7 @@ char (*request_name[]) = {
"ID", "METAKEY", "CHALLENGE", "CHAL_REPLY", "ACK",
"STATUS", "ERROR", "TERMREQ",
"PING", "PONG",
// "ADD_NODE", "DEL_NODE",
/* "ADD_NODE", "DEL_NODE",*/
"ADD_SUBNET", "DEL_SUBNET",
"ADD_EDGE", "DEL_EDGE",
"KEY_CHANGED", "REQ_KEY", "ANS_KEY",

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: protocol.h,v 1.1 2002/04/28 12:46:26 zarq Exp $
$Id: protocol.h,v 1.2 2002/05/02 11:50:07 zarq Exp $
*/
#ifndef __TINC_PROTOCOL_H__
@ -40,7 +40,7 @@ enum {
ID = 0, METAKEY, CHALLENGE, CHAL_REPLY, ACK,
STATUS, ERROR, TERMREQ,
PING, PONG,
// ADD_NODE, DEL_NODE,
/* ADD_NODE, DEL_NODE,*/
ADD_SUBNET, DEL_SUBNET,
ADD_EDGE, DEL_EDGE,
KEY_CHANGED, REQ_KEY, ANS_KEY,
@ -81,8 +81,8 @@ extern int send_error(connection_t *, int, char *);
extern int send_termreq(connection_t *);
extern int send_ping(connection_t *);
extern int send_pong(connection_t *);
// extern int send_add_node(connection_t *, node_t *);
// extern int send_del_node(connection_t *, node_t *);
/* extern int send_add_node(connection_t *, node_t *); */
/* extern int send_del_node(connection_t *, node_t *); */
extern int send_add_subnet(connection_t *, subnet_t *);
extern int send_del_subnet(connection_t *, subnet_t *);
extern int send_add_edge(connection_t *, edge_t *);
@ -106,8 +106,8 @@ extern int error_h(connection_t *);
extern int termreq_h(connection_t *);
extern int ping_h(connection_t *);
extern int pong_h(connection_t *);
// extern int add_node_h(connection_t *);
// extern int del_node_h(connection_t *);
/* extern int add_node_h(connection_t *); */
/* extern int del_node_h(connection_t *); */
extern int add_subnet_h(connection_t *);
extern int del_subnet_h(connection_t *);
extern int add_edge_h(connection_t *);

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: protocol_auth.c,v 1.1 2002/04/28 12:46:26 zarq Exp $
$Id: protocol_auth.c,v 1.2 2002/05/02 11:50:07 zarq Exp $
*/
#include "config.h"
@ -564,10 +564,10 @@ cp
c->edge = new_edge();
cp
c->edge->from.node = myself;
// c->edge->from.tcpaddress = str2sockaddr(address, port);
/* c->edge->from.tcpaddress = str2sockaddr(address, port);*/
c->edge->from.udpaddress = str2sockaddr(myaddress, myport);
c->edge->to.node = n;
// c->edge->to.tcpaddress = c->address;
/* c->edge->to.tcpaddress = c->address; */
sockaddr2str(&c->address, &hisaddress, &dummy);
c->edge->to.udpaddress = str2sockaddr(hisaddress, hisport);
free(hisaddress);

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: protocol_edge.c,v 1.1 2002/04/28 12:46:26 zarq Exp $
$Id: protocol_edge.c,v 1.2 2002/05/02 11:50:07 zarq Exp $
*/
#include "config.h"
@ -52,20 +52,20 @@ int send_add_edge(connection_t *c, edge_t *e)
char *from_udpaddress, *from_udpport;
char *to_udpaddress, *to_udpport;
cp
// sockaddr2str(&e->from.tcpaddress, &from_tcpaddress, &from_tcpport);
/* sockaddr2str(&e->from.tcpaddress, &from_tcpaddress, &from_tcpport); */
sockaddr2str(&e->from.udpaddress, &from_udpaddress, &from_udpport);
// sockaddr2str(&e->to.tcpaddress, &to_tcpaddress, &to_tcpport);
/* sockaddr2str(&e->to.tcpaddress, &to_tcpaddress, &to_tcpport); */
sockaddr2str(&e->to.udpaddress, &to_udpaddress, &to_udpport);
x = send_request(c, "%d %lx %s %s %s %s %s %s %lx %d", ADD_EDGE, random(),
e->from.node->name, from_udpaddress, from_udpport,
e->to.node->name, to_udpaddress, to_udpport,
e->options, e->weight);
// free(from_tcpaddress);
// free(from_tcpport);
/* free(from_tcpaddress); */
/* free(from_tcpport); */
free(from_udpaddress);
free(from_udpport);
// free(to_tcpaddress);
// free(to_tcpport);
/* free(to_tcpaddress); */
/* free(to_tcpport); */
free(to_udpaddress);
free(to_udpport);
cp
@ -80,10 +80,10 @@ int add_edge_h(connection_t *c)
char from_name[MAX_STRING_SIZE];
char to_name[MAX_STRING_SIZE];
char from_address[MAX_STRING_SIZE];
// char from_tcpport[MAX_STRING_SIZE];
/* char from_tcpport[MAX_STRING_SIZE]; */
char from_udpport[MAX_STRING_SIZE];
char to_address[MAX_STRING_SIZE];
// char to_tcpport[MAX_STRING_SIZE];
/* char to_tcpport[MAX_STRING_SIZE]; */
char to_udpport[MAX_STRING_SIZE];
sockaddr_t from_udpaddress;
sockaddr_t to_udpaddress;
@ -139,9 +139,9 @@ cp
/* Convert addresses */
// from_tcpaddress = str2sockaddr(from_address, from_tcpport);
/* from_tcpaddress = str2sockaddr(from_address, from_tcpport); */
from_udpaddress = str2sockaddr(from_address, from_udpport);
// to_tcpaddress = str2sockaddr(to_address, to_tcpport);
/* to_tcpaddress = str2sockaddr(to_address, to_tcpport); */
to_udpaddress = str2sockaddr(to_address, to_udpport);
/* Check if edge already exists */
@ -186,10 +186,10 @@ cp
e = new_edge();
e->from.node = from;
// e->from.tcpaddress = from_tcpaddress;
/* e->from.tcpaddress = from_tcpaddress; */
e->from.udpaddress = from_udpaddress;
e->to.node = to;
// e->to.tcpaddress = to_tcpaddress;
/* e->to.tcpaddress = to_tcpaddress; */
e->to.udpaddress = to_udpaddress;
e->options = options;
e->weight = weight;

View file

@ -17,12 +17,14 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: read_conf.h,v 1.1 2002/04/28 12:46:26 zarq Exp $
$Id: read_conf.h,v 1.2 2002/05/02 11:50:07 zarq Exp $
*/
#ifndef __TINC_READ_CONF_H__
#define __TINC_READ_CONF_H__
#include <avl_tree.h>
extern int read_config_file(avl_tree_t *, const char *);
extern int read_server_config(void);
extern FILE *ask_and_safe_open(const char*, const char*, const char *);

View file

@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
$Id: tincd.c,v 1.15 2002/04/28 12:46:26 zarq Exp $
$Id: tincd.c,v 1.16 2002/05/02 11:50:07 zarq Exp $
*/
#include "config.h"
@ -51,7 +51,8 @@
#include <utils.h>
#include <xalloc.h>
#include "conf.h"
#include "callbacks.h"
#include "read_conf.h"
#include "net.h"
#include "netutl.h"
#include "process.h"
@ -380,6 +381,8 @@ cp
cp
if(detach())
exit(0);
init_callbacks();
cp
for(;;)
{