-/*
- this is where it all happens...
-*/
-int main_loop(void)
-{
- struct timeval tv;
- int r;
- time_t last_ping_check;
- struct event timeout;
- struct event sighup_event;
- struct event sigint_event;
- struct event sigterm_event;
- struct event sigquit_event;
- struct event sigusr1_event;
- struct event sigusr2_event;
- struct event sigwinch_event;
-
- cp();
-
- signal_set(&sighup_event, SIGHUP, sighup_handler, NULL);
- signal_add(&sighup_event, NULL);
- signal_set(&sigint_event, SIGINT, sigint_handler, NULL);
- signal_add(&sigint_event, NULL);
- signal_set(&sigterm_event, SIGTERM, sigterm_handler, NULL);
- signal_add(&sigterm_event, NULL);
- signal_set(&sigquit_event, SIGQUIT, sigterm_handler, NULL);
- signal_add(&sigquit_event, NULL);
- signal_set(&sigusr1_event, SIGUSR1, sigusr1_handler, NULL);
- signal_add(&sigusr1_event, NULL);
- signal_set(&sigusr2_event, SIGUSR2, sigusr2_handler, NULL);
- signal_add(&sigusr2_event, NULL);
- signal_set(&sigwinch_event, SIGWINCH, sigwinch_handler, NULL);
- signal_add(&sigwinch_event, NULL);
-
- last_ping_check = now;
-
- srand(now);
-
- running = true;
-
- while(running) {
- now = time(NULL);
-
- // tv.tv_sec = 1 + (rand() & 7); /* Approx. 5 seconds, randomized to prevent global synchronisation effects */
- tv.tv_sec = 1;
- tv.tv_usec = 0;
-
- /* XXX: libevent transition: old timeout code in this loop */
- timeout_set(&timeout, dummy, NULL);
- timeout_add(&timeout, &tv);
-
- r = build_fdset();
- if(r < 0) {
- logger(LOG_ERR, _("Error building fdset: %s"), strerror(errno));
- cp_trace();
- dump_connections();
- return 1;
+ if(!disconnect_from && max_connects < cur_connects) {
+ splay_tree_t *nodes = splay_alloc_tree(node_compare_devclass_desc, NULL);
+
+ for list_each(connection_t, c, mesh->connections) {
+ if(c->status.active && c->node) {
+ splay_insert(nodes, c->node);
+ }
+ }
+
+ if(nodes->head) {
+ logger(mesh, MESHLINK_DEBUG, "* disconnect connection (too many connections)");
+
+ //timeout = 0;
+ disconnect_from = (node_t *)nodes->head->data;
+ } else {
+ logger(mesh, MESHLINK_DEBUG, "* no node we want to disconnect, even though we have too many connections");
+ }
+
+ splay_free_tree(nodes);