# HG changeset patch # User Tero Marttila # Date 1235278375 -7200 # Node ID a3ca0f97a075dc5b82c79c8e247857d009bdef68 # Parent cc94ae754e2af4b54c07b09214b8e5a3c1f6571d change ERROR_* to use pointers again, and implement error_info for sock_init diff -r cc94ae754e2a -r a3ca0f97a075 src/error.h --- 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 diff -r cc94ae754e2a -r a3ca0f97a075 src/nexus.c --- 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 diff -r cc94ae754e2a -r a3ca0f97a075 src/sock.c --- 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 -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); } diff -r cc94ae754e2a -r a3ca0f97a075 src/sock.h --- 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 diff -r cc94ae754e2a -r a3ca0f97a075 src/sock_gnutls.c --- 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; diff -r cc94ae754e2a -r a3ca0f97a075 src/sock_gnutls.h --- 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 */ diff -r cc94ae754e2a -r a3ca0f97a075 src/sock_internal.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. diff -r cc94ae754e2a -r a3ca0f97a075 src/sock_tcp.c --- 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);