Separate iochannel implementation from HCConn interface.
[cascardo/rnetproxy.git] / ssl_server.c
index 4d39e34..270e7bd 100644 (file)
 */
 
 #include <gnutls/gnutls.h>
-#include <gnet.h>
 #include <glib.h>
 #include <string.h>
 #include <errno.h>
 #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;
 }