From 0ebb511b3ea1b4b00410cedfec5c6bef47d4831a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 5 Dec 2016 00:10:57 +0100 Subject: [PATCH] MINOR: tools: add a generic hexdump function for debugging debug_hexdump() prints to the requested output stream (typically stdout or stderr) an hex dump of the blob passed in argument. This is useful to help debug binary protocols. --- include/common/standard.h | 6 ++++++ src/standard.c | 45 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/include/common/standard.h b/include/common/standard.h index e16b30414..68244dbe7 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -990,6 +991,11 @@ char *env_expand(char *in); */ #define fddebug(msg...) do { char *_m = NULL; memprintf(&_m, ##msg); if (_m) write(-1, _m, strlen(_m)); free(_m); } while (0) +/* displays a long memory block at , assuming first byte of + * has address . The output is emitted to file . + */ +void debug_hexdump(FILE *out, char *buf, unsigned int baseaddr, int len); + /* used from everywhere just to drain results we don't want to read and which * recent versions of gcc increasingly and annoyingly complain about. */ diff --git a/src/standard.c b/src/standard.c index 079aef8f7..910e1c298 100644 --- a/src/standard.c +++ b/src/standard.c @@ -3765,6 +3765,51 @@ int dump_text_line(struct chunk *out, const char *buf, int bsize, int len, return ptr; } +/* displays a long memory block at , assuming first byte of + * has address . The output is emitted to file . + */ +void debug_hexdump(FILE *out, char *buf, unsigned int baseaddr, int len) +{ + unsigned int i, j; + int b; + + for (i = 0; i < (len + (baseaddr & 15)); i += 16) { + b = i - (baseaddr & 15); + fprintf(out, "%08x: ", i + (baseaddr & ~15)); + for (j = 0; j < 8; j++) { + if (b + j >= 0 && b + j < len) + fprintf(out, "%02x ", (unsigned char)buf[b + j]); + else + fprintf(out, " "); + } + + if (b + j >= 0 && b + j < len) + fputc('-', out); + else + fputc(' ', out); + + for (j = 8; j < 16; j++) { + if (b + j >= 0 && b + j < len) + fprintf(out, " %02x", (unsigned char)buf[b + j]); + else + fprintf(out, " "); + } + + fprintf(out, " "); + for (j = 0; j < 16; j++) { + if (b + j >= 0 && b + j < len) { + if (isprint((unsigned char)buf[b + j])) + fputc((unsigned char)buf[b + j], out); + else + fputc('.', out); + } + else + fputc(' ', out); + } + fputc('\n', out); + } +} + /* * Local variables: * c-indent-level: 8