summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorDavid Wragg <dpw@lshift.net>2010-05-30 23:31:40 +0100
committerDavid Wragg <dpw@lshift.net>2010-05-30 23:31:40 +0100
commit66a0a987914626fc0ea86067a0ea1dd7a2bebdd2 (patch)
tree0e400acdd2e7f35ed47b94d51308b142e82dbeac /tools
parent7e8fbea4c9212774c101e33218d26a0dc992dc03 (diff)
downloadrabbitmq-c-github-ask-66a0a987914626fc0ea86067a0ea1dd7a2bebdd2.tar.gz
Make error codes returned by librabbitmq functions opaque
Windows doesn't generally use POSIX error codes, which poses a problem for librabbitmq's approach of using those error codes in its API. So make the librabbitmq error codes opaque: They are still be integers, but client code is not supposed to assume anything about them, except that they can be passed to a new amqp_error_string() function which returns the corresponding error message Internally, the error codes are either taken from a set of librabbitmq-specific values, or correspond to an OS-specific (POSIX or win32) error code, with a simple encoding to indicate which is which.
Diffstat (limited to 'tools')
-rw-r--r--tools/common.c54
-rw-r--r--tools/common.h6
-rw-r--r--tools/consume.c8
-rw-r--r--tools/publish.c3
4 files changed, 33 insertions, 38 deletions
diff --git a/tools/common.c b/tools/common.c
index d4771ac..ec24085 100644
--- a/tools/common.c
+++ b/tools/common.c
@@ -84,11 +84,24 @@ void die_errno(int err, const char *fmt, ...)
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
- fprintf(stderr, ": %s\n", strerror(err));
+ fprintf(stderr, ": %s\n", strerror(errno));
exit(1);
}
-char *amqp_server_exception_string(amqp_rpc_reply_t r)
+void die_amqp_error(int err, const char *fmt, ...)
+{
+ if (err <= 0)
+ return;
+
+ va_list ap;
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fprintf(stderr, ": %s\n", amqp_error_string(err));
+ exit(1);
+}
+
+const char *amqp_server_exception_string(amqp_rpc_reply_t r)
{
int res;
char *s;
@@ -123,26 +136,17 @@ char *amqp_server_exception_string(amqp_rpc_reply_t r)
return res >= 0 ? s : NULL;
}
-char *amqp_rpc_reply_string(amqp_rpc_reply_t r)
+const char *amqp_rpc_reply_string(amqp_rpc_reply_t r)
{
- const char *s;
-
switch (r.reply_type) {
case AMQP_RESPONSE_NORMAL:
- s = "normal response";
- break;
+ return strdup("normal response");
case AMQP_RESPONSE_NONE:
- s = "missing RPC reply type";
- break;
+ return strdup("missing RPC reply type");
case AMQP_RESPONSE_LIBRARY_EXCEPTION:
- if (r.library_errno)
- s = strerror(r.library_errno);
- else
- s = "end of stream";
-
- break;
+ return amqp_error_string(r.library_error);
case AMQP_RESPONSE_SERVER_EXCEPTION:
return amqp_server_exception_string(r);
@@ -150,8 +154,6 @@ char *amqp_rpc_reply_string(amqp_rpc_reply_t r)
default:
abort();
}
-
- return strdup(s);
}
void die_rpc(amqp_rpc_reply_t r, const char *fmt, ...)
@@ -220,13 +222,8 @@ amqp_connection_state_t make_connection(void)
}
s = amqp_open_socket(host, port ? port : 5672);
- if (s < 0) {
- if (s == -ENOENT)
- die("unknown host %s", host);
- else
- die_errno(-s, "opening socket to %s", amqp_server);
- }
-
+ die_amqp_error(-s, "opening socket to %s", amqp_server);
+
set_cloexec(s);
conn = amqp_new_connection();
@@ -252,8 +249,7 @@ void close_connection(amqp_connection_state_t conn)
"closing connection");
res = amqp_end_connection(conn);
- if (res < 0)
- die_errno(-res, "closing connection");
+ die_amqp_error(-res, "closing connection");
}
amqp_bytes_t read_all(int fd)
@@ -304,8 +300,7 @@ void copy_body(amqp_connection_state_t conn, int fd)
amqp_frame_t frame;
int res = amqp_simple_wait_frame(conn, &frame);
- if (res < 0)
- die_errno(-res, "waiting for header frame");
+ die_amqp_error(-res, "waiting for header frame");
if (frame.frame_type != AMQP_FRAME_HEADER)
die("expected header, got frame type 0x%X",
frame.frame_type);
@@ -313,8 +308,7 @@ void copy_body(amqp_connection_state_t conn, int fd)
body_remaining = frame.payload.properties.body_size;
while (body_remaining) {
res = amqp_simple_wait_frame(conn, &frame);
- if (res < 0)
- die_errno(-res, "waiting for body frame");
+ die_amqp_error(-res, "waiting for body frame");
if (frame.frame_type != AMQP_FRAME_BODY)
die("expected body, got frame type 0x%X",
frame.frame_type);
diff --git a/tools/common.h b/tools/common.h
index 8ea754c..b3d8ab9 100644
--- a/tools/common.h
+++ b/tools/common.h
@@ -55,13 +55,15 @@
#include <amqp.h>
#include <amqp_framing.h>
-extern char *amqp_server_exception_string(amqp_rpc_reply_t r);
-extern char *amqp_rpc_reply_string(amqp_rpc_reply_t r);
+extern const char *amqp_server_exception_string(amqp_rpc_reply_t r);
+extern const char *amqp_rpc_reply_string(amqp_rpc_reply_t r);
extern void die(const char *fmt, ...)
__attribute__ ((format (printf, 1, 2)));
extern void die_errno(int err, const char *fmt, ...)
__attribute__ ((format (printf, 2, 3)));
+extern void die_amqp_error(int err, const char *fmt, ...)
+ __attribute__ ((format (printf, 2, 3)));
extern void die_rpc(amqp_rpc_reply_t r, const char *fmt, ...)
__attribute__ ((format (printf, 2, 3)));
diff --git a/tools/consume.c b/tools/consume.c
index b6bd5e2..9999960 100644
--- a/tools/consume.c
+++ b/tools/consume.c
@@ -155,8 +155,7 @@ static void do_consume(amqp_connection_state_t conn, amqp_bytes_t queue,
struct pipeline pl;
uint64_t delivery_tag;
int res = amqp_simple_wait_frame(conn, &frame);
- if (res < 0)
- die_errno(-res, "waiting for header frame");
+ die_amqp_error(res, "waiting for header frame");
if (frame.frame_type != AMQP_FRAME_METHOD
|| frame.payload.method.id != AMQP_BASIC_DELIVER_METHOD)
@@ -170,8 +169,9 @@ static void do_consume(amqp_connection_state_t conn, amqp_bytes_t queue,
copy_body(conn, pl.infd);
if (finish_pipeline(&pl) && !no_ack)
- die_errno(-amqp_basic_ack(conn, 1, delivery_tag, 0),
- "basic.ack");
+ die_amqp_error(amqp_basic_ack(conn, 1, delivery_tag,
+ 0),
+ "basic.ack");
amqp_maybe_release_buffers(conn);
}
diff --git a/tools/publish.c b/tools/publish.c
index 15d2386..0917dae 100644
--- a/tools/publish.c
+++ b/tools/publish.c
@@ -64,8 +64,7 @@ static void do_publish(amqp_connection_state_t conn,
cstring_bytes(exchange),
cstring_bytes(routing_key),
0, 0, props, body);
- if (res != 0)
- die_errno(-res, "basic.publish");
+ die_amqp_error(res, "basic.publish");
}
int main(int argc, const char **argv)