+void free_connection(connection_t *c) {
+ if(!c)
+ return;
+
+ if(c->name)
+ free(c->name);
+
+ if(c->hostname)
+ free(c->hostname);
+
+ cipher_close(&c->incipher);
+ digest_close(&c->indigest);
+ cipher_close(&c->outcipher);
+ digest_close(&c->outdigest);
+
+ stop_sptps(&c->sptps);
+ ecdsa_free(&c->ecdsa);
+ rsa_free(&c->rsa);
+
+ if(c->hischallenge)
+ free(c->hischallenge);
+
+ if(c->config_tree)
+ exit_configuration(&c->config_tree);
+
+ buffer_clear(&c->inbuf);
+ buffer_clear(&c->outbuf);
+
+ if(event_initialized(&c->inevent))
+ event_del(&c->inevent);
+
+ if(event_initialized(&c->outevent))
+ event_del(&c->outevent);
+
+ if(c->socket > 0)
+ closesocket(c->socket);
+
+ free(c);