Add support of collecting information about serial
ports. This change is needed mostly as an example,
support of other devices will be added later.
Signed-off-by: Dmitry Guryanov <dguryanov(a)parallels.com>
---
src/pvs/pvs_driver.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 115 insertions(+), 0 deletions(-)
diff --git a/src/pvs/pvs_driver.c b/src/pvs/pvs_driver.c
index d2e0762..723432a 100644
--- a/src/pvs/pvs_driver.c
+++ b/src/pvs/pvs_driver.c
@@ -146,6 +146,118 @@ pvsGetCapabilities(virConnectPtr conn)
return xml;
}
+static int
+pvsGetSerialInfo(virDomainChrDefPtr chr,
+ const char *name, virJSONValuePtr value)
+{
+ const char *tmp;
+
+ chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
+ chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+ chr->target.port = atoi(name + strlen("serial"));
+
+ if (virJSONValueObjectHasKey(value, "output")) {
+ chr->source.type = VIR_DOMAIN_CHR_TYPE_FILE;
+
+ tmp = virJSONValueObjectGetString(value, "output");
+ if (!tmp) {
+ pvsParseError();
+ return -1;
+ }
+
+ if (!(chr->source.data.file.path = strdup(tmp)))
+ goto no_memory;
+ } else if (virJSONValueObjectHasKey(value, "socket")) {
+ chr->source.type = VIR_DOMAIN_CHR_TYPE_UNIX;
+
+ tmp = virJSONValueObjectGetString(value, "socket");
+ if (!tmp) {
+ pvsParseError();
+ return -1;
+ }
+
+ if (!(chr->source.data.nix.path = strdup(tmp)))
+ goto no_memory;
+ chr->source.data.nix.listen = false;
+ } else if (virJSONValueObjectHasKey(value, "real")) {
+ chr->source.type = VIR_DOMAIN_CHR_TYPE_DEV;
+
+ tmp = virJSONValueObjectGetString(value, "real");
+ if (!tmp) {
+ pvsParseError();
+ return -1;
+ }
+
+ if (!(chr->source.data.file.path = strdup(tmp)))
+ goto no_memory;
+ } else {
+ pvsParseError();
+ return -1;
+ }
+
+ return 0;
+
+ no_memory:
+ virReportOOMError();
+ return -1;
+}
+
+static int
+pvsAddSerialInfo(virDomainObjPtr dom,
+ const char *key, virJSONValuePtr value)
+{
+ virDomainDefPtr def = dom->def;
+ virDomainChrDefPtr chr = NULL;
+
+ if (!(chr = virDomainChrDefNew()))
+ goto no_memory;
+
+ if (pvsGetSerialInfo(chr, key, value))
+ goto cleanup;
+
+ if (VIR_REALLOC_N(def->serials, def->nserials + 1) < 0) {
+ virDomainChrDefFree(chr);
+ goto no_memory;
+ }
+
+ def->serials[def->nserials++] = chr;
+
+ return 0;
+
+ no_memory:
+ virReportOOMError();
+ cleanup:
+ virDomainChrDefFree(chr);
+ return -1;
+}
+
+static int
+pvsAddDomainHardware(virDomainObjPtr dom, virJSONValuePtr jobj)
+{
+ int n, i;
+ virJSONValuePtr value;
+ const char *key;
+
+ n = virJSONValueObjectKeysNumber(jobj);
+ if (n < 1)
+ goto cleanup;
+
+ for (i = 0; i < n; i++) {
+ key = virJSONValueObjectGetKey(jobj, i);
+ value = virJSONValueObjectGetValue(jobj, i);
+
+ if (STRPREFIX(key, "serial")) {
+ if (pvsAddSerialInfo(dom, key, value))
+ goto cleanup;
+ }
+ }
+
+ return 0;
+
+ cleanup:
+ return -1;
+}
+
/*
* Must be called with privconn->lock held
*/
@@ -294,6 +406,9 @@ pvsLoadDomain(pvsConnPtr privconn, virJSONValuePtr jobj)
else
dom->autostart = 0;
+ if (pvsAddDomainHardware(dom, jobj2) < 0)
+ goto cleanup_unlock;
+
virDomainObjUnlock(dom);
return dom;
--
1.7.1