From 3f0d2ee95b65c7af0f7b5b72899c54ae99ccd1d4 Mon Sep 17 00:00:00 2001 From: Roman Bogorodskiy Date: Sun, 11 Aug 2013 17:54:48 +0400 Subject: [PATCH] BSD: implement virNetDev(Set|Clear)IPv4Address Provide an implementation of virNetDev(Set|Clear)IPv4Address based on BSD ifconfig tool in addition to 'ip' from Linux iproute2 package. --- configure.ac | 15 +++++++++++++++ src/util/virnetdev.c | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/configure.ac b/configure.ac index ac8cfa179e..afa9cd39ea 100644 --- a/configure.ac +++ b/configure.ac @@ -386,6 +386,10 @@ if test "$prefix" = "/usr" && test "$sysconfdir" = '${prefix}/etc' ; then sysconfdir='/etc' fi +dnl Specify if we rely on ifconfig instead of iproute2 (e.g. in case +dnl we're working on BSD) +want_ifconfig=no + dnl Make some notes about which OS we're compiling for, as the lxc and qemu dnl drivers require linux headers, and storage_mpath, dtrace, and nwfilter dnl are also linux specific. The "network" and storage_fs drivers are known @@ -408,6 +412,8 @@ if test $with_linux = no; then fi if test $with_freebsd = yes; then + want_ifconfig=yes + with_firewalld=no fi @@ -2472,6 +2478,15 @@ AC_CHECK_DECLS([BRDGSFD, BRDGADD, BRDGDEL], #include ]) +# Check if we need to look for ifconfig +if test "$want_ifconfig" = "yes"; then + AC_PATH_PROG([IFCONFIG_PATH], [ifconfig]) + if test -z "$IFCONFIG_PATH"; then + AC_MSG_ERROR([Failed to find ifconfig.]) + fi + AC_DEFINE_UNQUOTED([IFCONFIG_PATH], "$IFCONFIG_PATH", [path to ifconfig binary]) +fi + # Detect when running under the clang static analyzer's scan-build driver # or Coverity-prevent's cov-build. Define STATIC_ANALYSIS accordingly. AC_CACHE_CHECK([whether this build is done by a static analysis tool], diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index 30df7a655c..8eb4d4cb03 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -810,12 +810,25 @@ int virNetDevSetIPv4Address(const char *ifname, !(bcaststr = virSocketAddrFormat(&broadcast)))) { goto cleanup; } +#ifdef IFCONFIG_PATH + cmd = virCommandNew(IFCONFIG_PATH); + virCommandAddArg(cmd, ifname); + if (VIR_SOCKET_ADDR_IS_FAMILY(addr, AF_INET6)) + virCommandAddArg(cmd, "inet6"); + else + virCommandAddArg(cmd, "inet"); + virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix); + if (bcaststr) + virCommandAddArgList(cmd, "broadcast", bcaststr, NULL); + virCommandAddArg(cmd, "alias"); +#else cmd = virCommandNew(IP_PATH); virCommandAddArgList(cmd, "addr", "add", NULL); virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix); if (bcaststr) virCommandAddArgList(cmd, "broadcast", bcaststr, NULL); virCommandAddArgList(cmd, "dev", ifname, NULL); +#endif if (virCommandRun(cmd, NULL) < 0) goto cleanup; @@ -895,10 +908,21 @@ int virNetDevClearIPv4Address(const char *ifname, if (!(addrstr = virSocketAddrFormat(addr))) goto cleanup; +#ifdef IFCONFIG_PATH + cmd = virCommandNew(IFCONFIG_PATH); + virCommandAddArg(cmd, ifname); + if (VIR_SOCKET_ADDR_IS_FAMILY(addr, AF_INET6)) + virCommandAddArg(cmd, "inet6"); + else + virCommandAddArg(cmd, "inet"); + virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix); + virCommandAddArg(cmd, "-alias"); +#else cmd = virCommandNew(IP_PATH); virCommandAddArgList(cmd, "addr", "del", NULL); virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix); virCommandAddArgList(cmd, "dev", ifname, NULL); +#endif if (virCommandRun(cmd, NULL) < 0) goto cleanup;