[Libguestfs] [PATCH 3/3] src: print contents of structs and struct lists on tracing

Pino Toscano ptoscano at redhat.com
Wed Feb 24 12:52:04 UTC 2016


It eases the debugging, instead of getting just the name of the struct
returned.
---
 generator/c.ml | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/generator/c.ml b/generator/c.ml
index 9af4529..7446412 100644
--- a/generator/c.ml
+++ b/generator/c.ml
@@ -1348,6 +1348,7 @@ and generate_client_actions hash () =
 #include \"guestfs-internal-actions.h\"
 #include \"guestfs_protocol.h\"
 #include \"errnostring.h\"
+#include \"structs-print.h\"
 
 ";
 
@@ -1623,7 +1624,7 @@ and generate_client_actions hash () =
 
     let needs_i =
       match ret with
-      | RStringList _ | RHashtable _ -> true
+      | RStringList _ | RHashtable _ | RStructList _ -> true
       | _ -> false in
     if needs_i then (
       pr "%s  size_t i;\n" indent;
@@ -1656,15 +1657,25 @@ and generate_client_actions hash () =
          pr "%s  }\n" indent;
          pr "%s  fputs (\"]\", trace_buffer.fp);\n" indent;
      | RStruct (_, typ) ->
-         (* XXX There is code generated for guestfish for printing
-          * these structures.  We need to make it generally available
-          * for all callers
-          *)
-         pr "%s  fprintf (trace_buffer.fp, \"<struct guestfs_%s *>\");\n"
-           indent typ (* XXX *)
+         pr "%s  fprintf (trace_buffer.fp, \"<struct guestfs_%s = \");\n"
+           indent typ;
+         pr "%s  guestfs_int_print_%s_indent (%s, trace_buffer.fp, \", \", \"\");\n"
+           indent typ rv;
+         pr "%s  fprintf (trace_buffer.fp, \">\");\n" indent
      | RStructList (_, typ) ->
-         pr "%s  fprintf (trace_buffer.fp, \"<struct guestfs_%s_list *>\");\n"
-           indent typ (* XXX *)
+         pr "%s  fprintf (trace_buffer.fp, \"<struct guestfs_%s_list(%%u)\", %s->len);\n"
+           indent typ rv;
+         pr "%s  if (%s->len > 0)\n" indent rv;
+         pr "%s    fprintf (trace_buffer.fp, \" = \");\n" indent;
+         pr "%s  for (i = 0; i < %s->len; ++i) {\n" indent rv;
+         pr "%s    if (i != 0)\n" indent;
+         pr "%s      fprintf (trace_buffer.fp, \" \");\n" indent;
+         pr "%s    fprintf (trace_buffer.fp, \"[%%zu]{\", i);\n" indent;
+         pr "%s    guestfs_int_print_%s_indent (&%s->val[i], trace_buffer.fp, \", \", \"\");\n"
+           indent typ rv;
+         pr "%s    fprintf (trace_buffer.fp, \"}\");\n" indent;
+         pr "%s  }\n" indent;
+         pr "%s  fprintf (trace_buffer.fp, \">\");\n" indent
     );
     pr "%s  guestfs_int_trace_send_line (g, &trace_buffer);\n" indent;
     pr "%s}\n" indent;
-- 
2.5.0




More information about the Libguestfs mailing list