74 lines
1.8 KiB
C
74 lines
1.8 KiB
C
#include <config/api.h>
|
|
#include "network.h"
|
|
|
|
unsigned int pluginType() {
|
|
return PLUGIN_TYPE_NETWORK;
|
|
}
|
|
|
|
const char* pluginName() {
|
|
return "ssl";
|
|
}
|
|
|
|
void* pluginConnect(const char* host, int port) {
|
|
NETWORK_SSL* connection;
|
|
|
|
if((connection = malloc(sizeof(BIO))) == NULL) {
|
|
configErrorPush("Unable to malloc");
|
|
return NULL;
|
|
}
|
|
|
|
connection->ctx = SSL_CTX_new(SSLv23_client_method());
|
|
|
|
if((connection->bio = BIO_new_ssl_connect(connection->ctx)) == NULL) {
|
|
configErrorPush("Unable to allocate a BIO");
|
|
free(connection);
|
|
return NULL;
|
|
}
|
|
|
|
BIO_get_ssl(connection->bio, &connection->ssl);
|
|
SSL_set_mode(connection->ssl, SSL_MODE_AUTO_RETRY);
|
|
BIO_set_conn_hostname(connection->bio, host);
|
|
BIO_set_conn_int_port(connection->bio, &port);
|
|
|
|
if(BIO_do_connect(connection->bio) <= 0) {
|
|
configErrorPush("Unable to connect");
|
|
free(connection);
|
|
return NULL;
|
|
}
|
|
|
|
return connection;
|
|
}
|
|
|
|
int pluginSocketGet(NETWORK_SSL* connection) {
|
|
return BIO_get_fd(connection->bio, NULL);
|
|
}
|
|
|
|
int pluginReadData(NETWORK_SSL* connection, char* buffer, int buffer_len) {
|
|
int ret;
|
|
|
|
if((ret == BIO_read(connection->bio, buffer, buffer_len)) == 0)
|
|
return ECONNRESET;
|
|
else if(ret == -1)
|
|
return (!BIO_should_retry(connection->bio)) ? ECONNRESET : EWOULDBLOCK;
|
|
return ret;
|
|
}
|
|
|
|
int pluginSendData(NETWORK_SSL* connection, const char* buffer, int buffer_len) {
|
|
int ret;
|
|
if((ret = BIO_write(connection->bio, buffer, buffer_len)) <= 0) {
|
|
if(!BIO_should_retry(connection->bio))
|
|
return ECONNRESET;
|
|
return EWOULDBLOCK;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void* pluginSocketDone(NETWORK_SSL* connection) {
|
|
BIO_free_all(connection->bio);
|
|
SSL_CTX_free(connection->ctx);
|
|
|
|
free(connection);
|
|
|
|
return NULL;
|
|
}
|