On 06/27/2009 04:32 PM, Andreas Sommer wrote:
Index: src/domain_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/domain_conf.c,v
retrieving revision 1.88
diff -u -r1.88 domain_conf.c
--- src/domain_conf.c 25 Jun 2009 13:55:58 -0000 1.88
+++ src/domain_conf.c 27 Jun 2009 15:12:28 -0000
@@ -461,6 +461,8 @@
for (i = 0 ; i < def->nhostdevs ; i++)
virDomainHostdevDefFree(def->hostdevs[i]);
VIR_FREE(def->hostdevs);
+
+ VIR_FREE(def->tpm);
VIR_FREE(def->os.type);
VIR_FREE(def->os.arch);
@@ -1622,6 +1624,62 @@
}
+/* Parse the XML definition for a vTPM device (<tpm
instance="optional_instance_number">) */
+static virDomainTpmDefPtr
+virDomainTpmDefParseXML(virConnectPtr conn,
+ xmlNodePtr node, int flags) {
+
Whitespace is funky here.
+ flags = flags; /* TODO: Andreas Sommer <AndiDog(a)web.de>
flags unused, what are they used for */
+
If you change the function definition to be:
virDomainTpmDefParseXML(..., int flags ATTRIBUTE_UNUSED);
You will avoid the compiler warning. The flags attribute is only relevant for
formatting certain XML, and they correctly don't apply here.
+ virDomainTpmDefPtr def;
+ char *instance = NULL;
+
+ if (VIR_ALLOC(def) < 0) {
+ virReportOOMError(conn);
+ return NULL;
+ }
+
+ instance = virXMLPropString(node, "instance");
+
+ /* Attribute "instance" is optional*/
+ if (instance) {
+ /* "instance" is defined as a number >= 0 */
+ if (!c_isdigit(*instance) || *instance == '0') {
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("TPM instance attribute '%s' found, but
must be a number >= 0 (make sure no whitespaces or leading zeroes are
contained)"), instance);
+ goto error;
+ }
+
+ const char *check = &instance[1];
+ while (*check && c_isdigit(*check)) ++check;
+ if (*check) {
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("TPM instance attribute '%s' contains
non-digits, must be a number >= 0 (make sure no whitespaces or leading zeroes are
contained)"), instance);
+ goto error;
+ }
+
+ int err = virStrToLong_l("instance", NULL, 10,
&def->instance);
+ if (err) {
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("TPM instance '%s' is not a valid
number"), instance);
+ goto error;
+ }
+ }
+ else
+ def->instance = -1;
+
+cleanup:
+ VIR_FREE(instance);
+
+ return def;
+
+error:
+ VIR_FREE(def);
+ def = NULL;
+ goto cleanup;
+}
+
+
static virDomainSoundDefPtr
virDomainSoundDefParseXML(virConnectPtr conn,
const xmlNodePtr node,
@@ -2617,6 +2675,30 @@
def->inputs[def->ninputs] = input;
def->ninputs++;
}
+
+
+ /* analysis of the vTPM device */
+ if ((n = virXPathNodeSet(conn, "./devices/tpm", ctxt, &nodes)) < 0)
{
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ "%s", _("cannot extract vTPM
device"));
+ goto error;
+ }
+ if (n > 1) {
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
+ "%s", _("there can only be one vTPM
device"));
+ goto error;
+ }
+ if (n == 1) {
+ virDomainTpmDefPtr tpm = virDomainTpmDefParseXML(conn,
+ nodes[0],
+ flags);
+
+ if (!tpm)
+ goto error;
+
+ def->tpm = tpm;
+ }
+ VIR_FREE(nodes);
/* analysis of the sound devices */
@@ -3856,6 +3938,13 @@
goto cleanup;
}
+ if (def->tpm) {
+ virBufferVSprintf(&buf, " <tpm");
+ if (def->tpm->instance >= 0)
+ virBufferVSprintf(&buf, " instance='%ld'",
def->tpm->instance);
+ virBufferVSprintf(&buf, "/>\n");
+ }
+
It's a bit overkill, but I think it's better to follow existing convention and
move this formatting to a function like 'virDomainTpmDefFormat'.
Thanks,
Cole