[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 4/4] utils/rpctrace: escape non-printable characters in strings
From: |
Justus Winter |
Subject: |
[PATCH 4/4] utils/rpctrace: escape non-printable characters in strings |
Date: |
Fri, 13 Dec 2013 13:03:07 +0100 |
* utils/rpctrace.c (escape_sequences): New char array mapping
characters to their escape sequence.
(print_data): Escape non-printable characters when printing strings.
---
utils/rpctrace.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/utils/rpctrace.c b/utils/rpctrace.c
index b39b2e3..f6e255b 100644
--- a/utils/rpctrace.c
+++ b/utils/rpctrace.c
@@ -1528,6 +1528,20 @@ print_reply_header (struct send_once_info *info,
mig_reply_header_t *reply,
}
}
+static char escape_sequences[0xff] =
+ {
+ ['\0'] = '0',
+ ['\a'] = 'a',
+ ['\b'] = 'b',
+ ['\f'] = 'f',
+ ['\n'] = 'n',
+ ['\r'] = 'r',
+ ['\t'] = 't',
+ ['\v'] = 'v',
+ ['\\'] = '\\',
+ ['\''] = '\'',
+ ['"'] = '"',
+ };
static void
print_data (mach_msg_type_name_t type,
@@ -1555,8 +1569,38 @@ print_data (mach_msg_type_name_t type,
case MACH_MSG_TYPE_CHAR:
if (nelt > strsize)
nelt = strsize;
- fprintf (ostream, "\"%.*s\"",
- (int) (nelt * eltsize), (const char *) data);
+ fprintf (ostream, "\"");
+ /* Scan data for non-printable characters. p always points to
+ the first character that has not yet been printed. */
+ const char *p, *q;
+ p = q = (const char *) data;
+ while (*q && q - (const char *) data < (int) (nelt * eltsize))
+ {
+ if (isgraph (*q) || *q == ' ')
+ {
+ q += 1;
+ continue;
+ }
+
+ /* We encountered a non-printable character. Print anything
+ that has not been printed so far. */
+ if (p < q)
+ fprintf (ostream, "%.*s", q - p, p);
+
+ char c = escape_sequences[*((const unsigned char *) q)];
+ if (c)
+ fprintf (ostream, "\\%c", c);
+ else
+ fprintf (ostream, "\\x%02x", *((const unsigned char *) q));
+
+ q += 1;
+ p = q;
+ }
+
+ /* Print anything that has not been printed so far. */
+ if (p < q)
+ fprintf (ostream, "%.*s", q - p, p);
+ fprintf (ostream, "\"");
return;
#if 0
--
1.7.10.4