/** * Garbage collection for a SSL server connection. * @param ssl_server data for ssl server connection */ static void cleanup_ssl_server_socket(ssl_server_connection *ssl_server) { if (!ssl_server) return; FREE(ssl_server->pemfile); FREE(ssl_server->clientpemfile); while (ssl_server->ssl_conn_list) { ssl_connection *ssl = ssl_server->ssl_conn_list; ssl_server->ssl_conn_list = ssl_server->ssl_conn_list->next; close_accepted_ssl_socket(ssl_server, ssl); } }
/** * Do "accept" for a ssl server socket * @param ssl ssl connection * @return the ssl_connection of the socket, NULL in case of an error */ ssl_connection *accept_ssl_socket(ssl_server_connection *ssl_server) { #ifdef HAVE_OPENSSL int no_crypt_socket; int len= sizeof(struct sockaddr_in); struct sockaddr_in in; ASSERT(ssl_server); no_crypt_socket= accept(ssl_server->server_socket, (struct sockaddr*)&in, &len); if(no_crypt_socket >= 0) { ssl_connection *ssl = insert_accepted_ssl_socket(ssl_server); if(ssl == NULL) { return NULL; } if(embed_accepted_ssl_socket(ssl, no_crypt_socket)) { return ssl; } else { close_accepted_ssl_socket(ssl_server, ssl); return NULL; } } else { return NULL; } #else return NULL; #endif }
/** * Garbage collection for a SSL server connection. * @param ssl_server data for ssl server connection * @return TRUE, or FALSE if an error has occured. */ int cleanup_ssl_server_socket(ssl_server_connection *ssl_server) { #ifdef HAVE_OPENSSL ssl_connection *ssl; if(ssl_server==NULL) { return FALSE; } if(ssl_server->pemfile!=NULL) { FREE(ssl_server->pemfile); ssl_server->pemfile= NULL; } if(ssl_server->clientpemfile!=NULL) { FREE(ssl_server->clientpemfile); ssl_server->clientpemfile= NULL; } while (ssl_server->ssl_conn_list!=NULL) { ssl = ssl_server->ssl_conn_list; ssl_server->ssl_conn_list=ssl_server->ssl_conn_list->next; close_accepted_ssl_socket(ssl_server, ssl); } return TRUE; #else return TRUE; #endif }
void socket_free(Socket_T *S) { ASSERT(S && *S); #ifdef HAVE_OPENSSL if((*S)->ssl && (*S)->ssl->handler) { if((*S)->connection_type==TYPE_LOCAL) { close_ssl_socket((*S)->ssl); delete_ssl_socket((*S)->ssl); } else if((*S)->connection_type==TYPE_ACCEPT && (*S)->sslserver) { close_accepted_ssl_socket((*S)->sslserver, (*S)->ssl); } } else #endif close_socket((*S)->socket); FREE((*S)->host); FREE(*S); }