Socket_T socket_create_a(int socket, const char *remote_host, int port, void *sslserver) { Socket_T S; ASSERT(socket>=0); ASSERT(remote_host); NEW(S); S->length= 0; S->offset= 0; S->port= port; S->socket= socket; S->type= SOCK_STREAM; S->timeout= NET_TIMEOUT; S->host= xstrdup(remote_host); S->connection_type= TYPE_ACCEPT; if(sslserver) { S->sslserver= sslserver; if(! (S->ssl= insert_accepted_ssl_socket(S->sslserver))) { goto ssl_error; } if(! embed_accepted_ssl_socket(S->ssl, S->socket)) { goto ssl_error; } } return S; ssl_error: socket_free(&S); return NULL; }
/** * 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 }