From b1b69d1a3da1de91caf306f07d412511cee5484f Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Fri, 8 Dec 2006 20:07:22 +0000 Subject: [PATCH] Changed private data for jabber connection to include SASL context The private hook data for jabber connections, which consisted solely of the iksemel (XML) parser, now includes GNU SASL context and client/server sessions. Functions for creating and destroying the data are provided. --- jabber.c | 31 ++++++++++++++++++++++++++++--- jabber.h | 14 ++++++++++++++ jabber_server.c | 7 ++++--- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/jabber.c b/jabber.c index 81dc849..61ed23c 100644 --- a/jabber.c +++ b/jabber.c @@ -20,9 +20,33 @@ #include #include #include +#include #include "iksemel_extra.h" #include "jabber.h" +jabber_data_t* jabber_data_new (gpointer hook, gpointer parser) +{ + jabber_data_t *data; + data = g_slice_new0 (jabber_data_t); + data->parser = iks_extra_stream_new (hook, parser); + gsasl_init (&(data->ctx)); + return data; +} + +void jabber_data_destroy (gpointer data) +{ + jabber_data_t *jdata = (jabber_data_t*) data; + if (jdata->parser) + iks_parser_delete (jdata->parser); + if (jdata->client) + gsasl_finish (jdata->client); + if (jdata->server) + gsasl_finish (jdata->server); + if (jdata->ctx) + gsasl_done (jdata->ctx); + g_slice_free (jabber_data_t, jdata); +} + static void jabber_connect (net_hook_t* hook) { } @@ -35,7 +59,7 @@ static void jabber_close (net_hook_t* hook) gnet_conn_disconnect (hook->peer->conn); } gnet_conn_delete (hook->conn); - iks_parser_delete (hook->data); + jabber_data_destroy (hook->data); g_slice_free (net_hook_t, hook); } @@ -45,7 +69,8 @@ static void jabber_write (net_hook_t* hook) static void jabber_read (net_hook_t* hook, gchar* buffer, size_t len) { - iks_parse (hook->data, buffer, len, FALSE); + jabber_data_t *jdata = (jabber_data_t*) hook->data; + iks_parse (jdata->parser, buffer, len, FALSE); } void jabber_error (net_hook_t* hook) @@ -146,7 +171,7 @@ net_hook_t* jabber_hook_new (GConn* conn) hook->close = jabber_close; hook->write = jabber_write; hook->read = jabber_read; - hook->data = iks_extra_stream_new (hook, jabber_parser); + hook->data = jabber_data_new (hook, jabber_parser); gnet_conn_set_callback (hook->conn, nethook_event, hook); return hook; } diff --git a/jabber.h b/jabber.h index 11e5097..7de6098 100644 --- a/jabber.h +++ b/jabber.h @@ -22,8 +22,22 @@ #include #include +#include #include "nethook.h" +typedef struct _jabber_data_t jabber_data_t; + +struct _jabber_data_t +{ + iksparser *parser; + Gsasl *ctx; + Gsasl_session *client; + Gsasl_session *server; +}; + +jabber_data_t* jabber_data_new (gpointer, gpointer); +void jabber_data_destroy (gpointer); + net_hook_t* jabber_hook_new (GConn *conn); void jabber_hook_destroy (net_hook_t*); net_hook_t* jabber_server_hook_new (net_hook_t*, char*); diff --git a/jabber_server.c b/jabber_server.c index 96641ac..f3cef49 100644 --- a/jabber_server.c +++ b/jabber_server.c @@ -36,7 +36,7 @@ static void jabber_server_close (net_hook_t* hook) gnet_conn_disconnect (hook->peer->conn); } gnet_conn_delete (hook->conn); - iks_parser_delete (hook->data); + jabber_data_destroy (hook->data); g_slice_free (net_hook_t, hook); g_message ("Server disconnected."); } @@ -47,7 +47,8 @@ static void jabber_server_write (net_hook_t* hook) static void jabber_server_read (net_hook_t* hook, gchar* buffer, size_t len) { - iks_parse (hook->data, buffer, len, FALSE); + jabber_data_t *jdata = (jabber_data_t*) hook->data; + iks_parse (jdata->parser, buffer, len, FALSE); } void jabber_server_tls_filter (iks* node) @@ -141,6 +142,6 @@ net_hook_t* jabber_server_hook_new (net_hook_t* client_hook, char* server) hook->close = jabber_server_close; hook->write = jabber_server_write; hook->read = jabber_server_read; - hook->data = iks_extra_stream_new (hook, jabber_server_parser); + hook->data = jabber_data_new (hook, jabber_server_parser); return hook; } -- 2.20.1