[libvirt] [PATCH 1/2] BSD: implement virNetDevBridgeCreate() and virNetDevBridgeDelete()
John Ferlan
jferlan at redhat.com
Fri Jun 21 17:37:09 UTC 2013
On 06/19/2013 12:47 PM, Roman Bogorodskiy wrote:
> Implementation uses SIOCIFCREATE2 and SIOCIFDESTROY ioctls.
> Also, drop static virNetDevSetupControl() as we have
> public one avialable now.
Dropping the static/local virNetDevSetupControlFull() and
virNetDevSetupControl() seems to have triggered another side effect with
my daily Coverity build which uses "./autogen.sh --system
lv_cv_static_analysis=yes" prior to building.
I'm not sure how else to trigger it or all
The definition of the function is as follows:
int virNetDevSetupControl(const char *ifname,
virIfreq *ifr)
ATTRIBUTE_RETURN_CHECK ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
However, there's two callers in virnetdevbridge.c that call it with
"NULL, NULL":
#if defined(HAVE_STRUCT_IFREQ) && defined(SIOCBRADDBR)
int virNetDevBridgeCreate(const char *brname)
...
if ((fd = virNetDevSetupControl(NULL, NULL)) < 0)
return -1;
...
and
#if defined(HAVE_STRUCT_IFREQ) && defined(SIOCBRDELBR)
int virNetDevBridgeDelete(const char *brname)
...
if ((fd = virNetDevSetupControl(NULL, NULL)) < 0)
return -1;
...
That's because internal.h has:
# ifndef ATTRIBUTE_NONNULL
# if __GNUC_PREREQ (3, 3)
# if STATIC_ANALYSIS
# define ATTRIBUTE_NONNULL(m) __attribute__((__nonnull__(m)))
# else
# define ATTRIBUTE_NONNULL(m) __attribute__(())
# endif
# else
# define ATTRIBUTE_NONNULL(m)
# endif
# endif
John
> ---
> src/util/virnetdevbridge.c | 91 ++++++++++++++++++++++++----------------------
> 1 file changed, 48 insertions(+), 43 deletions(-)
>
> diff --git a/src/util/virnetdevbridge.c b/src/util/virnetdevbridge.c
> index 130829c..df606d2 100644
> --- a/src/util/virnetdevbridge.c
> +++ b/src/util/virnetdevbridge.c
> @@ -23,6 +23,7 @@
> #include <config.h>
>
> #include "virnetdevbridge.h"
> +#include "virnetdev.h"
> #include "virerror.h"
> #include "virutil.h"
> #include "virfile.h"
> @@ -48,49 +49,6 @@
>
>
> #if defined(HAVE_STRUCT_IFREQ) && defined(__linux__)
> -static int virNetDevSetupControlFull(const char *ifname,
> - struct ifreq *ifr,
> - int domain,
> - int type)
> -{
> - int fd;
> -
> - if (ifname && ifr) {
> - memset(ifr, 0, sizeof(*ifr));
> -
> - if (virStrcpyStatic(ifr->ifr_name, ifname) == NULL) {
> - virReportSystemError(ERANGE,
> - _("Network interface name '%s' is too long"),
> - ifname);
> - return -1;
> - }
> - }
> -
> - if ((fd = socket(domain, type, 0)) < 0) {
> - virReportSystemError(errno, "%s",
> - _("Cannot open network interface control socket"));
> - return -1;
> - }
> -
> - if (virSetInherit(fd, false) < 0) {
> - virReportSystemError(errno, "%s",
> - _("Cannot set close-on-exec flag for socket"));
> - VIR_FORCE_CLOSE(fd);
> - return -1;
> - }
> -
> - return fd;
> -}
> -
> -
> -static int virNetDevSetupControl(const char *ifname,
> - struct ifreq *ifr)
> -{
> - return virNetDevSetupControlFull(ifname, ifr, AF_PACKET, SOCK_DGRAM);
> -}
> -#endif
> -
> -#if defined(HAVE_STRUCT_IFREQ) && defined(__linux__)
> # define SYSFS_NET_DIR "/sys/class/net"
> /*
> * Bridge parameters can be set via sysfs on newish kernels,
> @@ -233,6 +191,31 @@ cleanup:
> VIR_FORCE_CLOSE(fd);
> return ret;
> }
> +#elif defined(HAVE_STRUCT_IFREQ) && defined(SIOCIFCREATE2)
> +int virNetDevBridgeCreate(const char *brname)
> +{
> + int s;
> + struct ifreq ifr;
> + int ret = - 1;
> +
> + if ((s = virNetDevSetupControl("bridge", &ifr)) < 0)
> + return -1;
> +
> + if (ioctl(s, SIOCIFCREATE2, &ifr) < 0) {
> + virReportSystemError(errno, "%s",
> + _("Unable to create bridge device"));
> + goto cleanup;
> + }
> +
> + if (virNetDevSetName(ifr.ifr_name, brname) == -1) {
> + goto cleanup;
> + }
> +
> + ret = 0;
> +cleanup:
> + VIR_FORCE_CLOSE(s);
> + return ret;
> +}
> #else
> int virNetDevBridgeCreate(const char *brname)
> {
> @@ -271,6 +254,28 @@ cleanup:
> VIR_FORCE_CLOSE(fd);
> return ret;
> }
> +#elif defined(HAVE_STRUCT_IFREQ) && defined(SIOCIFDESTROY)
> +int virNetDevBridgeDelete(const char *brname)
> +{
> + int s;
> + struct ifreq ifr;
> + int ret = -1;
> +
> + if ((s = virNetDevSetupControl(brname, &ifr)) < 0)
> + return -1;
> +
> + if (ioctl(s, SIOCIFDESTROY, &ifr) < 0) {
> + virReportSystemError(errno,
> + _("Unable to remove bridge %s"),
> + brname);
> + goto cleanup;
> + }
> +
> + ret = 0;
> +cleanup:
> + VIR_FORCE_CLOSE(s);
> + return ret;
> +}
> #else
> int virNetDevBridgeDelete(const char *brname ATTRIBUTE_UNUSED)
> {
>
More information about the libvir-list
mailing list