-bool do_purge = false;
-volatile bool running = false;
-#ifdef HAVE_PSELECT
-bool graph_dump = false;
-#endif
-
-time_t now = 0;
-int contradicting_add_edge = 0;
-int contradicting_del_edge = 0;
-static int sleeptime = 10;
-
-/* Purge edges and subnets of unreachable nodes. Use carefully. */
-
-static void purge(void) {
- avl_node_t *nnode, *nnext, *enode, *enext, *snode, *snext;
- node_t *n;
- edge_t *e;
- subnet_t *s;
-
- ifdebug(PROTOCOL) logger(LOG_DEBUG, "Purging unreachable nodes");
-
- /* Remove all edges and subnets owned by unreachable nodes. */
-
- for(nnode = node_tree->head; nnode; nnode = nnext) {
- nnext = nnode->next;
- n = nnode->data;
-
- if(!n->status.reachable) {
- ifdebug(SCARY_THINGS) logger(LOG_DEBUG, "Purging node %s (%s)", n->name,
- n->hostname);
-
- for(snode = n->subnet_tree->head; snode; snode = snext) {
- snext = snode->next;
- s = snode->data;
- send_del_subnet(broadcast, s);
- if(!strictsubnets)
- subnet_del(n, s);
- }
-
- for(enode = n->edge_tree->head; enode; enode = enext) {
- enext = enode->next;
- e = enode->data;
- if(!tunnelserver)
- send_del_edge(broadcast, e);
- edge_del(e);
- }
- }
- }
-
- /* Check if anyone else claims to have an edge to an unreachable node. If not, delete node. */
-
- for(nnode = node_tree->head; nnode; nnode = nnext) {
- nnext = nnode->next;
- n = nnode->data;
-
- if(!n->status.reachable) {
- for(enode = edge_weight_tree->head; enode; enode = enext) {
- enext = enode->next;
- e = enode->data;
-
- if(e->to == n)
- break;
- }
-
- if(!enode && (!strictsubnets || !n->subnet_tree->head))
- /* in strictsubnets mode do not delete nodes with subnets */
- node_del(n);
- }
- }
-}
-
-/*
- put all file descriptors in an fd_set array
- While we're at it, purge stuff that needs to be removed.
-*/
-static int build_fdset(fd_set *readset, fd_set *writeset) {
- avl_node_t *node, *next;
- connection_t *c;
- int i, max = 0;
-
- FD_ZERO(readset);
- FD_ZERO(writeset);
-
- for(node = connection_tree->head; node; node = next) {
- next = node->next;
- c = node->data;
-
- if(c->status.remove) {
- connection_del(c);
- if(!connection_tree->head)
- purge();
- } else {
- FD_SET(c->socket, readset);
- if(c->outbuflen > 0)
- FD_SET(c->socket, writeset);
- if(c->socket > max)
- max = c->socket;
- }
- }
-
- for(i = 0; i < listen_sockets; i++) {
- FD_SET(listen_socket[i].tcp, readset);
- if(listen_socket[i].tcp > max)
- max = listen_socket[i].tcp;
- FD_SET(listen_socket[i].udp, readset);
- if(listen_socket[i].udp > max)
- max = listen_socket[i].udp;
- }
-
- if(device_fd >= 0)
- FD_SET(device_fd, readset);
- if(device_fd > max)
- max = device_fd;
-
- return max;
-}
-