Signed-off-by: Jim Paris <jim(a)jtan.com>
---
src/qemu_conf.c | 21 +++++++++++++++++++++
src/qemu_conf.h | 2 ++
2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
index f3b8f4e..c463ffb 100644
--- a/src/qemu_conf.c
+++ b/src/qemu_conf.c
@@ -644,6 +644,7 @@ static struct qemud_vm_net_def *qemudParseInterfaceXML(virConnectPtr
conn,
struct qemud_vm_net_def *net = calloc(1, sizeof(struct qemud_vm_net_def));
xmlNodePtr cur;
xmlChar *macaddr = NULL;
+ xmlChar *model = NULL;
xmlChar *type = NULL;
xmlChar *network = NULL;
xmlChar *bridge = NULL;
@@ -687,6 +688,9 @@ static struct qemud_vm_net_def *qemudParseInterfaceXML(virConnectPtr
conn,
if ((macaddr == NULL) &&
(xmlStrEqual(cur->name, BAD_CAST "mac"))) {
macaddr = xmlGetProp(cur, BAD_CAST "address");
+ } else if ((model == NULL) &&
+ (xmlStrEqual(cur->name, BAD_CAST "nic"))) {
+ model = xmlGetProp(cur, BAD_CAST "model");
} else if ((network == NULL) &&
(net->type == QEMUD_NET_NETWORK) &&
(xmlStrEqual(cur->name, BAD_CAST "source"))) {
@@ -739,6 +743,21 @@ static struct qemud_vm_net_def *qemudParseInterfaceXML(virConnectPtr
conn,
qemudRandomMAC(net);
}
+ if (model) {
+ int len;
+
+ if ((len = xmlStrlen(model)) >= (QEMUD_MAX_MODEL_LEN-1)) {
+ qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ "NIC model type '%s' is too long",
model);
+ goto error;
+ } else {
+ strncpy(net->model, (char *)model, len);
+ net->model[len] = '\0';
+ }
+ xmlFree(model);
+ model = NULL;
+ }
+
if (net->type == QEMUD_NET_NETWORK) {
int len;
@@ -872,6 +891,8 @@ static struct qemud_vm_net_def *qemudParseInterfaceXML(virConnectPtr
conn,
return net;
error:
+ if (model)
+ xmlFree(model);
if (network)
xmlFree(network);
if (address)
diff --git a/src/qemu_conf.h b/src/qemu_conf.h
index e1844da..d95871e 100644
--- a/src/qemu_conf.h
+++ b/src/qemu_conf.h
@@ -79,6 +79,7 @@ enum qemud_vm_net_type {
};
#define QEMUD_MAX_NAME_LEN 50
+#define QEMUD_MAX_MODEL_LEN 16
#define QEMUD_MAX_XML_LEN 4096
#define QEMUD_MAX_ERROR_LEN 1024
@@ -86,6 +87,7 @@ enum qemud_vm_net_type {
struct qemud_vm_net_def {
int type;
unsigned char mac[QEMUD_MAC_ADDRESS_LEN];
+ char model[QEMUD_MAX_MODEL_LEN];
union {
struct {
char ifname[BR_IFNAME_MAXLEN];
--
1.5.3.4