[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCHv2 2/6] seclabel: refactor existing domain_conf usage



On 2011年12月23日 08:47, Eric Blake wrote:
A future patch will parse and output<seclabel>  in more than one
location in a<domain>  xml; make it easier to reuse code.

* src/conf/domain_conf.c (virSecurityLabelDefFree): Rename...
(virSecurityLabelDefClear): ...and make static.
(virSecurityLabelDefParseXML): Alter signature.
(virDomainDefParseXML, virDomainDefFree): Adjust callers.
(virDomainDefFormatInternal): Split output...
(virSecurityLabelDefFormat): ...into new helper.
---
  src/conf/domain_conf.c |  118 ++++++++++++++++++++++++++---------------------
  1 files changed, 65 insertions(+), 53 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 2897b4a..2379c81 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1326,14 +1326,13 @@ void virDomainDeviceDefFree(virDomainDeviceDefPtr def)
      VIR_FREE(def);
  }

-void virSecurityLabelDefFree(virDomainDefPtr def);
-
-void virSecurityLabelDefFree(virDomainDefPtr def)
+static void
+virSecurityLabelDefClear(virSecurityLabelDefPtr def)
  {
-    VIR_FREE(def->seclabel.model);
-    VIR_FREE(def->seclabel.label);
-    VIR_FREE(def->seclabel.imagelabel);
-    VIR_FREE(def->seclabel.baselabel);
+    VIR_FREE(def->model);
+    VIR_FREE(def->label);
+    VIR_FREE(def->imagelabel);
+    VIR_FREE(def->baselabel);
  }

  static void
@@ -1467,7 +1466,7 @@ void virDomainDefFree(virDomainDefPtr def)

      virDomainMemballoonDefFree(def->memballoon);

-    virSecurityLabelDefFree(def);
+    virSecurityLabelDefClear(&def->seclabel);

      virCPUDefFree(def->cpu);

@@ -6212,7 +6211,7 @@ static int virDomainLifecycleParseXML(xmlXPathContextPtr ctxt,
  }

  static int
-virSecurityLabelDefParseXML(const virDomainDefPtr def,
+virSecurityLabelDefParseXML(virSecurityLabelDefPtr def,
                              xmlXPathContextPtr ctxt,
                              unsigned int flags)
  {
@@ -6228,9 +6227,9 @@ virSecurityLabelDefParseXML(const virDomainDefPtr def,
                               "%s", _("missing security type"));
          goto error;
      }
-    def->seclabel.type = virDomainSeclabelTypeFromString(p);
+    def->type = virDomainSeclabelTypeFromString(p);
      VIR_FREE(p);
-    if (def->seclabel.type<  0) {
+    if (def->type<  0) {
          virDomainReportError(VIR_ERR_XML_ERROR,
                               "%s", _("invalid security type"));
          goto error;
@@ -6239,9 +6238,9 @@ virSecurityLabelDefParseXML(const virDomainDefPtr def,
                              VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
      if (p != NULL) {
          if (STREQ(p, "yes")) {
-            def->seclabel.norelabel = false;
+            def->norelabel = false;
          } else if (STREQ(p, "no")) {
-            def->seclabel.norelabel = true;
+            def->norelabel = true;
          } else {
              virDomainReportError(VIR_ERR_XML_ERROR,
                                   _("invalid security relabel value %s"), p);
@@ -6249,23 +6248,23 @@ virSecurityLabelDefParseXML(const virDomainDefPtr def,
              goto error;
          }
          VIR_FREE(p);
-        if (def->seclabel.type == VIR_DOMAIN_SECLABEL_DYNAMIC&&
-            def->seclabel.norelabel) {
+        if (def->type == VIR_DOMAIN_SECLABEL_DYNAMIC&&
+            def->norelabel) {
              virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                                   "%s", _("dynamic label type must use resource relabeling"));
              goto error;
          }
      } else {
-        if (def->seclabel.type == VIR_DOMAIN_SECLABEL_STATIC)
-            def->seclabel.norelabel = true;
+        if (def->type == VIR_DOMAIN_SECLABEL_STATIC)
+            def->norelabel = true;
          else
-            def->seclabel.norelabel = false;
+            def->norelabel = false;
      }

      /* Only parse label, if using static labels, or
       * if the 'live' VM XML is requested
       */
-    if (def->seclabel.type == VIR_DOMAIN_SECLABEL_STATIC ||
+    if (def->type == VIR_DOMAIN_SECLABEL_STATIC ||
          !(flags&  VIR_DOMAIN_XML_INACTIVE)) {
          p = virXPathStringLimit("string(./seclabel/label[1])",
                                  VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
@@ -6275,11 +6274,11 @@ virSecurityLabelDefParseXML(const virDomainDefPtr def,
              goto error;
          }

-        def->seclabel.label = p;
+        def->label = p;
      }

      /* Only parse imagelabel, if requested live XML with relabeling */
-    if (!def->seclabel.norelabel&&
+    if (!def->norelabel&&
          !(flags&  VIR_DOMAIN_XML_INACTIVE)) {
          p = virXPathStringLimit("string(./seclabel/imagelabel[1])",
                                  VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
@@ -6288,22 +6287,22 @@ virSecurityLabelDefParseXML(const virDomainDefPtr def,
                                   "%s", _("security imagelabel is missing"));
              goto error;
          }
-        def->seclabel.imagelabel = p;
+        def->imagelabel = p;
      }

      /* Only parse baselabel, for dynamic label */
-    if (def->seclabel.type == VIR_DOMAIN_SECLABEL_DYNAMIC) {
+    if (def->type == VIR_DOMAIN_SECLABEL_DYNAMIC) {
          p = virXPathStringLimit("string(./seclabel/baselabel[1])",
                                  VIR_SECURITY_LABEL_BUFLEN-1, ctxt);
          if (p != NULL)
-            def->seclabel.baselabel = p;
+            def->baselabel = p;
      }

      /* Only parse model, if static labelling, or a base
       * label is set, or doing active XML
       */
-    if (def->seclabel.type == VIR_DOMAIN_SECLABEL_STATIC ||
-        def->seclabel.baselabel ||
+    if (def->type == VIR_DOMAIN_SECLABEL_STATIC ||
+        def->baselabel ||
          !(flags&  VIR_DOMAIN_XML_INACTIVE)) {
          p = virXPathStringLimit("string(./seclabel/@model)",
                                  VIR_SECURITY_MODEL_BUFLEN-1, ctxt);
@@ -6312,13 +6311,13 @@ virSecurityLabelDefParseXML(const virDomainDefPtr def,
                                   "%s", _("missing security model"));
              goto error;
          }
-        def->seclabel.model = p;
+        def->model = p;
      }

      return 0;

  error:
-    virSecurityLabelDefFree(def);
+    virSecurityLabelDefClear(def);
      return -1;
  }

@@ -7939,7 +7938,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
      VIR_FREE(nodes);

      /* analysis of security label */
-    if (virSecurityLabelDefParseXML(def, ctxt, flags) == -1)
+    if (virSecurityLabelDefParseXML(&def->seclabel, ctxt, flags) == -1)
          goto error;

      if ((node = virXPathNode("./cpu[1]", ctxt)) != NULL) {
@@ -9739,6 +9738,40 @@ virDomainLifecycleDefFormat(virBufferPtr buf,


  static int
+virSecurityLabelDefFormat(virBufferPtr buf, virSecurityLabelDefPtr def,
+                          unsigned int flags)
+{
+    const char *sectype = virDomainSeclabelTypeToString(def->type);
+    int ret = -1;
+
+    if (!sectype)
+        goto cleanup;
+
+    if (def->type == VIR_DOMAIN_SECLABEL_DYNAMIC&&
+        !def->baselabel&&
+        (flags&  VIR_DOMAIN_XML_INACTIVE)) {
+        /* This is the default for inactive xml, so nothing to output.  */
+    } else {
+        virBufferAsprintf(buf, "<seclabel type='%s' model='%s' relabel='%s'>\n",
+                          sectype, def->model,
+                          def->norelabel ? "no" : "yes");
+        virBufferEscapeString(buf, "<label>%s</label>\n",
+                              def->label);
+        if (!def->norelabel)
+            virBufferEscapeString(buf, "<imagelabel>%s</imagelabel>\n",
+                                  def->imagelabel);
+        if (def->type == VIR_DOMAIN_SECLABEL_DYNAMIC)
+            virBufferEscapeString(buf, "<baselabel>%s</baselabel>\n",
+                                  def->baselabel);
+        virBufferAddLit(buf, "</seclabel>\n");
+    }
+    ret = 0;
+cleanup:
+    return ret;
+}
+
+
+static int
  virDomainLeaseDefFormat(virBufferPtr buf,
                          virDomainLeaseDefPtr def)
  {
@@ -11679,31 +11712,10 @@ virDomainDefFormatInternal(virDomainDefPtr def,
      virBufferAddLit(buf, "</devices>\n");

      if (def->seclabel.model) {
-        const char *sectype = virDomainSeclabelTypeToString(def->seclabel.type);
-        if (!sectype)
+        virBufferAdjustIndent(buf, 2);
+        if (virSecurityLabelDefFormat(buf,&def->seclabel, flags)<  0)
              goto cleanup;
-
-        if (def->seclabel.type == VIR_DOMAIN_SECLABEL_DYNAMIC&&
-            !def->seclabel.baselabel&&
-            (flags&  VIR_DOMAIN_XML_INACTIVE)) {
-            /* This is the default for inactive xml, so nothing to output.  */
-        } else {
-            virBufferAsprintf(buf, "<seclabel type='%s' model='%s' "
-                              "relabel='%s'>\n",
-                              sectype, def->seclabel.model,
-                              def->seclabel.norelabel ? "no" : "yes");
-            virBufferEscapeString(buf, "<label>%s</label>\n",
-                                  def->seclabel.label);
-            if (!def->seclabel.norelabel)
-                virBufferEscapeString(buf,
-                                      "<imagelabel>%s</imagelabel>\n",
-                                      def->seclabel.imagelabel);
-            if (def->seclabel.type == VIR_DOMAIN_SECLABEL_DYNAMIC)
-                virBufferEscapeString(buf,
-                                      "<baselabel>%s</baselabel>\n",
-                                      def->seclabel.baselabel);
-            virBufferAddLit(buf, "</seclabel>\n");
-        }
+        virBufferAdjustIndent(buf, -2);
      }

      if (def->namespaceData&&  def->ns.format) {

ACK.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]