int active:1; /* 1 if active.. */
int connecting:1; /* 1 if we are waiting for a non-blocking connect() to finish */
int termreq:1; /* the termination of this connection was requested */
- int remove:1; /* Set to 1 if you want this connection removed */
+ int remove_unused:1; /* Set to 1 if you want this connection removed */
int timeout:1; /* 1 if gotten timeout */
int encryptout:1; /* 1 if we can encrypt outgoing traffic */
int decryptin:1; /* 1 if we have to decrypt incoming traffic */
}
}
-/*
- put all file descriptors into events
- While we're at it, purge stuf that needs to be removed.
-*/
-static int build_fdset(void) {
- splay_node_t *node, *next;
- connection_t *c;
- int i, max = 0;
-
- cp();
-
- 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();
- }
- }
-
- return 0;
-}
-
/*
Terminate a connection:
- Close the socket
void terminate_connection(connection_t *c, bool report) {
cp();
- if(c->status.remove)
- return;
-
ifdebug(CONNECTIONS) logger(LOG_NOTICE, _("Closing connection with %s (%s)"),
c->name, c->hostname);
- c->status.remove = true;
c->status.active = false;
if(c->node)
}
}
+ free(c->outbuf);
+ c->outbuf = NULL;
+ c->outbuflen = 0;
+ c->outbufsize = 0;
+ c->outbufstart = 0;
+
/* Check if this was our outgoing connection */
if(c->outgoing) {
retry_outgoing(c->outgoing);
c->outgoing = NULL;
+ } else {
+ connection_del(c);
}
-
- free(c->outbuf);
- c->outbuf = NULL;
- c->outbuflen = 0;
- c->outbufsize = 0;
- c->outbufstart = 0;
}
/*
c->name, c->hostname, now - c->last_ping_time);
c->status.timeout = true;
terminate_connection(c, true);
+ continue;
} else if(c->last_ping_time + pinginterval < now) {
send_ping(c);
}
} else {
- if(c->status.remove) {
- logger(LOG_WARNING, _("Old connection_t for %s (%s) status %04x still lingering, deleting..."),
- c->name, c->hostname, c->status.value);
- connection_del(c);
- continue;
- }
ifdebug(CONNECTIONS) logger(LOG_WARNING, _("Timeout from %s (%s) during authentication"),
c->name, c->hostname);
if(c->status.connecting) {
do_outgoing_connection(c);
} else {
terminate_connection(c, false);
+ continue;
}
}
}
int result;
socklen_t len = sizeof(result);
- if (c->status.remove)
- return;
-
if(c->status.connecting) {
getsockopt(c->socket, SOL_SOCKET, SO_ERROR, &result, &len);
this is where it all happens...
*/
int main_loop(void) {
- struct timeval tv;
- int r;
struct event timeout_event;
struct event sighup_event;
struct event sigint_event;
ifdebug(ERROR) logger(LOG_NOTICE, _("Error message from %s (%s): %d: %s"),
c->name, c->hostname, err, errorstring);
- terminate_connection(c, c->status.active);
-
- return true;
+ return false;
}
bool send_termreq(connection_t *c)
{
cp();
- terminate_connection(c, c->status.active);
-
- return true;
+ return false;
}
bool send_ping(connection_t *c)