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.
This commit is contained in:
Willy Tarreau 2016-12-05 00:10:57 +01:00
parent 990397ed2e
commit 0ebb511b3e
2 changed files with 51 additions and 0 deletions

View File

@ -24,6 +24,7 @@
#include <limits.h> #include <limits.h>
#include <string.h> #include <string.h>
#include <stdio.h>
#include <time.h> #include <time.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
@ -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) #define fddebug(msg...) do { char *_m = NULL; memprintf(&_m, ##msg); if (_m) write(-1, _m, strlen(_m)); free(_m); } while (0)
/* displays a <len> long memory block at <buf>, assuming first byte of <buf>
* has address <baseaddr>. The output is emitted to file <out>.
*/
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 /* used from everywhere just to drain results we don't want to read and which
* recent versions of gcc increasingly and annoyingly complain about. * recent versions of gcc increasingly and annoyingly complain about.
*/ */

View File

@ -3765,6 +3765,51 @@ int dump_text_line(struct chunk *out, const char *buf, int bsize, int len,
return ptr; return ptr;
} }
/* displays a <len> long memory block at <buf>, assuming first byte of <buf>
* has address <baseaddr>. The output is emitted to file <out>.
*/
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: * Local variables:
* c-indent-level: 8 * c-indent-level: 8