[libvirt] [libvirt-test-API][PATCH 0/2] Add API openGraphicsFD test case
by Jincheng Miao
Add API openGraphicsFD test case to linux_domain.conf
Jincheng Miao (2):
domain: add open_graphicsfd
Add open_graphicsFD to linux_domain.conf
cases/linux_domain.conf | 14 ++++++
repos/domain/open_graphicsfd.py | 89 +++++++++++++++++++++++++++++++++++++++
2 files changed, 103 insertions(+), 0 deletions(-)
create mode 100644 repos/domain/open_graphicsfd.py
9 years, 10 months
[libvirt] [PATCH v2] cpu: add Freescale ppc64 CPU models
by Olivia Yin
From: Olivia Yin <hong-hua.yin(a)freescale.com>
With this patch, Freescale ppc64 CPU modesl could be recognized.
virsh # cpu-models ppc64
POWERPC_e6500
POWERPC_e5500
power8
power8e
power7+
power7
power6
POWER8_v1.0
POWER7+_v2.1
POWER7_v2.3
POWER7_v2.1
POWER7
virsh # capabilities
<capabilities>
<host>
<uuid>5a54efa6-20dc-4da7-b271-0b7fb7062cb8</uuid>
<cpu>
<arch>ppc64</arch>
<model>POWERPC_e6500</model>
<vendor>Freescale</vendor>
---
src/cpu/cpu_map.xml | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/cpu/cpu_map.xml b/src/cpu/cpu_map.xml
index bd9b056..413148f 100644
--- a/src/cpu/cpu_map.xml
+++ b/src/cpu/cpu_map.xml
@@ -600,6 +600,7 @@
<arch name='ppc64'>
<!-- vendor definitions -->
<vendor name='IBM'/>
+ <vendor name='Freescale'/>
<!-- IBM-based CPU models -->
<model name='POWER7'>
@@ -657,5 +658,16 @@
<pvr value='0x004d0000'/>
</model>
+<!-- Freescale-based CPU models -->
+ <model name='POWERPC_e5500'>
+ <vendor name='Freescale'/>
+ <pvr value='0x80240000'/>
+ </model>
+
+ <model name='POWERPC_e6500'>
+ <vendor name='Freescale'/>
+ <pvr value='0x80400000'/>
+ </model>
+
</arch>
</cpus>
--
2.1.0.27.g96db324
9 years, 10 months
[libvirt] [PATCHv2] lxc: fix show the wrong xml when guest start failed
by Luyao Huang
https://bugzilla.redhat.com/show_bug.cgi?id=1176503
When guest start failed, libvirt will keep the current vm->def,
this will make a issue that we cannot get a right xml after guest
start failed. And don't call the stop/release hook to do some
other clean work.
Call virLXCProcessCleanup to help us clean the source and call
the hooks if start a vm failed.
Signed-off-by: Luyao Huang <lhuang(a)redhat.com>
---
v2: use virLXCProcessCleanup to free the source and call the hook.
src/lxc/lxc_process.c | 69 ++++++++++++++++++++++-----------------------------
1 file changed, 29 insertions(+), 40 deletions(-)
diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
index d7eb8bc..7ba0da8 100644
--- a/src/lxc/lxc_process.c
+++ b/src/lxc/lxc_process.c
@@ -1006,6 +1006,7 @@ int virLXCProcessStart(virConnectPtr conn,
virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
virCgroupPtr selfcgroup;
int status;
+ bool need_stop = false;
if (virCgroupNewSelf(&selfcgroup) < 0)
return -1;
@@ -1265,18 +1266,20 @@ int virLXCProcessStart(virConnectPtr conn,
goto cleanup;
}
+ need_stop = true;
+
if (virCgroupNewDetectMachine(vm->def->name, "lxc", vm->pid,
vm->def->resource ?
vm->def->resource->partition :
NULL,
-1, &priv->cgroup) < 0)
- goto error;
+ goto cleanup;
if (!priv->cgroup) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("No valid cgroup for machine %s"),
vm->def->name);
- goto error;
+ goto cleanup;
}
priv->stopReason = VIR_DOMAIN_EVENT_STOPPED_FAILED;
@@ -1296,17 +1299,17 @@ int virLXCProcessStart(virConnectPtr conn,
_("guest failed to start: %s"), out);
}
- goto error;
+ goto cleanup;
}
if (autoDestroy &&
virCloseCallbacksSet(driver->closeCallbacks, vm,
conn, lxcProcessAutoDestroy) < 0)
- goto error;
+ goto cleanup;
if (virDomainObjSetDefTransient(caps, driver->xmlopt,
vm, false) < 0)
- goto error;
+ goto cleanup;
/* We don't need the temporary NIC names anymore, clear them */
virLXCProcessCleanInterfaces(vm->def);
@@ -1318,7 +1321,7 @@ int virLXCProcessStart(virConnectPtr conn,
* it with the live status XML instead. This is a (currently
* harmless) inconsistency we should fix one day */
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
- goto error;
+ goto cleanup;
/* finally we can call the 'started' hook script if any */
if (virHookPresent(VIR_HOOK_DRIVER_LXC)) {
@@ -1334,47 +1337,38 @@ int virLXCProcessStart(virConnectPtr conn,
* If the script raised an error abort the launch
*/
if (hookret < 0)
- goto error;
+ goto cleanup;
}
rc = 0;
cleanup:
- if (rc != 0 && !err)
- err = virSaveLastError();
- virCommandFree(cmd);
if (VIR_CLOSE(logfd) < 0) {
virReportSystemError(errno, "%s", _("could not close logfile"));
rc = -1;
}
- for (i = 0; i < nveths; i++) {
- if (rc != 0 && veths[i])
- ignore_value(virNetDevVethDelete(veths[i]));
- VIR_FREE(veths[i]);
- }
if (rc != 0) {
- if (vm->newDef) {
- virDomainDefFree(vm->newDef);
- vm->newDef = NULL;
- }
- if (priv->monitor) {
- virObjectUnref(priv->monitor);
- priv->monitor = NULL;
- }
- virDomainConfVMNWFilterTeardown(vm);
-
- virSecurityManagerRestoreAllLabel(driver->securityManager,
- vm->def, false);
- virSecurityManagerReleaseLabel(driver->securityManager, vm->def);
- /* Clear out dynamically assigned labels */
- if (vm->def->nseclabels &&
- vm->def->seclabels[0]->type == VIR_DOMAIN_SECLABEL_DYNAMIC) {
- VIR_FREE(vm->def->seclabels[0]->model);
- VIR_FREE(vm->def->seclabels[0]->label);
- VIR_FREE(vm->def->seclabels[0]->imagelabel);
- VIR_DELETE_ELEMENT(vm->def->seclabels, 0, vm->def->nseclabels);
+ err = virSaveLastError();
+ if (need_stop) {
+ virLXCProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
+ } else {
+ virSecurityManagerRestoreAllLabel(driver->securityManager,
+ vm->def, false);
+ virSecurityManagerReleaseLabel(driver->securityManager, vm->def);
+ /* Clear out dynamically assigned labels */
+ if (vm->def->nseclabels &&
+ vm->def->seclabels[0]->type == VIR_DOMAIN_SECLABEL_DYNAMIC) {
+ VIR_FREE(vm->def->seclabels[0]->model);
+ VIR_FREE(vm->def->seclabels[0]->label);
+ VIR_FREE(vm->def->seclabels[0]->imagelabel);
+ VIR_DELETE_ELEMENT(vm->def->seclabels, 0, vm->def->nseclabels);
+ }
+ virLXCProcessCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
}
}
+ virCommandFree(cmd);
+ for (i = 0; i < nveths; i++)
+ VIR_FREE(veths[i]);
for (i = 0; i < nttyFDs; i++)
VIR_FORCE_CLOSE(ttyFDs[i]);
VIR_FREE(ttyFDs);
@@ -1390,11 +1384,6 @@ int virLXCProcessStart(virConnectPtr conn,
}
return rc;
-
- error:
- err = virSaveLastError();
- virLXCProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
- goto cleanup;
}
struct virLXCProcessAutostartData {
--
1.8.3.1
9 years, 10 months
[libvirt] [libvirt-test-API][PATCH V2 00/11] Add network_dhcp_leases test case
by jiahu
For checking IPv6 address, libvirt need a IPv6 testing environment,
so modified some cases and configuration files, also there are some
small changes for other requirements.
There are 9 new commits after comparing with the V1:
Add global IPv6 default values to network part
Add IPv6 section into network template xml
Add IPv6 section into related network case
Add xml file for <host> of IPv6 family
Remove extra space from xml
Change bridge name as a variable in functions
Obtain a IPv6 addr on interface
Change bridge name as a variable in XML
Support brige name argument in cases
According to those new commits in V2, updated its conf.
Add network_dhcp_leases test case to conf
jiahu (11):
Add network_dhcp_leases test case
Add global IPv6 default values to network part
Add IPv6 section into network template xml
Add IPv6 section into related network case
Add xml file for <host> of IPv6 family
Remove extra space from xml
Change bridge name as a variable in functions
Obtain a IPv6 addr on interface
Change bridge name as a variable in XML
Support brige name argument in cases
Add network_dhcp_leases test case to conf
cases/basic_network.conf | 100 ++++++++
global.cfg | 9 +
kickstart.cfg | 2 +-
repos/domain/destroy.py | 5 +-
repos/domain/install_linux_cdrom.py | 5 +-
.../domain/xmls/kvm_linux_guest_install_cdrom.xml | 2 +-
repos/network/define.py | 7 +-
repos/network/network_dhcp_leases.py | 277 +++++++++++++++++++++
repos/network/xmls/ip-dhcp-host.xml | 2 +-
repos/network/xmls/ipv6-dhcp-host.xml | 1 +
repos/network/xmls/network.xml | 5 +
utils/ipget.sh | 7 +-
utils/utils.py | 7 +-
13 files changed, 419 insertions(+), 10 deletions(-)
create mode 100644 repos/network/network_dhcp_leases.py
create mode 100644 repos/network/xmls/ipv6-dhcp-host.xml
--
1.8.3.1
9 years, 10 months
[libvirt] [PATCH] virsh: report 0-length active block-commit job status
by Eric Blake
At least with live block commit, it is possible to have a block
job that reports 0 status: namely, when the active image contains
no sectors that differ from the backing image it is being committed
into [1]. I'm not sure if that represents a qemu bug, but it leads
to weird virsh output where 'virsh blockjob $dom vda' has no output
during a no-op commit job. It appears that the special case for
a zero total was first introduced for migration, where it does sort
of make sense (when we do storage migration, the job is broken up
into two pieces where the first half of migrating storage has no
clue what the total length of the second phase will be, and where
qemu migration always reports a non-zero total length but only once
we complete the first phase to start actual migration), but it
doesn't seem to make sense for any of the block jobs.
[1] https://www.redhat.com/archives/libvir-list/2015-January/msg00348.html
* tools/virsh-domain.c (vshPrintJobProgress): Move special-case of
0 total...
(vshWatchJob): ...into lone caller where it matters.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
tools/virsh-domain.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 6733cfa..ec62aae 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -1,7 +1,7 @@
/*
* virsh-domain.c: Commands to manage domain
*
- * Copyright (C) 2005, 2007-2014 Red Hat, Inc.
+ * Copyright (C) 2005, 2007-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1678,10 +1678,6 @@ vshPrintJobProgress(const char *label, unsigned long long remaining,
{
int progress;
- if (total == 0)
- /* migration has not been started */
- return;
-
if (remaining == 0) {
/* migration has completed */
progress = 100;
@@ -4189,7 +4185,7 @@ vshWatchJob(vshControl *ctl,
ret = virDomainGetJobInfo(dom, &jobinfo);
pthread_sigmask(SIG_SETMASK, &oldsigmask, NULL);
if (ret == 0) {
- if (verbose)
+ if (verbose && jobinfo.dataTotal)
vshPrintJobProgress(label, jobinfo.dataRemaining,
jobinfo.dataTotal);
--
2.1.0
9 years, 10 months
[libvirt] [PATCH 0/8] qemu: support setting device's boot order when VM is running
by Wang Rui
QEMU supported to set device's boot index online recently(since QEMU 2.2.0).
http://lists.gnu.org/archive/html/qemu-devel/2014-10/msg00879.html
The QMP "qom-set" is available for setting boot index. qom-set's example is as follows:
{
.name = "qom-set",
.args_type = "path:s,property:s,value:q",
.mhandler.cmd_new = qmp_qom_set,
}
(qemu) qom-set nic1 bootindex 3
(qemu) qom-set nic1 bootindex -1
(qemu) qom-set scsi0-0-0-0 bootindex 2
Setting boot index to -1 means cancel it.
We can attach/update a device and set it's boot order when VM is running. The boot
order will take effect immediately(after guest rebooting). For example, we can use
'virsh update-device' to change an interface's boot order. The xml is specified as
below.
<interface type='bridge'>
<mac address='fa:16:3e:2e:d4:3d'/>
<source bridge='br0'/>
<target dev='tap4f2bce78-5b'/>
<model type='virtio'/>
<driver queues='4'/>
<boot order='2'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
If the 'boot order' is not specified in the xml, that means canceling its boot order.
Wang Rui (8):
qemu: add a new qemuMonitorSetBootIndex() method to set device's
bootorder
qemu: support attachment of net device with boot index
conf: check boot order which is used by itself
qemu: a code movement
qemu: support attachment of disk device with boot index
conf: add compatiblity check for boot index when updating device
qemu: support updating interface with boot index
qemu: support updating disk with boot index
src/conf/device_conf.c | 13 ++
src/conf/device_conf.h | 12 ++
src/conf/domain_conf.c | 74 ++++++----
src/conf/domain_conf.h | 9 --
src/qemu/qemu_driver.c | 64 +++++++--
src/qemu/qemu_hotplug.c | 329 +++++++++++++++++++++++++++++++------------
src/qemu/qemu_hotplug.h | 4 +
src/qemu/qemu_monitor.c | 25 ++++
src/qemu/qemu_monitor.h | 4 +
src/qemu/qemu_monitor_json.c | 19 +++
src/qemu/qemu_monitor_json.h | 5 +
11 files changed, 424 insertions(+), 134 deletions(-)
--
1.7.12.4
9 years, 10 months
[libvirt] Missing libxl_device_nic settings
by Kim Larry
Hi,
I was trying to pass ip address to scripts/vif-bridge by putting <ip address=""/> in guest config xml file, however, I found that libxlMakeNic(which located in libxl/libxl_conf.c:956) doesn't set x_nic->ip. So I patched myself but I'm not so sure about VIR_DOMAIN_NET_TYPE_ETHERNET. It seems like vif-route, correct?
Here is my patch:
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 0555b91..0effc59 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1047,10 +1047,18 @@ libxlMakeNic(virDomainDefPtr def,
if (VIR_STRDUP(x_nic->bridge,
virDomainNetGetActualBridgeName(l_nic)) < 0)
return -1;
- /* fallthrough */
+ if (VIR_STRDUP(x_nic->script, l_nic->script) < 0)
+ return -1;
+ if (VIR_STRDUP(x_nic->ip, l_nic->data.bridge.ipaddr) < 0)
+ return -1;
+ break;
case VIR_DOMAIN_NET_TYPE_ETHERNET:
if (VIR_STRDUP(x_nic->script, l_nic->script) < 0)
return -1;
+ if (VIR_STRDUP(x_nic->ip, l_nic->data.ethernet.ipaddr) < 0)
+ return -1;
+ if (VIR_STRDUP(x_nic->gatewaydev, l_nic->data.ethernet.dev) < 0)
+ return -1;
break;
case VIR_DOMAIN_NET_TYPE_NETWORK:
{
Regards,
Jihoon
9 years, 10 months
[libvirt] [PATCH] storage: Need to clear pool prior to refreshPool during Autostart
by John Ferlan
https://bugzilla.redhat.com/show_bug.cgi?id=1176510
When storageDriverAutostart is called path virStateReload via a 'service
libvirtd reload', then because the volume list in the pool wasn't cleared
prior to the call, each volume would be listed multiple times (as many
times as we reload). I believe the issue would be introduced by commit
id '9e093f0b' at least for the libvirtd reload path, although I suppose
the introduction of virStateReload (commit id '70da0494') could be a
different cause.
Thus like other places prior to calling refreshPool, we need to call
virStoragePoolObjClearVols
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/storage/storage_driver.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index e1dd448..ad92c9b 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -125,6 +125,7 @@ storageDriverAutostart(void)
}
if (started) {
+ virStoragePoolObjClearVols(pool);
if (backend->refreshPool(conn, pool) < 0) {
virErrorPtr err = virGetLastError();
if (backend->stopPool)
--
2.1.0
9 years, 10 months
[libvirt] [PATCHv2 00/13] memory hotplug: Preliminary fixes and cleanups
by Peter Krempa
This series was split out from my memory hotplug series that is not quite ready
yet. The aim of this series is to refactor the code that creates commandline
for the memory-backend-* qemu object so that it can be later reused for hotplug
via monitor. Additionally this series also fixes a bug in NUMA memory
initialisation where qemu doesn't support a combination of old and new approach.
Version 2 fixes bugs found by first round of review. Patch 4/13 is new in
this series. Please see individual patches for changes. (If the change line
isn't present the patch was not reviewed)
Peter Krempa (13):
conf: numatune: Extract code for requesting memory nodeset from
formatting
test: utils: Add helpers for automatic numbering of test cases
util: json: make value object creator universal by supporting adding
util: bitmap: Add option to allocate bitmap without reporting error
util: json: Add functions to convert JSON arrays from/to virBitmaps
util: json: add helper to iterate JSON object key=value pairs
qemu: command: Add helper to format -object strings from JSON
representation
qemu: Extract code to setup memory backing objects
qemu: command: Shuffle around formating of alias for memory backend
objs
qemu: command: Unify values for boolean values when formating memory
backends
qemu: command: Switch to bytes when formatting size for memory
backends
qemu: command: Refactor NUMA backend object formatting to use JSON
objs
qemu: command: Don't combine old and modern NUMA node creation
src/conf/numatune_conf.c | 33 +-
src/conf/numatune_conf.h | 5 +
src/libvirt_private.syms | 7 +
src/qemu/qemu_command.c | 547 +++++++++++++++------
src/qemu/qemu_command.h | 4 +
src/util/virbitmap.c | 42 +-
src/util/virbitmap.h | 1 +
src/util/virjson.c | 222 ++++++++-
src/util/virjson.h | 17 +
tests/Makefile.am | 13 +-
tests/qemucommandutiltest.c | 118 +++++
.../qemuxml2argv-hugepages-pages.args | 20 +-
.../qemuxml2argv-hugepages-pages2.args | 8 +-
.../qemuxml2argv-hugepages-pages3.args | 7 +-
.../qemuxml2argv-hugepages-shared.args | 20 +-
.../qemuxml2argv-numatune-memnode-no-memory.args | 6 +-
.../qemuxml2argv-numatune-memnode.args | 8 +-
tests/testutils.c | 52 ++
tests/testutils.h | 3 +
19 files changed, 912 insertions(+), 221 deletions(-)
create mode 100644 tests/qemucommandutiltest.c
--
2.2.2
9 years, 10 months
[libvirt] [PATCH] util: make virNetDev(Get|Set)IFFlags() static
by Laine Stump
e562a61a0739 added these two new helper functions and only used them
within virnetdev.c, but declared them in the .h file. If some
currently unsupported interface flags need to be accessed in the
future, it will make more sense to write the appropriate higher level
function rather than require us to artificially define IFF_* on some
mythical platform that doesn't have SIOC[SG]IFFLAGS (and therefore
doesn't have IFF_*) just so we can call virNetDevSetIFFFlags() to
return an error.
To help someone in not going down the wrong road, this patch makes the
two helper functions static, hopefully making it less likely that
someone will want to use them outside of virnetdev.c.
---
src/util/virnetdev.c | 22 +++++++++++++---------
src/util/virnetdev.h | 10 +---------
2 files changed, 14 insertions(+), 18 deletions(-)
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
index 7a0a43d..4be6265 100644
--- a/src/util/virnetdev.c
+++ b/src/util/virnetdev.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007-2014 Red Hat, Inc.
+ * Copyright (C) 2007-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -610,7 +610,8 @@ int virNetDevSetName(const char* ifname, const char *newifname)
#if defined(SIOCSIFFLAGS) && defined(HAVE_STRUCT_IFREQ)
-int virNetDevSetIFFlag(const char *ifname, int flag, bool val)
+static int
+virNetDevSetIFFlag(const char *ifname, int flag, bool val)
{
int fd = -1;
int ret = -1;
@@ -649,9 +650,10 @@ int virNetDevSetIFFlag(const char *ifname, int flag, bool val)
return ret;
}
#else
-int virNetDevSetIFFlag(const char *ifname,
- int flag ATTRIBUTE_UNUSED,
- bool val ATTRIBUTE_UNUSED)
+static int
+virNetDevSetIFFlag(const char *ifname,
+ int flag ATTRIBUTE_UNUSED,
+ bool val ATTRIBUTE_UNUSED)
{
virReportSystemError(ENOSYS,
_("Cannot set interface flags on '%s'"),
@@ -731,7 +733,8 @@ int virNetDevSetRcvAllMulti(const char *ifname,
#if defined(SIOCGIFFLAGS) && defined(HAVE_STRUCT_IFREQ)
-int virNetDevGetIFFlag(const char *ifname, int flag, bool *val)
+static int
+virNetDevGetIFFlag(const char *ifname, int flag, bool *val)
{
int fd = -1;
int ret = -1;
@@ -755,9 +758,10 @@ int virNetDevGetIFFlag(const char *ifname, int flag, bool *val)
return ret;
}
#else
-int virNetDevGetIFFlag(const char *ifname,
- int flag ATTRIBUTE_UNUSED,
- bool *val ATTRIBUTE_UNUSED)
+static int
+virNetDevGetIFFlag(const char *ifname,
+ int flag ATTRIBUTE_UNUSED,
+ bool *val ATTRIBUTE_UNUSED)
{
virReportSystemError(ENOSYS,
_("Cannot get interface flags on '%s'"),
diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h
index 8d03459..6e8372f 100644
--- a/src/util/virnetdev.h
+++ b/src/util/virnetdev.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007-2014 Red Hat, Inc.
+ * Copyright (C) 2007-2015 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -200,14 +200,6 @@ int virNetDevDelMulti(const char *ifname,
virMacAddrPtr macaddr)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
-int virNetDevSetIFFlag(const char *ifname, int flag, bool val)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
- ATTRIBUTE_RETURN_CHECK;
-
-int virNetDevGetIFFlag(const char *ifname, int flag, bool *val)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
- ATTRIBUTE_RETURN_CHECK;
-
int virNetDevSetPromiscuous(const char *ifname, bool promiscuous)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
int virNetDevGetPromiscuous(const char *ifname, bool *promiscuous)
--
1.9.3
9 years, 10 months