diff options
author | Alan Antonuk <alan.antonuk@gmail.com> | 2013-06-13 13:58:58 -0700 |
---|---|---|
committer | Alan Antonuk <alan.antonuk@gmail.com> | 2013-06-13 16:40:37 -0700 |
commit | 4d9f3abcc30bc628dd872d83233de8744136547d (patch) | |
tree | bc1873175e2cc7dffe5f82334109092d006680fe /librabbitmq/amqp_api.c | |
parent | 0218bb262b9323f431ed84f5c1d1eb1c5bdb1c8b (diff) | |
download | rabbitmq-c-4d9f3abcc30bc628dd872d83233de8744136547d.tar.gz |
Change amqp_error_string() to ret static strings
This is an API/ABI break.
Diffstat (limited to 'librabbitmq/amqp_api.c')
-rw-r--r-- | librabbitmq/amqp_api.c | 92 |
1 files changed, 71 insertions, 21 deletions
diff --git a/librabbitmq/amqp_api.c b/librabbitmq/amqp_api.c index cab0f4b..9f65c4c 100644 --- a/librabbitmq/amqp_api.c +++ b/librabbitmq/amqp_api.c @@ -46,34 +46,84 @@ #include <stdlib.h> #include <string.h> -static const char *client_error_strings[] = { - "operation completed successfully", /* AMQP_STATUS_OK */ - "could not allocate memory", /* AMQP_STATUS_NO_MEMORY */ - "received bad AMQP data", /* AMQP_STATUS_BAD_AQMP_DATA */ - "unknown AMQP class id", /* AMQP_STATUS_UNKNOWN_CLASS */ - "unknown AMQP method id", /* AMQP_STATUS_UNKNOWN_METHOD */ - "hostname lookup failed", /* AMQP_STATUS_GETHOSTBYNAME_FAILED */ - "incompatible AMQP version", /* AMQP_STATUS_INCOMPATIBLE_AMQP_VERSION */ - "connection closed unexpectedly", /* AMQP_STATUS_CONNECTION_CLOSED */ - "could not parse AMQP URL", /* AMQP_STATUS_BAD_AMQP_URL */ - "a socket error occurred", /* AMQP_STATUS_SOCKET_ERROR */ - "a SSL error occurred" /* AMQP_STATUS_SSL_ERROR */ +#define ERROR_MASK (0x00FF) +#define ERROR_CATEGORY_MASK (0xFF00) + +enum error_category_enum_ { + EC_base = 0, + EC_tcp = 1, + EC_ssl = 2 +}; + +static const char *base_error_strings[] = { + "operation completed successfully", /* AMQP_STATUS_OK 0x0 */ + "could not allocate memory", /* AMQP_STATUS_NO_MEMORY -0x0001 */ + "invalid AMQP data", /* AMQP_STATUS_BAD_AQMP_DATA -0x0002 */ + "unknown AMQP class id", /* AMQP_STATUS_UNKNOWN_CLASS -0x0003 */ + "unknown AMQP method id", /* AMQP_STATUS_UNKNOWN_METHOD -0x0004 */ + "hostname lookup failed", /* AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED -0x0005 */ + "incompatible AMQP version", /* AMQP_STATUS_INCOMPATIBLE_AMQP_VERSION -0x0006 */ + "connection closed unexpectedly", /* AMQP_STATUS_CONNECTION_CLOSED -0x0007 */ + "could not parse AMQP URL", /* AMQP_STATUS_BAD_AMQP_URL -0x0008 */ + "a socket error occurred", /* AMQP_STATUS_SOCKET_ERROR -0x0009 */ + "invalid parameter", /* AMQP_STATUS_INVALID_PARAMETER -0x000A */ + "table too large for buffer", /* AMQP_STATUS_TABLE_TOO_BIG -0x000B */ + "unexpected method received" /* AMQP_STATUS_WRONG_METHOD -0x000C */ +}; + +static const char *tcp_error_strings[] = { + "a socket error occurred", /* AMQP_STATUS_TCP_ERROR -0x0100 */ + "socket library initialization failed" /* AMQP_STATUS_TCP_SOCKETLIB_INIT_ERROR -0x0101 */ +}; + +static const char *ssl_error_strings[] = { + "a SSL error occurred", /* AMQP_STATUS_SSL_ERROR -0x0200 */ + "SSL hostname verification failed", /* AMQP_STATUS_SSL_HOSTNAME_VERIFY_FAILED -0x0201 */ + "SSL peer cert verification failed", /* AMQP_STATUS_SSL_PEER_VERIFY_FAILED -0x0202 */ + "SSL handshake failed" /* AMQP_STATUS_SSL_CONNECTION_FAILED -0x0203 */ }; -char *amqp_error_string(int err) +static const char *unknown_error_string = "(unknown error)"; + +const char *amqp_error_string(int code) { - const char *str; - const int max_error_index = sizeof(client_error_strings) / sizeof(char *); + const char *error_string; + size_t category = (((-code) & ERROR_CATEGORY_MASK) >> 16); + size_t error = (-code) & ERROR_MASK; + + switch (category) { + case EC_base: + if (error < (sizeof(base_error_strings) / sizeof(char *))) { + error_string = base_error_strings[error]; + } else { + error_string = unknown_error_string; + } + break; + + case EC_tcp: + if (error < (sizeof(tcp_error_strings) / sizeof(char *))) { + error_string = tcp_error_strings[error]; + } else { + error_string = unknown_error_string; + } + break; + + case EC_ssl: + if (error < (sizeof(ssl_error_strings) / sizeof(char *))) { + error_string = ssl_error_strings[error]; + } else { + error_string = unknown_error_string; + } - err = -err; + break; + + default: + error_string = unknown_error_string; + break; - if (err < 0 || err > max_error_index) { - str = "an unknown error occurred"; - } else { - str = client_error_strings[err]; } - return strdup(str); + return error_string; } void amqp_abort(const char *fmt, ...) |