On Fri, Feb 28, 2014 at 08:47:45PM +0100, Jacob Erlbeck wrote:
Good morning Jacob,
as usual thank you very much for your work.
This function works like osmo_hexdump() and return a
static buffer
^ returns
containing hex bytes along with markes for the layers.
^ markers
+/*! \brief Return (static) buffer containing a
hexdump of the msg
^ Return "a"
+const char *msgb_hexdump(const struct msgb *msg)
+{
+ static char buf[4100];
+ int buf_offs = 0;
+ int nchars;
+ const unsigned char *start = msg->data;
+ const unsigned char *lxhs[4];
+ int i;
+
+ lxhs[0] = msg->l1h;
+ lxhs[1] = msg->l2h;
+ lxhs[2] = msg->l3h;
+ lxhs[3] = msg->l4h;
+
+ for (i = 0; i < ARRAY_SIZE(lxhs); i++) {
+ if (lxhs[i]) {
if (!lxhs[i])
continue;
This avoids having the show at three levels of indention in.
+ nchars = snprintf(buf + buf_offs, sizeof(buf) -
buf_offs,
+ "%s[L%d]> ",
+ osmo_hexdump(start, lxhs[i] - start),
+ i+1);
+ nchars = snprintf(buf + buf_offs, sizeof(buf) -
buf_offs,
+ "%s", osmo_hexdump(start, msg->tail - start));
+ nchars = snprintf(buf, sizeof(buf) - buf_offs,
+ "!!! L%d out of range", i+1);
So sizeof(buf) - buf_offs can only be 0 when the output is already null
terminated?
kind regards
holger