[libvirt] [PATCH v5 7/9] qemu: Introduce qemuDomainChardevPrivatePtr

John Ferlan jferlan at redhat.com
Thu Aug 4 15:21:25 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 +-
 9 files changed, 88 insertions(+), 15 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 53e5bae..d83011b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2087,6 +2087,8 @@ void virDomainChrDefFree(virDomainChrDefPtr def)
         VIR_FREE(def->seclabels);
     }
 
+    virObjectUnref(def->privateData);
+
     VIR_FREE(def);
 }
 
@@ -10175,7 +10177,7 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def,
  * default port.
  */
 virDomainChrDefPtr
-virDomainChrDefNew(void)
+virDomainChrDefNew(virDomainXMLOptionPtr xmlopt)
 {
     virDomainChrDefPtr def = NULL;
 
@@ -10183,6 +10185,11 @@ virDomainChrDefNew(void)
         return NULL;
 
     def->target.port = -1;
+
+    if (xmlopt && xmlopt->privateData.chardevNew &&
+        !(def->privateData = xmlopt->privateData.chardevNew()))
+        VIR_FREE(def);
+
     return def;
 }
 
@@ -10230,7 +10237,8 @@ virDomainChrDefNew(void)
  *
  */
 static virDomainChrDefPtr
-virDomainChrDefParseXML(xmlXPathContextPtr ctxt,
+virDomainChrDefParseXML(virDomainXMLOptionPtr xmlopt,
+                        xmlXPathContextPtr ctxt,
                         xmlNodePtr node,
                         virSecurityLabelDefPtr* vmSeclabels,
                         int nvmSeclabels,
@@ -10242,7 +10250,7 @@ virDomainChrDefParseXML(xmlXPathContextPtr ctxt,
     virDomainChrDefPtr def;
     bool seenTarget = false;
 
-    if (!(def = virDomainChrDefNew()))
+    if (!(def = virDomainChrDefNew(xmlopt)))
         return NULL;
 
     type = virXMLPropString(node, "type");
@@ -13419,7 +13427,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,
@@ -16887,7 +16896,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,
@@ -16914,7 +16924,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,
@@ -16943,7 +16954,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,
@@ -16962,7 +16974,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 0b48b8e..0caee51 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 ||
@@ -2427,6 +2428,7 @@ struct _virDomainXMLPrivateDataCallbacks {
     virDomainXMLPrivateDataNewFunc    diskNew;
     virDomainXMLPrivateDataNewFunc    hostdevNew;
     virDomainXMLPrivateDataNewFunc    vcpuNew;
+    virDomainXMLPrivateDataNewFunc    chardevNew;
     virDomainXMLPrivateDataFormatFunc format;
     virDomainXMLPrivateDataParseFunc  parse;
 };
@@ -2559,7 +2561,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 57ef235..e5384a7 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -387,7 +387,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 4b22e2a..faff03a 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 bb6f21e..b215139 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -860,6 +860,49 @@ qemuDomainVcpuPrivateDispose(void *obj ATTRIBUTE_UNUSED)
 }
 
 
+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
@@ -1763,6 +1806,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 0613093..0411ac1 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -340,6 +340,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 82d1621..6540d60 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 38254c0..edd3f2d 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -1218,7 +1218,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 40dc53c..e586e24 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;
-- 
2.7.4




More information about the libvir-list mailing list