*/
#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);
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);
}
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;
}
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)
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
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);
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)
{
{
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);
}
}
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;
}