X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=ssl_server.c;h=270e7bd1b72d369e16662f815df2b3ca44300cc2;hb=78fd5267a0533ca82c2c7733f24ed62f13023f9c;hp=4d39e34d0ef3d2deb1495fb914c737c1c626185a;hpb=6f9072d6012a67e7d7bdcd58a72106456bd80ebc;p=cascardo%2Frnetproxy.git diff --git a/ssl_server.c b/ssl_server.c index 4d39e34..270e7bd 100644 --- a/ssl_server.c +++ b/ssl_server.c @@ -19,21 +19,19 @@ */ #include -#include #include #include #include #include "ssl.h" static struct ssl_data * -ssl_data_new (char *server) +ssl_data_new (void) { struct ssl_data *ssl; int kx_prio[] = {GNUTLS_KX_RSA, 0}; gnutls_certificate_credentials cred; gnutls_certificate_allocate_credentials (&cred); ssl = g_slice_new (struct ssl_data); - ssl->server = g_strdup (server); gnutls_init (&ssl->session, GNUTLS_CLIENT); gnutls_set_default_priority (ssl->session); gnutls_set_default_priority (ssl->session); @@ -48,7 +46,6 @@ static void ssl_data_destroy (struct ssl_data *ssl) { gnutls_deinit (ssl->session); - g_free (ssl->server); g_string_free (ssl->buffer, TRUE); g_slice_free (struct ssl_data, ssl); } @@ -61,11 +58,10 @@ ssl_push (gnutls_transport_ptr_t ptr, const void *buffer, size_t len) int r; if (ssl->handshaking == TRUE) { - g_io_channel_write_chars (hook->conn->iochannel, buffer, len, - &r, NULL); - return r; + hc_conn_write (hook->conn, (void *) buffer, len); + return len; } - gnet_conn_write (hook->conn, (void *) buffer, len); + hc_conn_write (hook->conn, (void *) buffer, len); return len; } @@ -77,8 +73,7 @@ ssl_pull (gnutls_transport_ptr_t ptr, void *buffer, size_t len) int r; if (ssl->handshaking == TRUE) { - g_io_channel_read_chars (hook->conn->iochannel, buffer, len, - &r, NULL); + r = hc_conn_read (hook->conn, buffer, len); return r; } if (len > ssl->buffer->len) @@ -112,11 +107,14 @@ ssl_server_connect (net_hook_t *hook) ssl->handshaking = TRUE; if ((error = gnutls_handshake (ssl->session)) < 0) { - g_message ("%satal error while doing TLS handshaking.\n", - gnutls_error_is_fatal (error) ? "F" : "Nonf"); - g_message ("%s\n", gnutls_strerror (error)); + if (gnutls_error_is_fatal (error)) + g_critical ("Fatal error while doing TLS handshaking: %s\n", + gnutls_strerror (error)); + } + if (error != GNUTLS_E_AGAIN && error != GNUTLS_E_INTERRUPTED) + { + ssl->handshaking = FALSE; } - ssl->handshaking = FALSE; } static void @@ -126,9 +124,9 @@ ssl_server_close (net_hook_t *hook) if (hook->peer) { hook->peer->peer = NULL; - gnet_conn_disconnect (hook->peer->conn); + hc_conn_close (hook->peer->conn); } - gnet_conn_delete (hook->conn); + hc_conn_close (hook->conn); if (ssl != NULL) { gnutls_bye (ssl->session, GNUTLS_SHUT_RDWR); @@ -137,11 +135,6 @@ ssl_server_close (net_hook_t *hook) g_slice_free (net_hook_t, hook); } -static void -ssl_server_write (net_hook_t *hook) -{ -} - static void ssl_server_read (net_hook_t *hook, gchar *buffer, size_t len) { @@ -152,7 +145,7 @@ ssl_server_read (net_hook_t *hook, gchar *buffer, size_t len) { r = gnutls_record_recv (ssl->session, buffer, len); if (r > 0) - gnet_conn_write (hook->peer->conn, buffer, r); + hc_conn_write (hook->peer->conn, buffer, r); } while (r > 0); } @@ -163,19 +156,19 @@ ssl_server_error (net_hook_t *hook) } net_hook_t * -ssl_server_hook_new (net_hook_t *client_hook, char *server) +ssl_server_hook_new (net_hook_t *client_hook, char *server, char *port) { net_hook_t *hook; + int fd; hook = g_slice_new (net_hook_t); - hook->conn = gnet_conn_new (server, 995, nethook_event, hook); hook->peer = client_hook; hook->server = TRUE; hook->connect = ssl_server_connect; hook->close = ssl_server_close; - hook->write = ssl_server_write; hook->read = ssl_server_read; - hook->data = ssl_data_new (server); - gnet_conn_connect (hook->conn); - gnet_conn_read (hook->conn); + hook->data = ssl_data_new (); + hook->conn = hc_conn_new (nethook_event, hook); + fd = hc_tcp_connect (server, port); + hc_conn_set_driver_channel (hook->conn, fd); return hook; }