--- a/src/error.h Sun Feb 22 06:44:16 2009 +0200
+++ b/src/error.h Sun Feb 22 06:52:55 2009 +0200
@@ -16,19 +16,24 @@
* List of defined error codes, organized mostly by function name
*/
enum error_code {
+ /* Core functions */
ERR_CALLOC = 0x000100,
- // network resolver errors
+ /* Network resolver errors */
ERR_GETADDRINFO = 0x000200,
ERR_GETADDRINFO_EMPTY = 0x000201, /* No valid results */
- // low-level network errors
+ /* Low-level network errors */
ERR_SOCKET = 0x000301,
ERR_CONNECT = 0x000302,
- // low-level IO errors
+ /* Low-level IO errors */
ERR_READ = 0x000401,
ERR_WRITE = 0x000402,
+
+ /* GnuTLS errors */
+ ERR_GNUTLS_CERT_ALLOC_CRED = 0x010101,
+ ERR_GNUTLS_GLOBAL_INIT = 0x010102,
};
/*
@@ -46,31 +51,31 @@
#define SUCCESS (0)
/* Evaulates to error_info.code as lvalue */
-#define ERROR_CODE(err_info) ((err_info).code)
+#define ERROR_CODE(err_info_ptr) ((err_info_ptr)->code)
/* Evaulates to error_info.extra as lvalue */
-#define ERROR_EXTRA(err_info) ((err_info).extra)
+#define ERROR_EXTRA(err_info_ptr) ((err_info_ptr)->extra)
/* Set error_info.code to SUCCESS, evaulates as zero */
-#define RESET_ERROR(err_info) ((err_info).code = SUCCESS)
+#define RESET_ERROR(err_info_ptr) ((err_info_ptr)->code = SUCCESS)
/* Compare error_info.code != 0 */
-#define IS_ERROR(err_info) (!!(err_info).code)
+#define IS_ERROR(err_info_ptr) (!!(err_info_ptr)->code)
/* Set error_info.code, but leave err_extra as-is. Evaluates to err_code */
-#define SET_ERROR(err_info, err_code) ((err_info).code = (err_code))
+#define SET_ERROR(err_info_ptr, err_code) ((err_info_ptr)->code = (err_code))
/* Set error_info.code/extra. XXX: should evaluate to err_code */
-#define _SET_ERROR_EXTRA(err_info, err_code, err_extra) (err_info).code = (err_code); err_info.extra = (err_extra)
-#define SET_ERROR_EXTRA(err_info, err_code, err_extra) do { _SET_ERROR_EXTRA(err_info, err_code, err_extra); } while (0)
+#define _SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra) (err_info_ptr)->code = (err_code); (err_info_ptr)->extra = (err_extra)
+#define SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra) do { _SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra); } while (0)
/* Set error.info.code to err_code, and .extra to errno. XXX: should evaulate to err_code */
-#define _SET_ERROR_ERRNO(err_info, err_code) _SET_ERROR_EXTRA(err_info, err_code, errno);
-#define SET_ERROR_ERRNO(err_info, err_code) SET_ERROR_EXTRA(err_info, err_code, errno);
+#define _SET_ERROR_ERRNO(err_info_ptr, err_code) _SET_ERROR_EXTRA(err_info_ptr, err_code, errno);
+#define SET_ERROR_ERRNO(err_info_ptr, err_code) SET_ERROR_EXTRA(err_info_ptr, err_code, errno);
/* Ss above, but also return err_code from func. XXX: use 'return SET_ERROR...' instead */
-#define RETURN_SET_ERROR(err_info, err_code) do { _SET_ERROR(err_info, err_code); return (err_code); } while (0)
-#define RETURN_SET_ERROR_EXTRA(err_info, err_code, err_extra) do { _SET_ERROR_EXTRA(err_info, err_code, err_extra); return (err_code); } while (0)
-#define RETURN_SET_ERROR_ERRNO(err_info, err_code) do { _SET_ERROR_ERRNO(err_info, err_code); return (err_code); } while (0)
+#define RETURN_SET_ERROR(err_info_ptr, err_code) do { _SET_ERROR(err_info_ptr, err_code); return (err_code); } while (0)
+#define RETURN_SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra) do { _SET_ERROR_EXTRA(err_info_ptr, err_code, err_extra); return (err_code); } while (0)
+#define RETURN_SET_ERROR_ERRNO(err_info_ptr, err_code) do { _SET_ERROR_ERRNO(err_info_ptr, err_code); return (err_code); } while (0)
#endif
--- a/src/nexus.c Sun Feb 22 06:44:16 2009 +0200
+++ b/src/nexus.c Sun Feb 22 06:52:55 2009 +0200
@@ -108,9 +108,13 @@
struct sock_stream *sock;
char line_buf[LINE_LENGTH + 1];
struct recvline_state recvline_ctx;
+ struct error_info err;
// initialize
- sock_init();
+ if (sock_init(&err))
+ // XXX: ...
+ errx(1, "sock_init");
+
memset(&recvline_ctx, 0, sizeof(recvline_ctx));
// over-simplified connect
--- a/src/sock.c Sun Feb 22 06:44:16 2009 +0200
+++ b/src/sock.c Sun Feb 22 06:52:55 2009 +0200
@@ -4,14 +4,14 @@
#include <assert.h>
-err_t sock_init (void)
+err_t sock_init (struct error_info *err)
{
- err_t err;
+ // XXX: just call these all directly for now
+ if (sock_gnutls_init(err))
+ return ERROR_CODE(err);
- // XXX: just call these all directly for now
-
- if ((err = sock_gnutls_init()))
- return err;
+ // done
+ return SUCCESS;
}
void sock_stream_init (struct sock_stream *sock, struct sock_stream_type *type)
@@ -38,5 +38,5 @@
void sock_stream_error (struct sock_stream *sock, struct error_info *err)
{
// copy from SOCK_ER
- *err = SOCK_ERR(sock);
+ *err = *SOCK_ERR(sock);
}
--- a/src/sock.h Sun Feb 22 06:44:16 2009 +0200
+++ b/src/sock.h Sun Feb 22 06:52:55 2009 +0200
@@ -15,7 +15,7 @@
/*
* Initialize the socket module's global state. Call this before calling any other sock_* functions.
*/
-err_t sock_init (void);
+err_t sock_init (struct error_info *err);
/*
* A simple blocking TCP connect to the given host/service, using getaddrinfo. The connected socket is returned via
--- a/src/sock_gnutls.c Sun Feb 22 06:44:16 2009 +0200
+++ b/src/sock_gnutls.c Sun Feb 22 06:52:55 2009 +0200
@@ -43,24 +43,26 @@
/*
* Configure the given gnutls socket context to use simple anonymous client credentials
- *
- * XXX: errors
*/
-void sock_gnutls_client_ctx_anon (struct sock_gnutls_client_ctx *ctx)
+static err_t sock_gnutls_client_ctx_anon (struct sock_gnutls_client_ctx *ctx, struct error_info *err)
{
- gnutls_certificate_allocate_credentials(&ctx->xcred);
+ // init to use anonymous x509 cert
+ if ((ERROR_EXTRA(err) = gnutls_certificate_allocate_credentials(&ctx->xcred)) < 0)
+ return SET_ERROR(err, ERR_GNUTLS_CERT_ALLOC_CRED);
+
+ // done
+ return SUCCESS;
}
-err_t sock_gnutls_init (void)
+err_t sock_gnutls_init (struct error_info *err)
{
- int _err;
-
// global init
- if ((_err = gnutls_global_init()) < 0)
- errx(1, "gnutls_global_init: %s", gnutls_strerror(_err));
+ if ((ERROR_EXTRA(err) = gnutls_global_init()) < 0)
+ return SET_ERROR(err, ERR_GNUTLS_GLOBAL_INIT);
// init _sock_gnutls_ctx
- sock_gnutls_client_ctx_anon(&_sock_gnutls_client_ctx);
+ if (sock_gnutls_client_ctx_anon(&_sock_gnutls_client_ctx, err))
+ return ERROR_CODE(err);
// done
return SUCCESS;
--- a/src/sock_gnutls.h Sun Feb 22 06:44:16 2009 +0200
+++ b/src/sock_gnutls.h Sun Feb 22 06:52:55 2009 +0200
@@ -40,6 +40,6 @@
/*
* Initialize the global gnutls state
*/
-err_t sock_gnutls_init (void);
+err_t sock_gnutls_init (struct error_info *err);
#endif /* SOCK_GNUTLS_H */
--- a/src/sock_internal.h Sun Feb 22 06:44:16 2009 +0200
+++ b/src/sock_internal.h Sun Feb 22 06:52:55 2009 +0200
@@ -33,7 +33,7 @@
};
#define SOCK_FROM_BASE(sock, type) ((type*) sock)
-#define SOCK_ERR(sock) ((sock)->err)
+#define SOCK_ERR(sock) (&(sock)->err)
/*
* Initialize a sock_stream with the given sock_stream_type.
--- a/src/sock_tcp.c Sun Feb 22 06:44:16 2009 +0200
+++ b/src/sock_tcp.c Sun Feb 22 06:52:55 2009 +0200
@@ -149,7 +149,7 @@
// connect
if ((err = sock_tcp_init_connect(sock, host, service))) {
// set *err_info
- *err_info = SOCK_TCP_ERR(sock);
+ sock_stream_error(SOCK_TCP_BASE(sock), err_info);
// cleanup
sock_tcp_release(sock);