switch (def->type) {
case VIR_DOMAIN_NET_TYPE_ETHERNET:
VIR_FREE(def->data.ethernet.dev);
- VIR_FREE(def->data.ethernet.script);
VIR_FREE(def->data.ethernet.ipaddr);
break;
case VIR_DOMAIN_NET_TYPE_BRIDGE:
VIR_FREE(def->data.bridge.brname);
- VIR_FREE(def->data.bridge.script);
VIR_FREE(def->data.bridge.ipaddr);
break;
break;
}
+ VIR_FREE(def->script);
VIR_FREE(def->ifname);
virDomainDeviceInfoClear(&def->info);
xmlStrEqual(cur->name, BAD_CAST "link")) {
linkstate = virXMLPropString(cur, "state");
} else if ((script == NULL) &&
- (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET ||
- def->type == VIR_DOMAIN_NET_TYPE_BRIDGE) &&
xmlStrEqual(cur->name, BAD_CAST "script")) {
script = virXMLPropString(cur, "path");
} else if (xmlStrEqual (cur->name, BAD_CAST "model")) {
break;
case VIR_DOMAIN_NET_TYPE_ETHERNET:
-
- if (script != NULL) {
- def->data.ethernet.script = script;
- script = NULL;
- }
if (dev != NULL) {
def->data.ethernet.dev = dev;
dev = NULL;
}
def->data.bridge.brname = bridge;
bridge = NULL;
- if (script != NULL) {
- def->data.bridge.script = script;
- script = NULL;
- }
if (address != NULL) {
def->data.bridge.ipaddr = address;
address = NULL;
break;
}
+ if (script != NULL) {
+ def->script = script;
+ script = NULL;
+ }
if (ifname != NULL) {
def->ifname = ifname;
ifname = NULL;
if (def->data.ethernet.ipaddr)
virBufferAsprintf(buf, " <ip address='%s'/>\n",
def->data.ethernet.ipaddr);
- virBufferEscapeString(buf, " <script path='%s'/>\n",
- def->data.ethernet.script);
break;
case VIR_DOMAIN_NET_TYPE_BRIDGE:
if (def->data.bridge.ipaddr)
virBufferAsprintf(buf, " <ip address='%s'/>\n",
def->data.bridge.ipaddr);
- virBufferEscapeString(buf, " <script path='%s'/>\n",
- def->data.bridge.script);
break;
case VIR_DOMAIN_NET_TYPE_SERVER:
break;
}
-
+ virBufferEscapeString(buf, " <script path='%s'/>\n",
+ def->script);
if (def->ifname &&
!((flags & VIR_DOMAIN_XML_INACTIVE) &&
(STRPREFIX(def->ifname, VIR_NET_GENERATED_PREFIX)))) {
union {
struct {
char *dev;
- char *script;
char *ipaddr;
} ethernet;
struct {
} network;
struct {
char *brname;
- char *script;
char *ipaddr;
} bridge;
struct {
bool sndbuf_specified;
unsigned long sndbuf;
} tune;
+ char *script;
char *ifname;
int bootIndex;
virDomainDeviceInfo info;
virReportOOMError();
return -1;
}
- if (l_nic->data.bridge.script &&
- (x_nic->script = strdup(l_nic->data.bridge.script)) == NULL) {
+ if (l_nic->script &&
+ (x_nic->script = strdup(l_nic->script)) == NULL) {
virReportOOMError();
return -1;
}
+ } else {
+ if (l_nic->script) {
+ libxlError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("scripts are not supported on interfaces of type %s"),
+ virDomainNetTypeToString(l_nic->type));
+ return -1;
+ }
}
return 0;
{
bool is_tap = false;
virBuffer buf = VIR_BUFFER_INITIALIZER;
+ enum virDomainNetType netType = virDomainNetGetActualType(net);
- switch (virDomainNetGetActualType(net)) {
+ if (net->script && netType != VIR_DOMAIN_NET_TYPE_ETHERNET) {
+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("scripts are not supported on interfaces of type %s"),
+ virDomainNetTypeToString(netType));
+ return NULL;
+ }
+
+ switch (netType) {
case VIR_DOMAIN_NET_TYPE_NETWORK:
case VIR_DOMAIN_NET_TYPE_BRIDGE:
case VIR_DOMAIN_NET_TYPE_DIRECT:
virBufferAsprintf(&buf, "%cifname=%s", type_sep, net->ifname);
type_sep = ',';
}
- if (net->data.ethernet.script) {
+ if (net->script) {
virBufferAsprintf(&buf, "%cscript=%s", type_sep,
- net->data.ethernet.script);
+ net->script);
type_sep = ',';
}
is_tap = true;
case VIR_DOMAIN_NET_TYPE_SERVER:
case VIR_DOMAIN_NET_TYPE_MCAST:
virBufferAddLit(&buf, "socket");
- switch (virDomainNetGetActualType(net)) {
+ switch (netType) {
case VIR_DOMAIN_NET_TYPE_CLIENT:
virBufferAsprintf(&buf, "%cconnect=%s:%d",
type_sep,
}
} else if (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
STREQ(keywords[i], "script") && STRNEQ(values[i], "")) {
- def->data.ethernet.script = values[i];
+ def->script = values[i];
values[i] = NULL;
} else if (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
STREQ(keywords[i], "ifname")) {
virDomainNetDefPtr net,
int logFD)
{
- if ((net->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
- net->data.ethernet.script != NULL) ||
- (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE &&
- net->data.bridge.script != NULL))
+ /* script is only useful for NET_TYPE_ETHERNET (qemu) and
+ * NET_TYPE_BRIDGE (xen), but could be (incorrectly) specified for
+ * any interface type. In any case, it's adding user sauce into
+ * the soup, so it should taint the domain.
+ */
+ if (net->script != NULL)
qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_SHELL_SCRIPTS, logFD);
}
memset(net, 0, sizeof *net);
net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
+ net->script = NULL;
net->data.ethernet.dev = brnamecopy;
- net->data.ethernet.script = NULL;
net->data.ethernet.ipaddr = NULL;
} else {
/* actualType is either NETWORK or DIRECT. In either
memset(net, 0, sizeof *net);
net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
+ net->script = NULL;
net->data.ethernet.dev = NULL;
- net->data.ethernet.script = NULL;
net->data.ethernet.ipaddr = NULL;
}
} else if (net->type == VIR_DOMAIN_NET_TYPE_DIRECT) {
memset(net, 0, sizeof *net);
net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
+ net->script = NULL;
net->data.ethernet.dev = NULL;
- net->data.ethernet.script = NULL;
net->data.ethernet.ipaddr = NULL;
} else if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
+ char *script = net->script;
char *brname = net->data.bridge.brname;
- char *script = net->data.bridge.script;
char *ipaddr = net->data.bridge.ipaddr;
memset(net, 0, sizeof *net);
net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
+ net->script = script;
net->data.ethernet.dev = brname;
- net->data.ethernet.script = script;
net->data.ethernet.ipaddr = ipaddr;
}
net->bootIndex = bootIndex;
case VIR_DOMAIN_NET_TYPE_ETHERNET:
if (STRNEQ_NULLABLE(olddev->data.ethernet.dev, dev->data.ethernet.dev) ||
- STRNEQ_NULLABLE(olddev->data.ethernet.script, dev->data.ethernet.script) ||
+ STRNEQ_NULLABLE(olddev->script, dev->script) ||
STRNEQ_NULLABLE(olddev->data.ethernet.ipaddr, dev->data.ethernet.ipaddr)) {
qemuReportError(VIR_ERR_NO_SUPPORT,
_("cannot modify ethernet network device configuration"));
_("IP address not supported for ethernet interface"));
goto error;
}
- if (def->data.ethernet.script) {
- umlReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("script execution not supported for ethernet interface"));
- goto error;
- }
break;
case VIR_DOMAIN_NET_TYPE_SERVER:
break;
}
+ if (def->script) {
+ umlReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("interface script execution not supported by this driver"));
+ goto error;
+ }
+
virBufferAsprintf(&buf, ",%02x:%02x:%02x:%02x:%02x:%02x",
def->mac[0], def->mac[1], def->mac[2],
def->mac[3], def->mac[4], def->mac[5]);
VIR_DEBUG("NIC(%d): NAT.", i);
} else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
VIR_DEBUG("NIC(%d): brname: %s", i, def->nets[i]->data.bridge.brname);
- VIR_DEBUG("NIC(%d): script: %s", i, def->nets[i]->data.bridge.script);
+ VIR_DEBUG("NIC(%d): script: %s", i, def->nets[i]->script);
VIR_DEBUG("NIC(%d): ipaddr: %s", i, def->nets[i]->data.bridge.ipaddr);
}
goto no_memory;
if (tmp2 &&
net->type == VIR_DOMAIN_NET_TYPE_BRIDGE &&
- !(net->data.bridge.script = strdup(tmp2)))
+ !(net->script = strdup(tmp2)))
goto no_memory;
tmp = sexpr_node(node, "device/vif/ip");
if (tmp &&
} else {
net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
if (tmp2 &&
- !(net->data.ethernet.script = strdup(tmp2)))
+ !(net->script = strdup(tmp2)))
goto no_memory;
tmp = sexpr_node(node, "device/vif/ip");
if (tmp &&
_("unsupported network type %d"), def->type);
return -1;
}
+ if (def->script &&
+ def->type != VIR_DOMAIN_NET_TYPE_BRIDGE &&
+ def->type != VIR_DOMAIN_NET_TYPE_ETHERNET) {
+ XENXS_ERROR(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("scripts are not supported on interfaces of type %s"),
+ virDomainNetTypeToString(def->type));
+ return -1;
+ }
if (!isAttach)
virBufferAddLit(buf, "(device ");
switch (def->type) {
case VIR_DOMAIN_NET_TYPE_BRIDGE:
virBufferEscapeSexpr(buf, "(bridge '%s')", def->data.bridge.brname);
- if (def->data.bridge.script)
- script = def->data.bridge.script;
+ if (def->script)
+ script = def->script;
virBufferEscapeSexpr(buf, "(script '%s')", script);
if (def->data.bridge.ipaddr != NULL)
break;
case VIR_DOMAIN_NET_TYPE_ETHERNET:
- if (def->data.ethernet.script)
+ if (def->script)
virBufferEscapeSexpr(buf, "(script '%s')",
- def->data.ethernet.script);
+ def->script);
if (def->data.ethernet.ipaddr != NULL)
virBufferEscapeSexpr(buf, "(ip '%s')", def->data.ethernet.ipaddr);
break;
if (bridge[0] &&
!(net->data.bridge.brname = strdup(bridge)))
goto no_memory;
- if (script[0] &&
- !(net->data.bridge.script = strdup(script)))
- goto no_memory;
if (ip[0] &&
!(net->data.bridge.ipaddr = strdup(ip)))
goto no_memory;
} else {
- if (script && script[0] &&
- !(net->data.ethernet.script = strdup(script)))
- goto no_memory;
if (ip[0] &&
!(net->data.ethernet.ipaddr = strdup(ip)))
goto no_memory;
}
+ if (script && script[0] &&
+ !(net->script = strdup(script)))
+ goto no_memory;
+
if (model[0] &&
!(net->model = strdup(model)))
goto no_memory;
break;
case VIR_DOMAIN_NET_TYPE_ETHERNET:
- if (net->data.ethernet.script)
- virBufferAsprintf(&buf, ",script=%s", net->data.ethernet.script);
+ if (net->script)
+ virBufferAsprintf(&buf, ",script=%s", net->script);
if (net->data.ethernet.ipaddr)
virBufferAsprintf(&buf, ",ip=%s", net->data.ethernet.ipaddr);
break;