--- a/src/sock_gnutls.c Sun Feb 22 06:52:55 2009 +0200
+++ b/src/sock_gnutls.c Sun Feb 22 07:08:57 2009 +0200
@@ -54,7 +54,7 @@
return SUCCESS;
}
-err_t sock_gnutls_init (struct error_info *err)
+err_t sock_gnutls_global_init (struct error_info *err)
{
// global init
if ((ERROR_EXTRA(err) = gnutls_global_init()) < 0)
@@ -69,41 +69,49 @@
}
-// XXX: errors
-struct sock_stream *sock_ssl_connect (const char *host, const char *service)
+err_t sock_gnutls_connect (struct sock_stream **sock_ptr, const char *host, const char *service, struct error_info *err)
{
- int _err;
- struct sock_gnutls *sock;
+ struct sock_gnutls *sock = NULL;
struct sock_gnutls_client_ctx *ctx = &_sock_gnutls_client_ctx;
// alloc
if ((sock = calloc(1, sizeof(*sock))) == NULL)
- errx(1, "calloc");
+ return SET_ERROR(err, ERR_CALLOC);
- // initialize
- sock->base_tcp.base.type = &sock_gnutls_type;
+ // initialize base
+ sock_stream_init(SOCK_GNUTLS_BASE(sock), &sock_gnutls_type);
// initialize client session
- if ((_err = gnutls_init(&sock->session, GNUTLS_CLIENT)) < 0)
- errx(1, "gnutls_init: %s", gnutls_strerror(_err));
+ if ((ERROR_EXTRA(err) = gnutls_init(&sock->session, GNUTLS_CLIENT)) < 0)
+ JUMP_SET_ERROR(err, ERR_GNUTLS_INIT);
// ...default priority stuff
- gnutls_set_default_priority(sock->session);
+ if ((ERROR_EXTRA(err) = gnutls_set_default_priority(sock->session)))
+ JUMP_SET_ERROR(err, ERR_GNUTLS_SET_DEFAULT_PRIORITY);
// bind anon credentials
- gnutls_credentials_set(sock->session, GNUTLS_CRD_CERTIFICATE, ctx->xcred);
+ if ((ERROR_EXTRA(err) = gnutls_credentials_set(sock->session, GNUTLS_CRD_CERTIFICATE, ctx->xcred)))
+ JUMP_SET_ERROR(err, ERR_GNUTLS_CRED_SET);
// TCP connect
- sock_tcp_init_connect(SOCK_GNUTLS_TCP(sock), host, service);
+ if (sock_tcp_init_connect(SOCK_GNUTLS_TCP(sock), host, service))
+ JUMP_SET_ERROR_INFO(err, SOCK_GNUTLS_ERR(sock));
// bind default transport functions (recv/send) to use the TCP fd
gnutls_transport_set_ptr(sock->session, (gnutls_transport_ptr_t) sock->base_tcp.fd);
// perform the handshake
- if ((_err = gnutls_handshake(sock->session)) < 0)
- _sock_gnutls_error(sock, "gnutls_handshake", _err);
+ if ((ERROR_EXTRA(err) = gnutls_handshake(sock->session)) < 0)
+ JUMP_SET_ERROR(err, ERR_GNUTLS_HANDSHAKE);
// done
- return SOCK_GNUTLS_BASE(sock);
+ *sock_ptr = SOCK_GNUTLS_BASE(sock);
+
+ return SUCCESS;
+
+error:
+ // XXX: cleanup
+
+ return ERROR_CODE(err);
}