mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-26 18:41:17 +00:00
* src/xml.c: applied patch from Jim Meyering fixing parseNumber
to detect overflow, and also reindented the module. Daniel
This commit is contained in:
parent
de327d23e7
commit
211a20aefb
@ -1,3 +1,8 @@
|
||||
Wed Oct 24 16:21:02 CEST 2007 Daniel Veillard <veillard@redhat.com>
|
||||
|
||||
* src/xml.c: applied patch from Jim Meyering fixing parseNumber
|
||||
to detect overflow, and also reindented the module.
|
||||
|
||||
Wed Oct 24 10:38:38 CEST 2007 Daniel Veillard <veillard@redhat.com>
|
||||
|
||||
* po/id.po: Remove again bogus Project-Id-Version field from merge error
|
||||
|
238
src/xml.c
238
src/xml.c
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* xml.c: XML based interfaces for the libvir library
|
||||
*
|
||||
* Copyright (C) 2005 Red Hat, Inc.
|
||||
* Copyright (C) 2005, 2007 Red Hat, Inc.
|
||||
*
|
||||
* See COPYING.LIB for the License of this software
|
||||
*
|
||||
@ -36,7 +36,8 @@
|
||||
* Report an error coming from the XML module.
|
||||
*/
|
||||
static void
|
||||
virXMLError(virConnectPtr conn, virErrorNumber error, const char *info, int value)
|
||||
virXMLError(virConnectPtr conn, virErrorNumber error, const char *info,
|
||||
int value)
|
||||
{
|
||||
const char *errmsg;
|
||||
|
||||
@ -63,11 +64,13 @@ virXMLError(virConnectPtr conn, virErrorNumber error, const char *info, int valu
|
||||
* by xend
|
||||
*/
|
||||
static void
|
||||
skipSpaces(const char **str) {
|
||||
skipSpaces(const char **str)
|
||||
{
|
||||
const char *cur = *str;
|
||||
|
||||
while ((*cur == ' ') || (*cur == '\t') || (*cur == '\n') ||
|
||||
(*cur == '\r') || (*cur == '\\')) cur++;
|
||||
(*cur == '\r') || (*cur == '\\'))
|
||||
cur++;
|
||||
*str = cur;
|
||||
}
|
||||
|
||||
@ -75,13 +78,14 @@ skipSpaces(const char **str) {
|
||||
* parseNumber:
|
||||
* @str: pointer to the char pointer used
|
||||
*
|
||||
* Parse a number
|
||||
* Parse an unsigned number
|
||||
*
|
||||
* Returns the CPU number or -1 in case of error. @str will be
|
||||
* Returns the unsigned number or -1 in case of error. @str will be
|
||||
* updated to skip the number.
|
||||
*/
|
||||
static int
|
||||
parseNumber(const char **str) {
|
||||
parseNumber(const char **str)
|
||||
{
|
||||
int ret = 0;
|
||||
const char *cur = *str;
|
||||
|
||||
@ -89,7 +93,12 @@ parseNumber(const char **str) {
|
||||
return (-1);
|
||||
|
||||
while ((*cur >= '0') && (*cur <= '9')) {
|
||||
ret = ret * 10 + (*cur - '0');
|
||||
unsigned int c = *cur - '0';
|
||||
|
||||
if ((ret > INT_MAX / 10) ||
|
||||
((ret == INT_MAX / 10) && (c > INT_MAX % 10)))
|
||||
return (-1);
|
||||
ret = ret * 10 + c;
|
||||
cur++;
|
||||
}
|
||||
*str = cur;
|
||||
@ -107,7 +116,8 @@ parseNumber(const char **str) {
|
||||
* updated to skip the number.
|
||||
*/
|
||||
static int
|
||||
parseCpuNumber(const char **str, int maxcpu) {
|
||||
parseCpuNumber(const char **str, int maxcpu)
|
||||
{
|
||||
int ret = 0;
|
||||
const char *cur = *str;
|
||||
|
||||
@ -202,15 +212,16 @@ saveCpuSet(virConnectPtr conn, char *cpuset, int maxcpu)
|
||||
* @str is updated to the end of the part parsed
|
||||
*/
|
||||
int
|
||||
virParseCpuSet(virConnectPtr conn, const char **str, char sep, char *cpuset,
|
||||
int maxcpu)
|
||||
virParseCpuSet(virConnectPtr conn, const char **str, char sep,
|
||||
char *cpuset, int maxcpu)
|
||||
{
|
||||
const char *cur;
|
||||
int ret = 0;
|
||||
int i, start, last;
|
||||
int neg = 0;
|
||||
|
||||
if ((str == NULL) || (cpuset == NULL) || (maxcpu <= 0) || (maxcpu >100000))
|
||||
if ((str == NULL) || (cpuset == NULL) || (maxcpu <= 0) ||
|
||||
(maxcpu > 100000))
|
||||
return (-1);
|
||||
|
||||
cur = *str;
|
||||
@ -299,8 +310,8 @@ parse_error:
|
||||
* Returns 0 in case of success, -1 in case of error
|
||||
*/
|
||||
int
|
||||
virParseXenCpuTopology(virConnectPtr conn, virBufferPtr xml, const char *str,
|
||||
int maxcpu)
|
||||
virParseXenCpuTopology(virConnectPtr conn, virBufferPtr xml,
|
||||
const char *str, int maxcpu)
|
||||
{
|
||||
const char *cur;
|
||||
char *cpuset = NULL;
|
||||
@ -353,7 +364,8 @@ virParseXenCpuTopology(virConnectPtr conn, virBufferPtr xml, const char *str,
|
||||
|
||||
dump = saveCpuSet(conn, cpuset, maxcpu);
|
||||
if (dump != NULL) {
|
||||
virBufferVSprintf (xml, " <dump>%s</dump>\n", dump);
|
||||
virBufferVSprintf(xml, " <dump>%s</dump>\n",
|
||||
dump);
|
||||
free(dump);
|
||||
} else {
|
||||
virBufferVSprintf(xml, " <error>%s</error>\n",
|
||||
@ -382,8 +394,7 @@ virParseXenCpuTopology(virConnectPtr conn, virBufferPtr xml, const char *str,
|
||||
return (0);
|
||||
|
||||
parse_error:
|
||||
virXMLError(conn, VIR_ERR_XEN_CALL,
|
||||
_("topology syntax error"), 0);
|
||||
virXMLError(conn, VIR_ERR_XEN_CALL, _("topology syntax error"), 0);
|
||||
error:
|
||||
if (cpuset != NULL)
|
||||
free(cpuset);
|
||||
@ -416,7 +427,8 @@ memory_error:
|
||||
* if the evaluation failed.
|
||||
*/
|
||||
char *
|
||||
virXPathString(const char *xpath, xmlXPathContextPtr ctxt) {
|
||||
virXPathString(const char *xpath, xmlXPathContextPtr ctxt)
|
||||
{
|
||||
xmlXPathObjectPtr obj;
|
||||
char *ret;
|
||||
|
||||
@ -452,7 +464,8 @@ virXPathString(const char *xpath, xmlXPathContextPtr ctxt) {
|
||||
* or -1 if the evaluation failed.
|
||||
*/
|
||||
int
|
||||
virXPathNumber(const char *xpath, xmlXPathContextPtr ctxt, double *value) {
|
||||
virXPathNumber(const char *xpath, xmlXPathContextPtr ctxt, double *value)
|
||||
{
|
||||
xmlXPathObjectPtr obj;
|
||||
|
||||
if ((ctxt == NULL) || (xpath == NULL) || (value == NULL)) {
|
||||
@ -485,7 +498,8 @@ virXPathNumber(const char *xpath, xmlXPathContextPtr ctxt, double *value) {
|
||||
* value doesn't have a long format.
|
||||
*/
|
||||
int
|
||||
virXPathLong(const char *xpath, xmlXPathContextPtr ctxt, long *value) {
|
||||
virXPathLong(const char *xpath, xmlXPathContextPtr ctxt, long *value)
|
||||
{
|
||||
xmlXPathObjectPtr obj;
|
||||
int ret = 0;
|
||||
|
||||
@ -530,7 +544,8 @@ virXPathLong(const char *xpath, xmlXPathContextPtr ctxt, long *value) {
|
||||
* Returns 0 if false, 1 if true, or -1 if the evaluation failed.
|
||||
*/
|
||||
int
|
||||
virXPathBoolean(const char *xpath, xmlXPathContextPtr ctxt) {
|
||||
virXPathBoolean(const char *xpath, xmlXPathContextPtr ctxt)
|
||||
{
|
||||
xmlXPathObjectPtr obj;
|
||||
int ret;
|
||||
|
||||
@ -562,7 +577,8 @@ virXPathBoolean(const char *xpath, xmlXPathContextPtr ctxt) {
|
||||
* Returns a pointer to the node or NULL if the evaluation failed.
|
||||
*/
|
||||
xmlNodePtr
|
||||
virXPathNode(const char *xpath, xmlXPathContextPtr ctxt) {
|
||||
virXPathNode(const char *xpath, xmlXPathContextPtr ctxt)
|
||||
{
|
||||
xmlXPathObjectPtr obj;
|
||||
xmlNodePtr ret;
|
||||
|
||||
@ -583,6 +599,7 @@ virXPathNode(const char *xpath, xmlXPathContextPtr ctxt) {
|
||||
xmlXPathFreeObject(obj);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* virXPathNodeSet:
|
||||
* @xpath: the XPath string to evaluate
|
||||
@ -595,7 +612,9 @@ virXPathNode(const char *xpath, xmlXPathContextPtr ctxt) {
|
||||
* must be freed) or -1 if the evaluation failed.
|
||||
*/
|
||||
int
|
||||
virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt, xmlNodePtr **list) {
|
||||
virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt,
|
||||
xmlNodePtr ** list)
|
||||
{
|
||||
xmlXPathObjectPtr obj;
|
||||
int ret;
|
||||
|
||||
@ -619,9 +638,11 @@ virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt, xmlNodePtr **list) {
|
||||
*list = malloc(ret * sizeof(xmlNodePtr));
|
||||
if (*list == NULL) {
|
||||
virXMLError(NULL, VIR_ERR_NO_MEMORY,
|
||||
_("allocate string array"), ret * sizeof(xmlNodePtr));
|
||||
_("allocate string array"),
|
||||
ret * sizeof(xmlNodePtr));
|
||||
} else {
|
||||
memcpy(*list, obj->nodesetval->nodeTab, ret * sizeof(xmlNodePtr));
|
||||
memcpy(*list, obj->nodesetval->nodeTab,
|
||||
ret * sizeof(xmlNodePtr));
|
||||
}
|
||||
}
|
||||
xmlXPathFreeObject(obj);
|
||||
@ -648,7 +669,10 @@ virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt, xmlNodePtr **list) {
|
||||
*
|
||||
* Returns 0 in case of success, -1 in case of error
|
||||
*/
|
||||
static int virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, virBufferPtr buf, int xendConfigVersion)
|
||||
static int
|
||||
virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
xmlNodePtr node, virBufferPtr buf,
|
||||
int xendConfigVersion)
|
||||
{
|
||||
xmlChar *graphics_type = NULL;
|
||||
|
||||
@ -662,20 +686,22 @@ static int virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSE
|
||||
*virBufferAdd(buf, "(display localhost:10.0)", 24);
|
||||
*virBufferAdd(buf, "(xauthority /root/.Xauthority)", 30);
|
||||
*/
|
||||
}
|
||||
else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) {
|
||||
} else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) {
|
||||
virBufferAdd(buf, "(vnc 1)", 7);
|
||||
if (xendConfigVersion >= 2) {
|
||||
xmlChar *vncport = xmlGetProp(node, BAD_CAST "port");
|
||||
xmlChar *vnclisten = xmlGetProp(node, BAD_CAST "listen");
|
||||
xmlChar *vncpasswd = xmlGetProp(node, BAD_CAST "passwd");
|
||||
xmlChar *keymap = xmlGetProp(node, BAD_CAST "keymap");
|
||||
|
||||
if (vncport != NULL) {
|
||||
long port = strtol((const char *) vncport, NULL, 10);
|
||||
|
||||
if (port == -1)
|
||||
virBufferAdd(buf, "(vncunused 1)", 13);
|
||||
else if (port >= 5900)
|
||||
virBufferVSprintf(buf, "(vncdisplay %ld)", port - 5900);
|
||||
virBufferVSprintf(buf, "(vncdisplay %ld)",
|
||||
port - 5900);
|
||||
xmlFree(vncport);
|
||||
}
|
||||
if (vnclisten != NULL) {
|
||||
@ -711,7 +737,9 @@ static int virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSE
|
||||
*
|
||||
* Returns 0 in case of success, -1 in case of error
|
||||
*/
|
||||
static int virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, virBufferPtr buf)
|
||||
static int
|
||||
virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
xmlNodePtr node, virBufferPtr buf)
|
||||
{
|
||||
xmlChar *graphics_type = NULL;
|
||||
|
||||
@ -727,19 +755,21 @@ static int virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
*virBufferAdd(buf, "(display localhost:10.0)", 24);
|
||||
*virBufferAdd(buf, "(xauthority /root/.Xauthority)", 30);
|
||||
*/
|
||||
}
|
||||
else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) {
|
||||
} else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) {
|
||||
virBufferAdd(buf, "(type vnc)", 10);
|
||||
xmlChar *vncport = xmlGetProp(node, BAD_CAST "port");
|
||||
xmlChar *vnclisten = xmlGetProp(node, BAD_CAST "listen");
|
||||
xmlChar *vncpasswd = xmlGetProp(node, BAD_CAST "passwd");
|
||||
xmlChar *keymap = xmlGetProp(node, BAD_CAST "keymap");
|
||||
|
||||
if (vncport != NULL) {
|
||||
long port = strtol((const char *) vncport, NULL, 10);
|
||||
|
||||
if (port == -1)
|
||||
virBufferAdd(buf, "(vncunused 1)", 13);
|
||||
else if (port >= 5900)
|
||||
virBufferVSprintf(buf, "(vncdisplay %ld)", port - 5900);
|
||||
virBufferVSprintf(buf, "(vncdisplay %ld)",
|
||||
port - 5900);
|
||||
xmlFree(vncport);
|
||||
}
|
||||
if (vnclisten != NULL) {
|
||||
@ -779,7 +809,9 @@ static int virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
* Returns 0 in case of success, -1 in case of error.
|
||||
*/
|
||||
static int
|
||||
virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int vcpus, int xendConfigVersion)
|
||||
virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node,
|
||||
virBufferPtr buf, xmlXPathContextPtr ctxt,
|
||||
int vcpus, int xendConfigVersion)
|
||||
{
|
||||
xmlNodePtr cur, txt;
|
||||
xmlNodePtr *nodes = NULL;
|
||||
@ -793,8 +825,8 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
|
||||
cur = node->children;
|
||||
while (cur != NULL) {
|
||||
if (cur->type == XML_ELEMENT_NODE) {
|
||||
if ((type == NULL)
|
||||
&& (xmlStrEqual(cur->name, BAD_CAST "type"))) {
|
||||
if ((type == NULL) &&
|
||||
(xmlStrEqual(cur->name, BAD_CAST "type"))) {
|
||||
txt = cur->children;
|
||||
if ((txt != NULL) && (txt->type == XML_TEXT_NODE) &&
|
||||
(txt->next == NULL))
|
||||
@ -807,8 +839,11 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
|
||||
loader = txt->content;
|
||||
} else if ((xmlStrEqual(cur->name, BAD_CAST "boot"))) {
|
||||
xmlChar *boot_dev = xmlGetProp(cur, BAD_CAST "dev");
|
||||
if (nbootorder == ((sizeof(bootorder)/sizeof(bootorder[0]))-1)) {
|
||||
virXMLError(conn, VIR_ERR_XML_ERROR, "too many boot devices", 0);
|
||||
|
||||
if (nbootorder ==
|
||||
((sizeof(bootorder) / sizeof(bootorder[0])) - 1)) {
|
||||
virXMLError(conn, VIR_ERR_XML_ERROR,
|
||||
"too many boot devices", 0);
|
||||
return (-1);
|
||||
}
|
||||
if (xmlStrEqual(boot_dev, BAD_CAST "fd")) {
|
||||
@ -859,10 +894,12 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
|
||||
virBufferVSprintf(buf, "(boot %s)", bootorder);
|
||||
|
||||
/* get the 1st floppy device file */
|
||||
cur = virXPathNode("/domain/devices/disk[@device='floppy' and target/@dev='fda']/source",
|
||||
cur = virXPathNode(
|
||||
"/domain/devices/disk[@device='floppy' and target/@dev='fda']/source",
|
||||
ctxt);
|
||||
if (cur != NULL) {
|
||||
xmlChar *fdfile;
|
||||
|
||||
fdfile = xmlGetProp(cur, BAD_CAST "file");
|
||||
if (fdfile != NULL) {
|
||||
virBufferVSprintf(buf, "(fda '%s')", fdfile);
|
||||
@ -871,10 +908,12 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
|
||||
}
|
||||
|
||||
/* get the 2nd floppy device file */
|
||||
cur = virXPathNode("/domain/devices/disk[@device='floppy' and target/@dev='fdb']/source",
|
||||
cur = virXPathNode(
|
||||
"/domain/devices/disk[@device='floppy' and target/@dev='fdb']/source",
|
||||
ctxt);
|
||||
if (cur != NULL) {
|
||||
xmlChar *fdfile;
|
||||
|
||||
fdfile = xmlGetProp(cur, BAD_CAST "file");
|
||||
if (fdfile != NULL) {
|
||||
virBufferVSprintf(buf, "(fdb '%s')", fdfile);
|
||||
@ -886,7 +925,8 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
|
||||
/* get the cdrom device file */
|
||||
/* Only XenD <= 3.0.2 wants cdrom config here */
|
||||
if (xendConfigVersion == 1) {
|
||||
cur = virXPathNode("/domain/devices/disk[@device='cdrom' and target/@dev='hdc']/source",
|
||||
cur = virXPathNode(
|
||||
"/domain/devices/disk[@device='cdrom' and target/@dev='hdc']/source",
|
||||
ctxt);
|
||||
if (cur != NULL) {
|
||||
xmlChar *cdfile;
|
||||
@ -911,6 +951,7 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
|
||||
nb_nodes = virXPathNodeSet("/domain/devices/input", ctxt, &nodes);
|
||||
if (nb_nodes > 0) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nb_nodes; i++) {
|
||||
xmlChar *itype = NULL, *bus = NULL;
|
||||
int isMouse = 1;
|
||||
@ -1013,7 +1054,9 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
|
||||
* Returns 0 in case of success, -1 in case of error.
|
||||
*/
|
||||
static int
|
||||
virDomainParseXMLOSDescPV(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int xendConfigVersion)
|
||||
virDomainParseXMLOSDescPV(virConnectPtr conn, xmlNodePtr node,
|
||||
virBufferPtr buf, xmlXPathContextPtr ctxt,
|
||||
int xendConfigVersion)
|
||||
{
|
||||
xmlNodePtr cur, txt;
|
||||
const xmlChar *type = NULL;
|
||||
@ -1106,7 +1149,8 @@ virDomainParseXMLOSDescPV(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
|
||||
* error reporting.
|
||||
*/
|
||||
static void
|
||||
virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
|
||||
virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...)
|
||||
{
|
||||
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
|
||||
|
||||
if ((ctxt != NULL) &&
|
||||
@ -1132,7 +1176,8 @@ virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
|
||||
* Returns 0 in case of success, -1 in case of error.
|
||||
*/
|
||||
static int
|
||||
virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf, int hvm, int xendConfigVersion)
|
||||
virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
|
||||
virBufferPtr buf, int hvm, int xendConfigVersion)
|
||||
{
|
||||
xmlNodePtr cur;
|
||||
xmlChar *type = NULL;
|
||||
@ -1189,9 +1234,7 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
|
||||
/* There is a case without the source
|
||||
* to the CD-ROM device
|
||||
*/
|
||||
if (hvm &&
|
||||
device &&
|
||||
!strcmp((const char *)device, "cdrom")) {
|
||||
if (hvm && device && !strcmp((const char *) device, "cdrom")) {
|
||||
isNoSrcCdrom = 1;
|
||||
}
|
||||
if (!isNoSrcCdrom) {
|
||||
@ -1209,16 +1252,12 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
|
||||
/* Xend (all versions) put the floppy device config
|
||||
* under the hvm (image (os)) block
|
||||
*/
|
||||
if (hvm &&
|
||||
device &&
|
||||
!strcmp((const char *)device, "floppy")) {
|
||||
if (hvm && device && !strcmp((const char *) device, "floppy")) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Xend <= 3.0.2 doesn't include cdrom config here */
|
||||
if (hvm &&
|
||||
device &&
|
||||
!strcmp((const char *)device, "cdrom")) {
|
||||
if (hvm && device && !strcmp((const char *) device, "cdrom")) {
|
||||
if (xendConfigVersion == 1)
|
||||
goto cleanup;
|
||||
else
|
||||
@ -1228,8 +1267,8 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
|
||||
|
||||
virBufferAdd(buf, "(device ", 8);
|
||||
/* Normally disks are in a (device (vbd ...)) block
|
||||
but blktap disks ended up in a differently named
|
||||
(device (tap ....)) block.... */
|
||||
* but blktap disks ended up in a differently named
|
||||
* (device (tap ....)) block.... */
|
||||
if (drvName && !strcmp((const char *) drvName, "tap")) {
|
||||
virBufferAdd(buf, "(tap ", 5);
|
||||
} else {
|
||||
@ -1238,6 +1277,7 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
|
||||
|
||||
if (hvm) {
|
||||
char *tmp = (char *) target;
|
||||
|
||||
/* Just in case user mistakenly still puts ioemu: in their XML */
|
||||
if (!strncmp((const char *) tmp, "ioemu:", 6))
|
||||
tmp += 6;
|
||||
@ -1246,7 +1286,8 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
|
||||
if (xendConfigVersion == 1)
|
||||
virBufferVSprintf(buf, "(dev 'ioemu:%s')", (const char *) tmp);
|
||||
else /* But newer does not */
|
||||
virBufferVSprintf(buf, "(dev '%s%s')", (const char *)tmp, cdrom ? ":cdrom" : ":disk");
|
||||
virBufferVSprintf(buf, "(dev '%s%s')", (const char *) tmp,
|
||||
cdrom ? ":cdrom" : ":disk");
|
||||
} else
|
||||
virBufferVSprintf(buf, "(dev '%s')", (const char *) target);
|
||||
|
||||
@ -1310,7 +1351,9 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
|
||||
* Returns 0 in case of success, -1 in case of error.
|
||||
*/
|
||||
static int
|
||||
virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, virBufferPtr buf, int hvm, int xendConfigVersion)
|
||||
virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
xmlNodePtr node, virBufferPtr buf, int hvm,
|
||||
int xendConfigVersion)
|
||||
{
|
||||
xmlNodePtr cur;
|
||||
xmlChar *type = NULL;
|
||||
@ -1351,9 +1394,9 @@ virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, vi
|
||||
} else if ((ip == NULL) &&
|
||||
(xmlStrEqual(cur->name, BAD_CAST "ip"))) {
|
||||
/* XXX in future expect to need to have > 1 ip
|
||||
address element - eg ipv4 & ipv6. For now
|
||||
xen only supports a single address though
|
||||
so lets ignore that complication */
|
||||
* address element - eg ipv4 & ipv6. For now
|
||||
* xen only supports a single address though
|
||||
* so lets ignore that complication */
|
||||
ip = xmlGetProp(cur, BAD_CAST "address");
|
||||
}
|
||||
}
|
||||
@ -1365,12 +1408,18 @@ virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, vi
|
||||
unsigned int addr[12];
|
||||
int tmp = sscanf((const char *) mac,
|
||||
"%01x%01x:%01x%01x:%01x%01x:%01x%01x:%01x%01x:%01x%01x",
|
||||
(unsigned int*)&addr[0], (unsigned int*)&addr[1],
|
||||
(unsigned int*)&addr[2], (unsigned int*)&addr[3],
|
||||
(unsigned int*)&addr[4], (unsigned int*)&addr[5],
|
||||
(unsigned int*)&addr[6], (unsigned int*)&addr[7],
|
||||
(unsigned int*)&addr[8], (unsigned int*)&addr[9],
|
||||
(unsigned int*)&addr[10], (unsigned int*)&addr[11]);
|
||||
(unsigned int *) &addr[0],
|
||||
(unsigned int *) &addr[1],
|
||||
(unsigned int *) &addr[2],
|
||||
(unsigned int *) &addr[3],
|
||||
(unsigned int *) &addr[4],
|
||||
(unsigned int *) &addr[5],
|
||||
(unsigned int *) &addr[6],
|
||||
(unsigned int *) &addr[7],
|
||||
(unsigned int *) &addr[8],
|
||||
(unsigned int *) &addr[9],
|
||||
(unsigned int *) &addr[10],
|
||||
(unsigned int *) &addr[11]);
|
||||
if (tmp != 12 || strlen((const char *) mac) != 17) {
|
||||
virXMLError(conn, VIR_ERR_INVALID_MAC, (const char *) mac, 0);
|
||||
goto error;
|
||||
@ -1383,12 +1432,15 @@ virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, vi
|
||||
else if (typ == 1) /* TODO does that work like that ? */
|
||||
virBufferVSprintf(buf, "(dev '%s')", (const char *) source);
|
||||
else {
|
||||
virNetworkPtr network = virNetworkLookupByName(conn, (const char *) source);
|
||||
virNetworkPtr network =
|
||||
virNetworkLookupByName(conn, (const char *) source);
|
||||
char *bridge;
|
||||
|
||||
if (!network || !(bridge = virNetworkGetBridgeName(network))) {
|
||||
if (network)
|
||||
virNetworkFree(network);
|
||||
virXMLError(conn, VIR_ERR_NO_SOURCE, (const char *) source, 0);
|
||||
virXMLError(conn, VIR_ERR_NO_SOURCE, (const char *) source,
|
||||
0);
|
||||
goto error;
|
||||
}
|
||||
virNetworkFree(network);
|
||||
@ -1436,7 +1488,8 @@ virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, vi
|
||||
* the caller must free() the returned value.
|
||||
*/
|
||||
char *
|
||||
virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int xendConfigVersion)
|
||||
virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name,
|
||||
int xendConfigVersion)
|
||||
{
|
||||
xmlDocPtr xml = NULL;
|
||||
xmlNodePtr node;
|
||||
@ -1473,8 +1526,8 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
|
||||
*/
|
||||
pctxt->sax->error = virCatchXMLParseError;
|
||||
|
||||
xml = xmlCtxtReadDoc(pctxt, (const xmlChar *) xmldesc, "domain.xml", NULL,
|
||||
XML_PARSE_NOENT | XML_PARSE_NONET |
|
||||
xml = xmlCtxtReadDoc(pctxt, (const xmlChar *) xmldesc, "domain.xml",
|
||||
NULL, XML_PARSE_NOENT | XML_PARSE_NONET |
|
||||
XML_PARSE_NOWARNING);
|
||||
if (xml == NULL) {
|
||||
goto error;
|
||||
@ -1513,8 +1566,8 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
|
||||
max_mem = (f / 1024);
|
||||
}
|
||||
|
||||
if ((virXPathNumber("number(/domain/currentMemory[1])", ctxt, &f) < 0) ||
|
||||
(f < MIN_XEN_GUEST_SIZE * 1024)) {
|
||||
if ((virXPathNumber("number(/domain/currentMemory[1])", ctxt, &f) < 0)
|
||||
|| (f < MIN_XEN_GUEST_SIZE * 1024)) {
|
||||
mem = max_mem;
|
||||
} else {
|
||||
mem = (f / 1024);
|
||||
@ -1575,8 +1628,8 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
|
||||
*/
|
||||
bootloader = 1;
|
||||
free(str);
|
||||
} else if (virXPathNumber("count(/domain/bootloader)", ctxt, &f) == 0 &&
|
||||
(f > 0)) {
|
||||
} else if (virXPathNumber("count(/domain/bootloader)", ctxt, &f) == 0
|
||||
&& (f > 0)) {
|
||||
virBufferVSprintf(&buf, "(bootloader)");
|
||||
/*
|
||||
* if using a bootloader, the kernel and initrd strings are not
|
||||
@ -1619,14 +1672,16 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
|
||||
|
||||
if ((str == NULL) || (strcmp(str, "hvm"))) {
|
||||
res = virDomainParseXMLOSDescPV(conn, node,
|
||||
&buf, ctxt, xendConfigVersion);
|
||||
&buf, ctxt,
|
||||
xendConfigVersion);
|
||||
} else {
|
||||
hvm = 1;
|
||||
res = virDomainParseXMLOSDescHVM(conn, node, &buf, ctxt,
|
||||
vcpus, xendConfigVersion);
|
||||
}
|
||||
|
||||
if (str != NULL) free(str);
|
||||
if (str != NULL)
|
||||
free(str);
|
||||
|
||||
if (res != 0)
|
||||
goto error;
|
||||
@ -1654,7 +1709,9 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
|
||||
if (nb_nodes > 0) {
|
||||
for (i = 0; i < nb_nodes; i++) {
|
||||
virBufferAdd(&buf, "(device ", 8);
|
||||
res = virDomainParseXMLIfDesc(conn, nodes[i], &buf, hvm, xendConfigVersion);
|
||||
res =
|
||||
virDomainParseXMLIfDesc(conn, nodes[i], &buf, hvm,
|
||||
xendConfigVersion);
|
||||
if (res != 0) {
|
||||
free(nodes);
|
||||
goto error;
|
||||
@ -1728,7 +1785,8 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
|
||||
* the caller must free() the returned value.
|
||||
*/
|
||||
char *
|
||||
virParseXMLDevice(virConnectPtr conn, const char *xmldesc, int hvm, int xendConfigVersion)
|
||||
virParseXMLDevice(virConnectPtr conn, const char *xmldesc, int hvm,
|
||||
int xendConfigVersion)
|
||||
{
|
||||
xmlDocPtr xml = NULL;
|
||||
xmlNodePtr node;
|
||||
@ -1751,14 +1809,15 @@ virParseXMLDevice(virConnectPtr conn, const char *xmldesc, int hvm, int xendConf
|
||||
if (node == NULL)
|
||||
goto error;
|
||||
if (xmlStrEqual(node->name, BAD_CAST "disk")) {
|
||||
if (virDomainParseXMLDiskDesc(conn, node, &buf, hvm, xendConfigVersion) != 0)
|
||||
if (virDomainParseXMLDiskDesc(conn, node, &buf, hvm,
|
||||
xendConfigVersion) != 0)
|
||||
goto error;
|
||||
/* SXP is not created when device is "floppy". */
|
||||
else if (buf.use == 0)
|
||||
goto error;
|
||||
}
|
||||
else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
|
||||
if (virDomainParseXMLIfDesc(conn, node, &buf, hvm, xendConfigVersion) != 0)
|
||||
} else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
|
||||
if (virDomainParseXMLIfDesc(conn, node, &buf, hvm,
|
||||
xendConfigVersion) != 0)
|
||||
goto error;
|
||||
} else {
|
||||
virXMLError(conn, VIR_ERR_XML_ERROR, (const char *) node->name, 0);
|
||||
@ -1789,11 +1848,13 @@ virParseXMLDevice(virConnectPtr conn, const char *xmldesc, int hvm, int xendConf
|
||||
* Returns 0 in case of success, -1 in case of failure.
|
||||
*/
|
||||
int
|
||||
virDomainXMLDevID(virDomainPtr domain, const char *xmldesc, char *class, char *ref, int ref_len)
|
||||
virDomainXMLDevID(virDomainPtr domain, const char *xmldesc, char *class,
|
||||
char *ref, int ref_len)
|
||||
{
|
||||
xmlDocPtr xml = NULL;
|
||||
xmlNodePtr node, cur;
|
||||
xmlChar *attr = NULL;
|
||||
|
||||
#ifdef WITH_XEN
|
||||
char *xref;
|
||||
#endif /* WITH_XEN */
|
||||
@ -1813,7 +1874,8 @@ virDomainXMLDevID(virDomainPtr domain, const char *xmldesc, char *class, char *r
|
||||
strcpy(class, "vbd");
|
||||
for (cur = node->children; cur != NULL; cur = cur->next) {
|
||||
if ((cur->type != XML_ELEMENT_NODE) ||
|
||||
(!xmlStrEqual(cur->name, BAD_CAST "target"))) continue;
|
||||
(!xmlStrEqual(cur->name, BAD_CAST "target")))
|
||||
continue;
|
||||
attr = xmlGetProp(cur, BAD_CAST "dev");
|
||||
if (attr == NULL)
|
||||
goto error;
|
||||
@ -1821,12 +1883,12 @@ virDomainXMLDevID(virDomainPtr domain, const char *xmldesc, char *class, char *r
|
||||
ref[ref_len - 1] = '\0';
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
|
||||
} else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
|
||||
strcpy(class, "vif");
|
||||
for (cur = node->children; cur != NULL; cur = cur->next) {
|
||||
if ((cur->type != XML_ELEMENT_NODE) ||
|
||||
(!xmlStrEqual(cur->name, BAD_CAST "mac"))) continue;
|
||||
(!xmlStrEqual(cur->name, BAD_CAST "mac")))
|
||||
continue;
|
||||
attr = xmlGetProp(cur, BAD_CAST "address");
|
||||
if (attr == NULL)
|
||||
goto error;
|
||||
|
Loading…
Reference in New Issue
Block a user