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(a)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 9062544..e4fa9ad 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2127,6 +2127,8 @@ void virDomainChrDefFree(virDomainChrDefPtr def)
VIR_FREE(def->seclabels);
}
+ virObjectUnref(def->privateData);
+
VIR_FREE(def);
}
@@ -10333,7 +10335,7 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def,
* default port.
*/
virDomainChrDefPtr
-virDomainChrDefNew(void)
+virDomainChrDefNew(virDomainXMLOptionPtr xmlopt)
{
virDomainChrDefPtr def = NULL;
@@ -10341,6 +10343,11 @@ virDomainChrDefNew(void)
return NULL;
def->target.port = -1;
+
+ if (xmlopt && xmlopt->privateData.chardevNew &&
+ !(def->privateData = xmlopt->privateData.chardevNew()))
+ VIR_FREE(def);
+
return def;
}
@@ -10388,7 +10395,8 @@ virDomainChrDefNew(void)
*
*/
static virDomainChrDefPtr
-virDomainChrDefParseXML(xmlXPathContextPtr ctxt,
+virDomainChrDefParseXML(virDomainXMLOptionPtr xmlopt,
+ xmlXPathContextPtr ctxt,
xmlNodePtr node,
virSecurityLabelDefPtr* vmSeclabels,
int nvmSeclabels,
@@ -10400,7 +10408,7 @@ virDomainChrDefParseXML(xmlXPathContextPtr ctxt,
virDomainChrDefPtr def;
bool seenTarget = false;
- if (!(def = virDomainChrDefNew()))
+ if (!(def = virDomainChrDefNew(xmlopt)))
return NULL;
type = virXMLPropString(node, "type");
@@ -13578,7 +13586,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,
@@ -17197,7 +17206,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,
@@ -17224,7 +17234,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,
@@ -17253,7 +17264,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,
@@ -17272,7 +17284,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 c34e046..fcadf6c 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;
};
@@ -2582,7 +2584,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 3df04cf..bdd8ae7 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 0c9416f..a07f981 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 dee5d93..707a995 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