[RFC,v1] iov: Factor out hexdumper

Submitted by Peter Crosthwaite on Feb. 7, 2013, 6:22 a.m.

Details

Message ID 8236283a-5f9a-4d07-9230-8b3319349c54@AM1EHSMHS002.ehs.local
State New
Headers show

Commit Message

Peter Crosthwaite Feb. 7, 2013, 6:22 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>
---
See v9 of the pl330 series for example usage.

 include/qemu/hexdump.h |    3 +++
 util/Makefile.objs     |    1 +
 util/hexdump.c         |   23 +++++++++++++++++++++++
 util/iov.c             |   31 ++++++-------------------------
 4 files changed, 33 insertions(+), 25 deletions(-)
 create mode 100644 include/qemu/hexdump.h
 create mode 100644 util/hexdump.c

Comments

Stefan Hajnoczi Feb. 7, 2013, 8:56 a.m.
On Thu, Feb 07, 2013 at 04:22:02PM +1000, Peter Crosthwaite wrote:
> diff --git a/util/hexdump.c b/util/hexdump.c
> new file mode 100644
> index 0000000..38d64ca
> --- /dev/null
> +++ b/util/hexdump.c
> @@ -0,0 +1,23 @@

License/copyright header missing.

Looks good otherwise.

Stefan
Peter Crosthwaite Feb. 8, 2013, 1:32 a.m.
On Thu, Feb 7, 2013 at 6:56 PM, Stefan Hajnoczi <stefanha@gmail.com> wrote:
> On Thu, Feb 07, 2013 at 04:22:02PM +1000, Peter Crosthwaite wrote:
>> diff --git a/util/hexdump.c b/util/hexdump.c
>> new file mode 100644
>> index 0000000..38d64ca
>> --- /dev/null
>> +++ b/util/hexdump.c
>> @@ -0,0 +1,23 @@
>
> License/copyright header missing.
>
> Looks good otherwise.
>

Thanks Stefan,

Ill fix this and prepend this to v9 of the PL330 series and it can be
cherry picked off the front or merged along with PL330 (which uses
it).

Regards,
Peter

> Stefan
>

Patch hide | download patch | download mbox

diff --git a/include/qemu/hexdump.h b/include/qemu/hexdump.h
new file mode 100644
index 0000000..87bccf4
--- /dev/null
+++ b/include/qemu/hexdump.h
@@ -0,0 +1,3 @@ 
+#include "qemu-common.h"
+
+void hexdump(const char *buf, FILE *fp, const char *prefix, size_t size);
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..38d64ca
--- /dev/null
+++ b/util/hexdump.c
@@ -0,0 +1,23 @@ 
+#include "qemu-common.h"
+#include "qemu/hexdump.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..d89933d 100644
--- a/util/iov.c
+++ b/util/iov.c
@@ -17,6 +17,7 @@ 
  */
 
 #include "qemu/iov.h"
+#include "qemu/hexdump.h"
 
 #ifdef _WIN32
 # include <windows.h>
@@ -201,31 +202,11 @@  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;
+    for (v = 0; v < iov_cnt && limit; v++) {
+        int size = limit < iov[v].iov_len ? limit : iov[v].iov_len;
+        hexdump(iov[v].iov_base, fp, prefix, size);
+        limit -= size;
     }
 }