int contradicting_add_edge = 0;
int contradicting_del_edge = 0;
static int sleeptime = 10;
+time_t last_config_check = 0;
/* Purge edges and subnets of unreachable nodes. Use carefully. */
splay_node_t *node, *next;
char *fname;
struct stat s;
- static time_t last_config_check = 0;
/* Reread our own configuration file */
setup_myself_reloadable();
- /* Close connections to hosts that have a changed or deleted host config file */
-
- for(node = connection_tree->head; node; node = next) {
- c = node->data;
- next = node->next;
-
- if(c->status.control)
- continue;
-
- if(c->outgoing) {
- free(c->outgoing->name);
- if(c->outgoing->ai)
- freeaddrinfo(c->outgoing->ai);
- free(c->outgoing);
- c->outgoing = NULL;
- }
-
- xasprintf(&fname, "%s" SLASH "hosts" SLASH "%s", confbase, c->name);
- if(stat(fname, &s) || s.st_mtime > last_config_check)
- terminate_connection(c, c->status.active);
- free(fname);
- }
-
- last_config_check = time(NULL);
-
/* If StrictSubnet is set, expire deleted Subnets and read new ones in */
if(strictsubnets) {
try_outgoing_connections();
+ /* Close connections to hosts that have a changed or deleted host config file */
+
+ for(node = connection_tree->head; node; node = next) {
+ c = node->data;
+ next = node->next;
+
+ if(c->status.control)
+ continue;
+
+ xasprintf(&fname, "%s" SLASH "hosts" SLASH "%s", confbase, c->name);
+ if(stat(fname, &s) || s.st_mtime > last_config_check) {
+ fprintf(stderr, "ZOMG %ld > %ld\n", s.st_mtime, last_config_check);
+ terminate_connection(c, c->status.active);
+ }
+ free(fname);
+ }
+
+ last_config_check = time(NULL);
+
return 0;
}
extern char *myport;
extern int contradicting_add_edge;
extern int contradicting_del_edge;
+extern time_t last_config_check;
extern char *proxyhost;
extern char *proxyport;
return false;
}
+ last_config_check = time(NULL);
+
return true;
}
}
static void free_outgoing(outgoing_t *outgoing) {
+ if(event_initialized(&outgoing->ev))
+ event_del(&outgoing->ev);
+
if(outgoing->ai)
freeaddrinfo(outgoing->ai);
char *name;
outgoing_t *outgoing;
- outgoing_list = list_alloc((list_action_t)free_outgoing);
-
+ /* If there is no outgoing list yet, create one. Otherwise, mark all outgoings as deleted. */
+
+ if(!outgoing_list) {
+ outgoing_list = list_alloc((list_action_t)free_outgoing);
+ } else {
+ for(list_node_t *i = outgoing_list->head; i; i = i->next) {
+ outgoing = i->data;
+ outgoing->timeout = -1;
+ }
+ }
+
+ /* Make sure there is one outgoing_t in the list for each ConnectTo. */
+
for(cfg = lookup_config(config_tree, "ConnectTo"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
get_config_string(cfg, &name);
continue;
}
- outgoing = xmalloc_and_zero(sizeof *outgoing);
- outgoing->name = name;
- list_insert_tail(outgoing_list, outgoing);
- setup_outgoing_connection(outgoing);
+ bool found = false;
+
+ for(list_node_t *i = outgoing_list->head; i; i = i->next) {
+ outgoing = i->data;
+ if(!strcmp(outgoing->name, name)) {
+ found = true;
+ outgoing->timeout = 0;
+ break;
+ }
+ }
+
+ if(!found) {
+ outgoing = xmalloc_and_zero(sizeof *outgoing);
+ outgoing->name = name;
+ list_insert_tail(outgoing_list, outgoing);
+ setup_outgoing_connection(outgoing);
+ }
+ }
+
+ /* Terminate any connections whose outgoing_t is to be deleted. */
+
+ for(splay_node_t *n = connection_tree->head, *next; n; n = next) {
+ next = n->next;
+ connection_t *c = n->data;
+ if(c->outgoing && c->outgoing->timeout == -1) {
+ c->outgoing = NULL;
+ terminate_connection(c, c->status.active);
+ }
+ }
+
+ /* Delete outgoing_ts for which there is no ConnectTo. */
+
+ for(list_node_t *i = outgoing_list->head, *next; i; i = next) {
+ next = i->next;
+ outgoing = i->data;
+ if(outgoing->timeout == -1)
+ list_delete_node(outgoing_list, i);
}
}