Patchwork [v11,1/3] iov: Factor out hexdumper

login
register
mail settings
Submitter Peter Crosthwaite
Date Feb. 27, 2013, 5:17 a.m.
Message ID <faaac219c55ea586d3f748befaf5a2788fd271b8.1361853677.git.peter.crosthwaite@xilinx.com>
Download mbox | patch
Permalink /patch/223500/
State New
Headers show

Comments

Peter Crosthwaite - Feb. 27, 2013, 5:17 a.m.
Factor out the hexdumper functionality from iov for all to use. Useful for
creating verbose debug printfery that dumps packet data.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
changed from v10:
Added Gerd and Red Hat to (c)
reworked iov hexdumper to use iov_to_buf (Gerd Review)
changed from v9:
changed original source info in header to point to Gerds hexdump commit to iov.c
Moved header prototype to qemu-common.h (MJT review)
Added brief comment in header for hexdump()

 include/qemu-common.h |    6 ++++++
 util/Makefile.objs    |    1 +
 util/hexdump.c        |   37 +++++++++++++++++++++++++++++++++++++
 util/iov.c            |   36 +++++++++++-------------------------
 4 files changed, 55 insertions(+), 25 deletions(-)
 create mode 100644 util/hexdump.c
Peter Crosthwaite - March 7, 2013, 11:21 a.m.
Ping!

Any issues here? Peter wanted to give this list time so it missed the
last arm-devs.

Regards,
Peter

On Wed, Feb 27, 2013 at 3:17 PM, Peter Crosthwaite
<peter.crosthwaite@xilinx.com> wrote:
> Factor out the hexdumper functionality from iov for all to use. Useful for
> creating verbose debug printfery that dumps packet data.
>
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> ---
> changed from v10:
> Added Gerd and Red Hat to (c)
> reworked iov hexdumper to use iov_to_buf (Gerd Review)
> changed from v9:
> changed original source info in header to point to Gerds hexdump commit to iov.c
> Moved header prototype to qemu-common.h (MJT review)
> Added brief comment in header for hexdump()
>
>  include/qemu-common.h |    6 ++++++
>  util/Makefile.objs    |    1 +
>  util/hexdump.c        |   37 +++++++++++++++++++++++++++++++++++++
>  util/iov.c            |   36 +++++++++++-------------------------
>  4 files changed, 55 insertions(+), 25 deletions(-)
>  create mode 100644 util/hexdump.c
>
> diff --git a/include/qemu-common.h b/include/qemu-common.h
> index 80016ad..804667a 100644
> --- a/include/qemu-common.h
> +++ b/include/qemu-common.h
> @@ -430,4 +430,10 @@ int64_t pow2floor(int64_t value);
>  int uleb128_encode_small(uint8_t *out, uint32_t n);
>  int uleb128_decode_small(const uint8_t *in, uint32_t *n);
>
> +/*
> + * Hexdump a buffer to a file. An optional string prefix is added to every line
> + */
> +
> +void hexdump(const char *buf, FILE *fp, const char *prefix, size_t size);
> +
>  #endif
> diff --git a/util/Makefile.objs b/util/Makefile.objs
> index 495a178..068ceac 100644
> --- a/util/Makefile.objs
> +++ b/util/Makefile.objs
> @@ -8,3 +8,4 @@ util-obj-y += error.o qemu-error.o
>  util-obj-$(CONFIG_POSIX) += compatfd.o
>  util-obj-y += iov.o aes.o qemu-config.o qemu-sockets.o uri.o notify.o
>  util-obj-y += qemu-option.o qemu-progress.o
> +util-obj-y += hexdump.o
> diff --git a/util/hexdump.c b/util/hexdump.c
> new file mode 100644
> index 0000000..0d0efc8
> --- /dev/null
> +++ b/util/hexdump.c
> @@ -0,0 +1,37 @@
> +/*
> + * Helper to hexdump a buffer
> + *
> + * Copyright (c) 2013 Red Hat, Inc.
> + * Copyright (c) 2013 Gerd Hoffmann <kraxel@redhat.com>
> + * Copyright (c) 2013 Peter Crosthwaite <peter.crosthwaite@xilinx.com>
> + * Copyright (c) 2013 Xilinx, Inc
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + *
> + * Contributions after 2012-01-13 are licensed under the terms of the
> + * GNU GPL, version 2 or (at your option) any later version.
> + */
> +
> +#include "qemu-common.h"
> +
> +void hexdump(const char *buf, FILE *fp, const char *prefix, size_t size)
> +{
> +    unsigned int b;
> +
> +    for (b = 0; b < size; b++) {
> +        if ((b % 16) == 0) {
> +            fprintf(fp, "%s: %04x:", prefix, b);
> +        }
> +        if ((b % 4) == 0) {
> +            fprintf(fp, " ");
> +        }
> +        fprintf(fp, " %02x", (unsigned char)buf[b]);
> +        if ((b % 16) == 15) {
> +            fprintf(fp, "\n");
> +        }
> +    }
> +    if ((b % 16) != 0) {
> +        fprintf(fp, "\n");
> +    }
> +}
> diff --git a/util/iov.c b/util/iov.c
> index fbe675d..9dae318 100644
> --- a/util/iov.c
> +++ b/util/iov.c
> @@ -201,32 +201,18 @@ ssize_t iov_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt,
>  void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
>                   FILE *fp, const char *prefix, size_t limit)
>  {
> -    unsigned int i, v, b;
> -    uint8_t *c;
> -
> -    c = iov[0].iov_base;
> -    for (i = 0, v = 0, b = 0; b < limit; i++, b++) {
> -        if (i == iov[v].iov_len) {
> -            i = 0; v++;
> -            if (v == iov_cnt) {
> -                break;
> -            }
> -            c = iov[v].iov_base;
> -        }
> -        if ((b % 16) == 0) {
> -            fprintf(fp, "%s: %04x:", prefix, b);
> -        }
> -        if ((b % 4) == 0) {
> -            fprintf(fp, " ");
> -        }
> -        fprintf(fp, " %02x", c[i]);
> -        if ((b % 16) == 15) {
> -            fprintf(fp, "\n");
> -        }
> -    }
> -    if ((b % 16) != 0) {
> -        fprintf(fp, "\n");
> +    int v;
> +    size_t size = 0;
> +    char *buf;
> +
> +    for (v = 0; v < iov_cnt; v++) {
> +        size += iov[v].iov_len;
>      }
> +    size = size > limit ? limit : size;
> +    buf = g_malloc(size);
> +    iov_to_buf(iov, iov_cnt, 0, buf, size);
> +    hexdump(buf, fp, prefix, size);
> +    g_free(buf);
>  }
>
>  unsigned iov_copy(struct iovec *dst_iov, unsigned int dst_iov_cnt,
> --
> 1.7.0.4
>
Peter Maydell - March 15, 2013, 2:51 p.m.
On 27 February 2013 05:17, Peter Crosthwaite
<peter.crosthwaite@xilinx.com> wrote:
> Factor out the hexdumper functionality from iov for all to use. Useful for
> creating verbose debug printfery that dumps packet data.
>
> Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

-- PMM

Patch

diff --git a/include/qemu-common.h b/include/qemu-common.h
index 80016ad..804667a 100644
--- a/include/qemu-common.h
+++ b/include/qemu-common.h
@@ -430,4 +430,10 @@  int64_t pow2floor(int64_t value);
 int uleb128_encode_small(uint8_t *out, uint32_t n);
 int uleb128_decode_small(const uint8_t *in, uint32_t *n);
 
+/*
+ * Hexdump a buffer to a file. An optional string prefix is added to every line
+ */
+
+void hexdump(const char *buf, FILE *fp, const char *prefix, size_t size);
+
 #endif
diff --git a/util/Makefile.objs b/util/Makefile.objs
index 495a178..068ceac 100644
--- a/util/Makefile.objs
+++ b/util/Makefile.objs
@@ -8,3 +8,4 @@  util-obj-y += error.o qemu-error.o
 util-obj-$(CONFIG_POSIX) += compatfd.o
 util-obj-y += iov.o aes.o qemu-config.o qemu-sockets.o uri.o notify.o
 util-obj-y += qemu-option.o qemu-progress.o
+util-obj-y += hexdump.o
diff --git a/util/hexdump.c b/util/hexdump.c
new file mode 100644
index 0000000..0d0efc8
--- /dev/null
+++ b/util/hexdump.c
@@ -0,0 +1,37 @@ 
+/*
+ * Helper to hexdump a buffer
+ *
+ * Copyright (c) 2013 Red Hat, Inc.
+ * Copyright (c) 2013 Gerd Hoffmann <kraxel@redhat.com>
+ * Copyright (c) 2013 Peter Crosthwaite <peter.crosthwaite@xilinx.com>
+ * Copyright (c) 2013 Xilinx, Inc
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ * Contributions after 2012-01-13 are licensed under the terms of the
+ * GNU GPL, version 2 or (at your option) any later version.
+ */
+
+#include "qemu-common.h"
+
+void hexdump(const char *buf, FILE *fp, const char *prefix, size_t size)
+{
+    unsigned int b;
+
+    for (b = 0; b < size; b++) {
+        if ((b % 16) == 0) {
+            fprintf(fp, "%s: %04x:", prefix, b);
+        }
+        if ((b % 4) == 0) {
+            fprintf(fp, " ");
+        }
+        fprintf(fp, " %02x", (unsigned char)buf[b]);
+        if ((b % 16) == 15) {
+            fprintf(fp, "\n");
+        }
+    }
+    if ((b % 16) != 0) {
+        fprintf(fp, "\n");
+    }
+}
diff --git a/util/iov.c b/util/iov.c
index fbe675d..9dae318 100644
--- a/util/iov.c
+++ b/util/iov.c
@@ -201,32 +201,18 @@  ssize_t iov_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt,
 void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt,
                  FILE *fp, const char *prefix, size_t limit)
 {
-    unsigned int i, v, b;
-    uint8_t *c;
-
-    c = iov[0].iov_base;
-    for (i = 0, v = 0, b = 0; b < limit; i++, b++) {
-        if (i == iov[v].iov_len) {
-            i = 0; v++;
-            if (v == iov_cnt) {
-                break;
-            }
-            c = iov[v].iov_base;
-        }
-        if ((b % 16) == 0) {
-            fprintf(fp, "%s: %04x:", prefix, b);
-        }
-        if ((b % 4) == 0) {
-            fprintf(fp, " ");
-        }
-        fprintf(fp, " %02x", c[i]);
-        if ((b % 16) == 15) {
-            fprintf(fp, "\n");
-        }
-    }
-    if ((b % 16) != 0) {
-        fprintf(fp, "\n");
+    int v;
+    size_t size = 0;
+    char *buf;
+
+    for (v = 0; v < iov_cnt; v++) {
+        size += iov[v].iov_len;
     }
+    size = size > limit ? limit : size;
+    buf = g_malloc(size);
+    iov_to_buf(iov, iov_cnt, 0, buf, size);
+    hexdump(buf, fp, prefix, size);
+    g_free(buf);
 }
 
 unsigned iov_copy(struct iovec *dst_iov, unsigned int dst_iov_cnt,