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

_______________________________________________
Libguestfs mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libguestfs

Reply via email to