[libvirt] [PATCH v8 3/5] qemu: Introduce qemuDomainChardevPrivatePtr

John Ferlan jferlan at redhat.com
Fri Oct 7 11:00:28 UTC 2016


Modeled after the qemuDomainHostdevPrivatePtr (commit id '27726d8c'),
create a privateData pointer in the _virDomainChardevDef to allow storage
of private data for a hypervisor in order to at least temporarily store
secret data for usage during qemuBuildCommandLine.

NB: Since the qemu_parse_command (qemuParseCommandLine) code is not
expecting to restore the secret data, there's no need to add code
code to handle this new structure there.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/conf/domain_conf.c        | 29 ++++++++++++++++++++--------
 src/conf/domain_conf.h        |  4 +++-
 src/libxl/libxl_domain.c      |  2 +-
 src/lxc/lxc_native.c          |  2 +-
 src/qemu/qemu_domain.c        | 44 +++++++++++++++++++++++++++++++++++++++++++
 src/qemu/qemu_domain.h        | 14 ++++++++++++++
 src/qemu/qemu_parse_command.c |  4 ++--
 src/vz/vz_sdk.c               |  2 +-
 src/xenconfig/xen_sxpr.c      |  2 +-
 src/xenconfig/xen_xl.c        |  2 +-
 10 files changed, 89 insertions(+), 16 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 1f7c43f..c52144f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2091,6 +2091,8 @@ void virDomainChrDefFree(virDomainChrDefPtr def)
         VIR_FREE(def->seclabels);
     }
 
+    virObjectUnref(def->privateData);
+
     VIR_FREE(def);
 }
 
@@ -10294,7 +10296,7 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def,
  * default port.
  */
 virDomainChrDefPtr
-virDomainChrDefNew(void)
+virDomainChrDefNew(virDomainXMLOptionPtr xmlopt)
 {
     virDomainChrDefPtr def = NULL;
 
@@ -10302,6 +10304,11 @@ virDomainChrDefNew(void)
         return NULL;
 
     def->target.port = -1;
+
+    if (xmlopt && xmlopt->privateData.chardevNew &&
+        !(def->privateData = xmlopt->privateData.chardevNew()))
+        VIR_FREE(def);
+
     return def;
 }
 
@@ -10349,7 +10356,8 @@ virDomainChrDefNew(void)
  *
  */
 static virDomainChrDefPtr
-virDomainChrDefParseXML(xmlXPathContextPtr ctxt,
+virDomainChrDefParseXML(virDomainXMLOptionPtr xmlopt,
+                        xmlXPathContextPtr ctxt,
                         xmlNodePtr node,
                         virSecurityLabelDefPtr* vmSeclabels,
                         int nvmSeclabels,
@@ -10361,7 +10369,7 @@ virDomainChrDefParseXML(xmlXPathContextPtr ctxt,
     virDomainChrDefPtr def;
     bool seenTarget = false;
 
-    if (!(def = virDomainChrDefNew()))
+    if (!(def = virDomainChrDefNew(xmlopt)))
         return NULL;
 
     type = virXMLPropString(node, "type");
@@ -13538,7 +13546,8 @@ virDomainDeviceDefParse(const char *xmlStr,
             goto error;
         break;
     case VIR_DOMAIN_DEVICE_CHR:
-        if (!(dev->data.chr = virDomainChrDefParseXML(ctxt,
+        if (!(dev->data.chr = virDomainChrDefParseXML(xmlopt,
+                                                      ctxt,
                                                       node,
                                                       def->seclabels,
                                                       def->nseclabels,
@@ -17160,7 +17169,8 @@ virDomainDefParseXML(xmlDocPtr xml,
         goto error;
 
     for (i = 0; i < n; i++) {
-        virDomainChrDefPtr chr = virDomainChrDefParseXML(ctxt,
+        virDomainChrDefPtr chr = virDomainChrDefParseXML(xmlopt,
+                                                         ctxt,
                                                          nodes[i],
                                                          def->seclabels,
                                                          def->nseclabels,
@@ -17187,7 +17197,8 @@ virDomainDefParseXML(xmlDocPtr xml,
         goto error;
 
     for (i = 0; i < n; i++) {
-        virDomainChrDefPtr chr = virDomainChrDefParseXML(ctxt,
+        virDomainChrDefPtr chr = virDomainChrDefParseXML(xmlopt,
+                                                         ctxt,
                                                          nodes[i],
                                                          def->seclabels,
                                                          def->nseclabels,
@@ -17216,7 +17227,8 @@ virDomainDefParseXML(xmlDocPtr xml,
         goto error;
 
     for (i = 0; i < n; i++) {
-        virDomainChrDefPtr chr = virDomainChrDefParseXML(ctxt,
+        virDomainChrDefPtr chr = virDomainChrDefParseXML(xmlopt,
+                                                         ctxt,
                                                          nodes[i],
                                                          def->seclabels,
                                                          def->nseclabels,
@@ -17235,7 +17247,8 @@ virDomainDefParseXML(xmlDocPtr xml,
         goto error;
 
     for (i = 0; i < n; i++) {
-        virDomainChrDefPtr chr = virDomainChrDefParseXML(ctxt,
+        virDomainChrDefPtr chr = virDomainChrDefParseXML(xmlopt,
+                                                         ctxt,
                                                          nodes[i],
                                                          def->seclabels,
                                                          def->nseclabels,
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index da203c3..4769144 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1118,6 +1118,7 @@ struct _virDomainChrSourceDef {
 /* A complete character device, both host and domain views.  */
 struct _virDomainChrDef {
     int deviceType; /* enum virDomainChrDeviceType */
+    virObjectPtr privateData;
 
     bool targetTypeAttr;
     int targetType; /* enum virDomainChrConsoleTargetType ||
@@ -2447,6 +2448,7 @@ struct _virDomainXMLPrivateDataCallbacks {
     virDomainXMLPrivateDataNewFunc    diskNew;
     virDomainXMLPrivateDataNewFunc    hostdevNew;
     virDomainXMLPrivateDataNewFunc    vcpuNew;
+    virDomainXMLPrivateDataNewFunc    chardevNew;
     virDomainXMLPrivateDataFormatFunc format;
     virDomainXMLPrivateDataParseFunc  parse;
 };
@@ -2580,7 +2582,7 @@ bool virDomainDefHasDeviceAddress(virDomainDefPtr def,
 
 void virDomainDefFree(virDomainDefPtr vm);
 
-virDomainChrDefPtr virDomainChrDefNew(void);
+virDomainChrDefPtr virDomainChrDefNew(virDomainXMLOptionPtr xmlopt);
 
 virDomainDefPtr virDomainDefNew(void);
 virDomainDefPtr virDomainDefNewFull(const char *name,
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index db2c1dc..617e13c 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -389,7 +389,7 @@ libxlDomainDefPostParse(virDomainDefPtr def,
     if (def->os.type != VIR_DOMAIN_OSTYPE_HVM && def->nconsoles == 0) {
         virDomainChrDefPtr chrdef;
 
-        if (!(chrdef = virDomainChrDefNew()))
+        if (!(chrdef = virDomainChrDefNew(NULL)))
             return -1;
 
         chrdef->source.type = VIR_DOMAIN_CHR_TYPE_PTY;
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index 76b7922..b6d26b2 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -703,7 +703,7 @@ lxcCreateConsoles(virDomainDefPtr def, virConfPtr properties)
 
     def->nconsoles = nbttys;
     for (i = 0; i < nbttys; i++) {
-        if (!(console = virDomainChrDefNew()))
+        if (!(console = virDomainChrDefNew(NULL)))
             goto error;
 
         console->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2b24c01..ad1e4bc 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -864,6 +864,49 @@ qemuDomainVcpuPrivateDispose(void *obj)
 }
 
 
+static virClassPtr qemuDomainChardevPrivateClass;
+static void qemuDomainChardevPrivateDispose(void *obj);
+
+static int
+qemuDomainChardevPrivateOnceInit(void)
+{
+    qemuDomainChardevPrivateClass =
+        virClassNew(virClassForObject(),
+                    "qemuDomainChardevPrivate",
+                    sizeof(qemuDomainChardevPrivate),
+                    qemuDomainChardevPrivateDispose);
+    if (!qemuDomainChardevPrivateClass)
+        return -1;
+    else
+        return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(qemuDomainChardevPrivate)
+
+static virObjectPtr
+qemuDomainChardevPrivateNew(void)
+{
+    qemuDomainChardevPrivatePtr priv;
+
+    if (qemuDomainChardevPrivateInitialize() < 0)
+        return NULL;
+
+    if (!(priv = virObjectNew(qemuDomainChardevPrivateClass)))
+        return NULL;
+
+    return (virObjectPtr) priv;
+}
+
+
+static void
+qemuDomainChardevPrivateDispose(void *obj)
+{
+    qemuDomainChardevPrivatePtr priv = obj;
+
+    qemuDomainSecretInfoFree(&priv->secinfo);
+}
+
+
 /* qemuDomainSecretPlainSetup:
  * @conn: Pointer to connection
  * @secinfo: Pointer to secret info
@@ -1767,6 +1810,7 @@ virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks = {
     .diskNew = qemuDomainDiskPrivateNew,
     .vcpuNew = qemuDomainVcpuPrivateNew,
     .hostdevNew = qemuDomainHostdevPrivateNew,
+    .chardevNew = qemuDomainChardevPrivateNew,
     .parse = qemuDomainObjPrivateXMLParse,
     .format = qemuDomainObjPrivateXMLFormat,
 };
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 521531b..54ec5b8 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -352,6 +352,20 @@ struct _qemuDomainHostdevPrivate {
     qemuDomainSecretInfoPtr secinfo;
 };
 
+# define QEMU_DOMAIN_CHARDEV_PRIVATE(chardev)	\
+    ((qemuDomainChardevPrivatePtr) (chardev)->privateData)
+
+typedef struct _qemuDomainChardevPrivate qemuDomainChardevPrivate;
+typedef qemuDomainChardevPrivate *qemuDomainChardevPrivatePtr;
+struct _qemuDomainChardevPrivate {
+    virObject parent;
+
+    /* for char devices using secret
+     * NB: *not* to be written to qemu domain object XML */
+    qemuDomainSecretInfoPtr secinfo;
+};
+
+
 typedef enum {
     QEMU_PROCESS_EVENT_WATCHDOG = 0,
     QEMU_PROCESS_EVENT_GUESTPANIC,
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
index 279f3da..331ab36 100644
--- a/src/qemu/qemu_parse_command.c
+++ b/src/qemu/qemu_parse_command.c
@@ -2189,7 +2189,7 @@ qemuParseCommandLine(virCapsPtr caps,
             if (STRNEQ(val, "none")) {
                 virDomainChrDefPtr chr;
 
-                if (!(chr = virDomainChrDefNew()))
+                if (!(chr = virDomainChrDefNew(NULL)))
                     goto error;
 
                 if (qemuParseCommandLineChr(&chr->source, val) < 0) {
@@ -2208,7 +2208,7 @@ qemuParseCommandLine(virCapsPtr caps,
             if (STRNEQ(val, "none")) {
                 virDomainChrDefPtr chr;
 
-                if (!(chr = virDomainChrDefNew()))
+                if (!(chr = virDomainChrDefNew(NULL)))
                     goto error;
 
                 if (qemuParseCommandLineChr(&chr->source, val) < 0) {
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index f2a5c96..b5b0197 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1214,7 +1214,7 @@ prlsdkAddSerialInfo(PRL_HANDLE sdkdom,
         ret = PrlVmCfg_GetSerialPort(sdkdom, i, &serialPort);
         prlsdkCheckRetGoto(ret, cleanup);
 
-        if (!(chr = virDomainChrDefNew()))
+        if (!(chr = virDomainChrDefNew(NULL)))
             goto cleanup;
 
         if (prlsdkGetSerialInfo(serialPort, chr))
diff --git a/src/xenconfig/xen_sxpr.c b/src/xenconfig/xen_sxpr.c
index 0b04fc8..990c4ef 100644
--- a/src/xenconfig/xen_sxpr.c
+++ b/src/xenconfig/xen_sxpr.c
@@ -190,7 +190,7 @@ xenParseSxprChar(const char *value,
     char *tmp;
     virDomainChrDefPtr def;
 
-    if (!(def = virDomainChrDefNew()))
+    if (!(def = virDomainChrDefNew(NULL)))
         return NULL;
 
     prefix = value;
diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
index a06983e..4316c25 100644
--- a/src/xenconfig/xen_xl.c
+++ b/src/xenconfig/xen_xl.c
@@ -737,7 +737,7 @@ xenParseXLChannel(virConfPtr conf, virDomainDefPtr def)
                 key = nextkey;
             }
 
-            if (!(channel = virDomainChrDefNew()))
+            if (!(channel = virDomainChrDefNew(NULL)))
                 goto cleanup;
 
             if (STRPREFIX(type, "socket")) {
-- 
2.7.4




More information about the libvir-list mailing list