# HG changeset patch # User Tero Marttila # Date 1235282014 -7200 # Node ID 844f014409ff01983bdef256bb9b755ada1ba419 # Parent 240ae8482d649748faad9e674b9bf8c4d355daed and then error_msg diff -r 240ae8482d64 -r 844f014409ff src/error.c --- a/src/error.c Sun Feb 22 07:21:28 2009 +0200 +++ b/src/error.c Sun Feb 22 07:53:34 2009 +0200 @@ -1,6 +1,12 @@ #include "error.h" +#include +#include + +#include +#include + /* * Helper macros */ @@ -26,3 +32,39 @@ } } +const char *error_msg (struct error_info *err) +{ + static char msg[ERROR_MSG_MAXLEN]; + + // intrepret .extra + switch (err->code & _ERR_EXTRA_MASK) { + case ERR_EXTRA_NONE: + // no additional info + snprintf(msg, ERROR_MSG_MAXLEN, "%s", error_name(err->code)); + break; + + case ERR_EXTRA_ERRNO: + // strerror + snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", error_name(err->code), strerror(err->extra)); + break; + + case ERR_EXTRA_GAI: + // gai_strerror + snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", error_name(err->code), gai_strerror(err->extra)); + break; + + case ERR_EXTRA_GNUTLS: + // gnutls_strerror + snprintf(msg, ERROR_MSG_MAXLEN, "%s: %s", error_name(err->code), gnutls_strerror(err->extra)); + break; + + default: + // ??? + snprintf(msg, ERROR_MSG_MAXLEN, "%s(%#.8x): %#.8x", error_name(err->code), err->code, err->extra); + break; + } + + // return static pointer + return msg; +} + diff -r 240ae8482d64 -r 844f014409ff src/error.h --- a/src/error.h Sun Feb 22 07:21:28 2009 +0200 +++ b/src/error.h Sun Feb 22 07:53:34 2009 +0200 @@ -13,31 +13,53 @@ typedef unsigned int err_t; /* + * Bitmask of error_info.extra meanings + */ +enum error_extra_types { + // bit offset of ERR_EXTRA_* mask in error_code + _ERR_EXTRA_OFFSET = 3 * 8, + + // mask of bits used for the error_extra_types value + _ERR_EXTRA_MASK = 0xff << _ERR_EXTRA_OFFSET, + + ERR_EXTRA_NONE = 0x00 << _ERR_EXTRA_OFFSET, + ERR_EXTRA_ERRNO = 0x01 << _ERR_EXTRA_OFFSET, + ERR_EXTRA_GAI = 0x02 << _ERR_EXTRA_OFFSET, + ERR_EXTRA_GNUTLS = 0x03 << _ERR_EXTRA_OFFSET, + +}; + + +#define _ERROR_CODE(name, code, extra) name = (code | ERR_EXTRA_ ## extra) +/* * List of defined error codes, organized mostly by function name */ enum error_code { /* Core functions */ - ERR_CALLOC = 0x000100, + _ERROR_CODE( ERR_CALLOC, 0x000100, NONE ), /* Network resolver errors */ - ERR_GETADDRINFO = 0x000200, - ERR_GETADDRINFO_EMPTY = 0x000201, /* No valid results */ + _ERROR_CODE( ERR_GETADDRINFO, 0x000200, GAI ), + _ERROR_CODE( ERR_GETADDRINFO_EMPTY, 0x000201, GAI ), /* Low-level network errors */ - ERR_SOCKET = 0x000301, - ERR_CONNECT = 0x000302, + _ERROR_CODE( ERR_SOCKET, 0x000301, ERRNO ), + _ERROR_CODE( ERR_CONNECT, 0x000302, ERRNO ), /* Low-level IO errors */ - ERR_READ = 0x000401, - ERR_WRITE = 0x000402, + _ERROR_CODE( ERR_READ, 0x000401, ERRNO ), + _ERROR_CODE( ERR_WRITE, 0x000402, ERRNO ), /* GnuTLS errors */ - ERR_GNUTLS_CERT_ALLOC_CRED = 0x010101, - ERR_GNUTLS_GLOBAL_INIT = 0x010102, - ERR_GNUTLS_INIT = 0x010103, - ERR_GNUTLS_SET_DEFAULT_PRIORITY = 0x010104, - ERR_GNUTLS_CRED_SET = 0x010105, - ERR_GNUTLS_HANDSHAKE = 0x010106, + _ERROR_CODE( ERR_GNUTLS_CERT_ALLOC_CRED, 0x010101, GNUTLS ), + _ERROR_CODE( ERR_GNUTLS_GLOBAL_INIT, 0x010102, GNUTLS ), + _ERROR_CODE( ERR_GNUTLS_INIT, 0x010103, GNUTLS ), + _ERROR_CODE( ERR_GNUTLS_SET_DEFAULT_PRIORITY, 0x010104, GNUTLS ), + _ERROR_CODE( ERR_GNUTLS_CRED_SET, 0x010105, GNUTLS ), + _ERROR_CODE( ERR_GNUTLS_HANDSHAKE, 0x010106, GNUTLS ), + + // mask of bits used for the error_code value + _ERROR_CODE_MASK = 0xffffff, }; /* @@ -52,10 +74,22 @@ }; /* - * Translate an err_t into a string. + * Translate an err_t into a function name. */ const char *error_name (err_t code); +/* + * Maximum length of error messages returned by error_msg (including NUL byte) + */ +#define ERROR_MSG_MAXLEN 1024 + +/* + * Translate an error_info into a message. + * + * This is returned as a pointer into a statically allocated buffer. It is not re-entrant. + */ +const char *error_msg (struct error_info *err); + /** No error, evaulates as logical false */ #define SUCCESS (0) diff -r 240ae8482d64 -r 844f014409ff src/nexus.c --- a/src/nexus.c Sun Feb 22 07:21:28 2009 +0200 +++ b/src/nexus.c Sun Feb 22 07:53:34 2009 +0200 @@ -11,7 +11,7 @@ #include "sock.h" #define CONNECT_HOST "irc.fixme.fi" -#define CONNECT_SERV "6697" +#define CONNECT_SERV "66976" #define LINE_LENGTH 512 struct recvline_state { @@ -112,13 +112,13 @@ // initialize if (sock_init(&err)) - errx(1, "sock_init: %s", error_name(ERROR_CODE(&err))); + errx(1, "sock_init: %s", error_msg(&err)); memset(&recvline_ctx, 0, sizeof(recvline_ctx)); // over-simplified connect if (sock_gnutls_connect(&sock, CONNECT_HOST, CONNECT_SERV, &err)) - errx(1, "sock_gnutls_connect: %s", error_name(ERROR_CODE(&err))); + errx(1, "sock_gnutls_connect: %s", error_msg(&err)); // read lines and dump them out do {