
On Tue, Oct 01, 2013 at 11:01:36AM +0200, Ján Tomko wrote:
Split out the part of qemuMigrationPrepareAny that decides whether to listen on [::] or 0.0.0.0 by checking whether IPv6 is enabled on the host. --- src/libvirt_private.syms | 1 + src/qemu/qemu_migration.c | 8 +------- src/util/virutil.c | 14 ++++++++++++++ src/util/virutil.h | 1 + 4 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4bc4d69..157d68c 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2065,6 +2065,7 @@ virGetUserID; virGetUserName; virGetUserRuntimeDirectory; virHexToBin; +virHostHasIPv6; virIndexToDiskName; virIsCapableFCHost; virIsCapableVport; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3a1aab7..c21063d 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -22,8 +22,6 @@
#include <config.h>
-#include <netdb.h> -#include <sys/socket.h> #include <sys/time.h> #ifdef WITH_GNUTLS # include <gnutls/gnutls.h> @@ -2261,9 +2259,6 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, goto cleanup; } else { virQEMUCapsPtr qemuCaps = NULL; - struct addrinfo *info = NULL; - struct addrinfo hints = { .ai_flags = AI_ADDRCONFIG, - .ai_socktype = SOCK_STREAM };
if (!(qemuCaps = virQEMUCapsCacheLookupCopy(driver->qemuCapsCache, (*def)->emulator))) @@ -2273,8 +2268,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, * and there is at least one IPv6 address configured */ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_IPV6_MIGRATION) && - getaddrinfo("::", NULL, &hints, &info) == 0) { - freeaddrinfo(info); + virHostHasIPv6()) { listenAddr = "[::]"; } else { listenAddr = "0.0.0.0"; diff --git a/src/util/virutil.c b/src/util/virutil.c index d9e0bc4..2fcd8a5 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -648,6 +648,20 @@ cleanup: }
+bool +virHostHasIPv6() +{ + bool ret; + struct addrinfo *info = NULL; + struct addrinfo hints = { .ai_flags = AI_ADDRCONFIG, + .ai_socktype = SOCK_STREAM }; + + ret = getaddrinfo("::", NULL, &hints, &info) == 0; + freeaddrinfo(info); + return ret; +}
This really doesn't belong in virutil.c. I'd prefer to see this in virnetdev.{c,h} and named virNetDevCheckIPProtocols(bool *hasIPv4, bool *hasIPv6) and it should use 'getifaddrs' - 'getaddrinfo' isn't a reliable way to determine if IPv6 is present. There is code in tests/virnetsockettest.c you can move for this purpose. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|