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@xxxxxx> 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 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list