summaryrefslogtreecommitdiff
path: root/examples/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/utils.c')
-rw-r--r--examples/utils.c188
1 files changed, 188 insertions, 0 deletions
diff --git a/examples/utils.c b/examples/utils.c
new file mode 100644
index 0000000..fcd349a
--- /dev/null
+++ b/examples/utils.c
@@ -0,0 +1,188 @@
+/*
+ * ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0
+ *
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * The Original Code is librabbitmq.
+ *
+ * The Initial Developers of the Original Code are LShift Ltd, Cohesive
+ * Financial Technologies LLC, and Rabbit Technologies Ltd. Portions
+ * created before 22-Nov-2008 00:00:00 GMT by LShift Ltd, Cohesive
+ * Financial Technologies LLC, or Rabbit Technologies Ltd are Copyright
+ * (C) 2007-2008 LShift Ltd, Cohesive Financial Technologies LLC, and
+ * Rabbit Technologies Ltd.
+ *
+ * Portions created by LShift Ltd are Copyright (C) 2007-2009 LShift
+ * Ltd. Portions created by Cohesive Financial Technologies LLC are
+ * Copyright (C) 2007-2009 Cohesive Financial Technologies
+ * LLC. Portions created by Rabbit Technologies Ltd are Copyright (C)
+ * 2007-2009 Rabbit Technologies Ltd.
+ *
+ * Portions created by Tony Garnock-Jones are Copyright (C) 2009-2010
+ * LShift Ltd and Tony Garnock-Jones.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): ______________________________________.
+ *
+ * Alternatively, the contents of this file may be used under the terms
+ * of the GNU General Public License Version 2 or later (the "GPL"), in
+ * which case the provisions of the GPL are applicable instead of those
+ * above. If you wish to allow use of your version of this file only
+ * under the terms of the GPL, and not to allow others to use your
+ * version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the
+ * notice and other provisions required by the GPL. If you do not
+ * delete the provisions above, a recipient may use your version of
+ * this file under the terms of any one of the MPL or the GPL.
+ *
+ * ***** END LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <stdint.h>
+#include <amqp.h>
+#include <amqp_framing.h>
+
+#include "utils.h"
+
+void die_on_error(int x, char const *context) {
+ if (x < 0) {
+ char *errstr = amqp_error_string(-x);
+ fprintf(stderr, "%s: %s\n", context, errstr);
+ free(errstr);
+ exit(1);
+ }
+}
+
+void die_on_amqp_error(amqp_rpc_reply_t x, char const *context) {
+ switch (x.reply_type) {
+ case AMQP_RESPONSE_NORMAL:
+ return;
+
+ case AMQP_RESPONSE_NONE:
+ fprintf(stderr, "%s: missing RPC reply type!", context);
+ break;
+
+ case AMQP_RESPONSE_LIBRARY_EXCEPTION:
+ fprintf(stderr, "%s: %s\n", context, amqp_error_string(x.library_error));
+ break;
+
+ case AMQP_RESPONSE_SERVER_EXCEPTION:
+ switch (x.reply.id) {
+ case AMQP_CONNECTION_CLOSE_METHOD: {
+ amqp_connection_close_t *m = (amqp_connection_close_t *) x.reply.decoded;
+ fprintf(stderr, "%s: server connection error %d, message: %.*s",
+ context,
+ m->reply_code,
+ (int) m->reply_text.len, (char *) m->reply_text.bytes);
+ break;
+ }
+ case AMQP_CHANNEL_CLOSE_METHOD: {
+ amqp_channel_close_t *m = (amqp_channel_close_t *) x.reply.decoded;
+ fprintf(stderr, "%s: server channel error %d, message: %.*s",
+ context,
+ m->reply_code,
+ (int) m->reply_text.len, (char *) m->reply_text.bytes);
+ break;
+ }
+ default:
+ fprintf(stderr, "%s: unknown server error, method id 0x%08X", context, x.reply.id);
+ break;
+ }
+ break;
+ }
+
+ exit(1);
+}
+
+static void dump_row(long count, int numinrow, int *chs) {
+ int i;
+
+ printf("%08lX:", count - numinrow);
+
+ if (numinrow > 0) {
+ for (i = 0; i < numinrow; i++) {
+ if (i == 8)
+ printf(" :");
+ printf(" %02X", chs[i]);
+ }
+ for (i = numinrow; i < 16; i++) {
+ if (i == 8)
+ printf(" :");
+ printf(" ");
+ }
+ printf(" ");
+ for (i = 0; i < numinrow; i++) {
+ if (isprint(chs[i]))
+ printf("%c", chs[i]);
+ else
+ printf(".");
+ }
+ }
+ printf("\n");
+}
+
+static int rows_eq(int *a, int *b) {
+ int i;
+
+ for (i=0; i<16; i++)
+ if (a[i] != b[i])
+ return 0;
+
+ return 1;
+}
+
+void amqp_dump(void const *buffer, size_t len) {
+ unsigned char *buf = (unsigned char *) buffer;
+ long count = 0;
+ int numinrow = 0;
+ int chs[16];
+ int oldchs[16];
+ int showed_dots = 0;
+ int i;
+
+ for (i = 0; i < len; i++) {
+ int ch = buf[i];
+
+ if (numinrow == 16) {
+ int i;
+
+ if (rows_eq(oldchs, chs)) {
+ if (!showed_dots) {
+ showed_dots = 1;
+ printf(" .. .. .. .. .. .. .. .. : .. .. .. .. .. .. .. ..\n");
+ }
+ } else {
+ showed_dots = 0;
+ dump_row(count, numinrow, chs);
+ }
+
+ for (i=0; i<16; i++)
+ oldchs[i] = chs[i];
+
+ numinrow = 0;
+ }
+
+ count++;
+ chs[numinrow++] = ch;
+ }
+
+ dump_row(count, numinrow, chs);
+
+ if (numinrow != 0)
+ printf("%08lX:\n", count);
+}