[Libguestfs] [PATCH v2 API PROPOSAL 5/5] inspector: Add support for interfaces.

Richard W.M. Jones rjones at redhat.com
Mon Oct 1 19:16:49 UTC 2018


Creates XML output which looks like this:

    <interfaces>
      <interface name="ens2" type="ethernet">
        <parameters>
          <parameter name="bootproto">dhcp</parameter>
          <parameter name="browser_only">0</parameter>
          <parameter name="defroute">1</parameter>
          <parameter name="ipv4_failure_fatal">0</parameter>
          <parameter name="ipv6_autoconf">1</parameter>
          <parameter name="ipv6_defroute">1</parameter>
          <parameter name="ipv6_failure_fatal">0</parameter>
          <parameter name="ipv6init">1</parameter>
          <parameter name="netboot">1</parameter>
          <parameter name="onboot">1</parameter>
          <parameter name="proxy_method">none</parameter>
          <parameter name="uuid">b90eea1d-36df-4196-862c-8f10432bcbc7</parameter>
        </parameters>
      </interface>
      <interface name="lo">
        <parameters>
          <parameter name="broadcast">127.255.255.255</parameter>
          <parameter name="ipaddr">127.0.0.1</parameter>
          <parameter name="netmask">255.0.0.0</parameter>
          <parameter name="network">127.0.0.0</parameter>
          <parameter name="onboot">1</parameter>
        </parameters>
      </interface>
    </interfaces>
---
 inspector/inspector.c | 81 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/inspector/inspector.c b/inspector/inspector.c
index 9be8f5110..066ed61bc 100644
--- a/inspector/inspector.c
+++ b/inspector/inspector.c
@@ -66,6 +66,7 @@ static void output_root (xmlTextWriterPtr xo, char *root);
 static void output_mountpoints (xmlTextWriterPtr xo, char *root);
 static void output_filesystems (xmlTextWriterPtr xo, char *root);
 static void output_drive_mappings (xmlTextWriterPtr xo, char *root);
+static void output_interfaces (xmlTextWriterPtr xo, char *root);
 static void output_applications (xmlTextWriterPtr xo, char *root);
 static void do_xpath (const char *query);
 
@@ -463,6 +464,8 @@ output_root (xmlTextWriterPtr xo, char *root)
 
   output_drive_mappings (xo, root);
 
+  output_interfaces (xo, root);
+
   /* We need to mount everything up in order to read out the list of
    * applications and the icon, ie. everything below this point.
    */
@@ -668,6 +671,84 @@ output_drive_mappings (xmlTextWriterPtr xo, char *root)
   XMLERROR (-1, xmlTextWriterEndElement (xo));
 }
 
+static int
+compare_if_name (const void *p1, const void *p2)
+{
+  const struct guestfs_interface *if1 = p1;
+  const struct guestfs_interface *if2 = p2;
+
+  return strcmp (if1->if_name, if2->if_name);
+}
+
+static void
+output_interfaces (xmlTextWriterPtr xo, char *root)
+{
+  CLEANUP_FREE_INTERFACE_LIST struct guestfs_interface_list *interfaces = NULL;
+  size_t i;
+
+  guestfs_push_error_handler (g, NULL, NULL);
+  interfaces = guestfs_inspect_get_interfaces (g, root);
+  guestfs_pop_error_handler (g);
+  if (interfaces == NULL || interfaces->len == 0)
+    return;
+
+  /* Sort by if_name. */
+  qsort (interfaces->val, interfaces->len, sizeof (struct guestfs_interface),
+         compare_if_name);
+
+  XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "interfaces"));
+
+  for (i = 0; i < interfaces->len; ++i) {
+    XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "interface"));
+    if (STRNEQ (interfaces->val[i].if_name, ""))
+      XMLERROR (-1,
+                xmlTextWriterWriteAttribute (xo, BAD_CAST "name",
+                                             BAD_CAST
+                                             interfaces->val[i].if_name));
+    if (STRNEQ (interfaces->val[i].if_type, ""))
+      XMLERROR (-1,
+                xmlTextWriterWriteAttribute (xo, BAD_CAST "type",
+                                             BAD_CAST
+                                             interfaces->val[i].if_type));
+    if (STRNEQ (interfaces->val[i].if_hwaddr, ""))
+      XMLERROR (-1,
+                xmlTextWriterWriteAttribute (xo, BAD_CAST "hwaddr",
+                                             BAD_CAST
+                                             interfaces->val[i].if_hwaddr));
+
+    /* Parameters. */
+    CLEANUP_FREE_STRING_LIST char **params =
+      guestfs_inspect_get_interface_parameters (g, root, (int) i);
+    size_t j;
+
+    if (params == NULL || params[0] == NULL)
+      goto noparams;
+
+    XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "parameters"));
+
+    /* Sort by key. */
+    qsort (params,
+           guestfs_int_count_strings (params) / 2, 2 * sizeof (char *),
+           compare_keys_nocase);
+
+    for (j = 0; params[j] != NULL; j += 2) {
+      XMLERROR (-1,
+                xmlTextWriterStartElement (xo, BAD_CAST "parameter"));
+      XMLERROR (-1,
+                xmlTextWriterWriteAttribute (xo, BAD_CAST "name",
+                                             BAD_CAST params[j]));
+      XMLERROR (-1, xmlTextWriterWriteString (xo, BAD_CAST params[j+1]));
+      XMLERROR (-1, xmlTextWriterEndElement (xo));
+    }
+
+    XMLERROR (-1, xmlTextWriterEndElement (xo));
+  noparams:
+    XMLERROR (-1, xmlTextWriterEndElement (xo));
+  }
+
+  XMLERROR (-1, xmlTextWriterEndElement (xo));
+}
+
 static void
 output_applications (xmlTextWriterPtr xo, char *root)
 {
-- 
2.19.0.rc0




More information about the Libguestfs mailing list