diff --git a/tests/Makefile.am b/tests/Makefile.am index 5f5a561041..1fe7d6bcd5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1028,8 +1028,8 @@ virportallocatortest_SOURCES = \ virportallocatortest_LDADD = $(LDADDS) libvirportallocatormock_la_SOURCES = \ - virportallocatortest.c -libvirportallocatormock_la_CFLAGS = $(AM_CFLAGS) -DMOCK_HELPER=1 + virportallocatormock.c +libvirportallocatormock_la_CFLAGS = $(AM_CFLAGS) libvirportallocatormock_la_LDFLAGS = $(MOCKLIBS_LDFLAGS) libvirportallocatormock_la_LIBADD = $(MOCKLIBS_LIBS) diff --git a/tests/virportallocatormock.c b/tests/virportallocatormock.c new file mode 100644 index 0000000000..e44191ef7e --- /dev/null +++ b/tests/virportallocatormock.c @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2013-2014 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 + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + * + * Author: Daniel P. Berrange + */ + +#include +#include + +#if HAVE_DLFCN_H +# include +#endif + +#if defined(RTLD_NEXT) +# include "internal.h" +# include +# include +# include +# include +# include +# include + +static bool host_has_ipv6; +static int (*realsocket)(int domain, int type, int protocol); + +static void init_syms(void) +{ + int fd; + + if (realsocket) + return; + + realsocket = dlsym(RTLD_NEXT, "socket"); + + if (!realsocket) { + fprintf(stderr, "Unable to find 'socket' symbol\n"); + abort(); + } + + fd = realsocket(AF_INET6, SOCK_STREAM, 0); + if (fd < 0) + return; + + host_has_ipv6 = true; + close(fd); +} + +int socket(int domain, + int type, + int protocol) +{ + init_syms(); + + if (getenv("LIBVIRT_TEST_IPV4ONLY") && domain == AF_INET6) { + errno = EAFNOSUPPORT; + return -1; + } + + return realsocket(domain, type, protocol); +} + +int bind(int sockfd ATTRIBUTE_UNUSED, + const struct sockaddr *addr, + socklen_t addrlen ATTRIBUTE_UNUSED) +{ + struct sockaddr_in saddr; + + memcpy(&saddr, addr, sizeof(saddr)); + + if (host_has_ipv6 && !getenv("LIBVIRT_TEST_IPV4ONLY")) { + if (saddr.sin_port == htons(5900) || + (saddr.sin_family == AF_INET && + saddr.sin_port == htons(5904)) || + (saddr.sin_family == AF_INET6 && + (saddr.sin_port == htons(5905) || + saddr.sin_port == htons(5906)))) { + errno = EADDRINUSE; + return -1; + } + return 0; + } + + if (saddr.sin_port == htons(5900) || + saddr.sin_port == htons(5904) || + saddr.sin_port == htons(5905) || + saddr.sin_port == htons(5906)) { + errno = EADDRINUSE; + return -1; + } + + return 0; +} + +#endif /* ! defined(RTLD_NEXT) */ diff --git a/tests/virportallocatortest.c b/tests/virportallocatortest.c index 077aad8542..26de22f8cf 100644 --- a/tests/virportallocatortest.c +++ b/tests/virportallocatortest.c @@ -28,95 +28,14 @@ #endif #if defined(RTLD_NEXT) -# ifdef MOCK_HELPER -# include "internal.h" -# include -# include -# include -# include -# include +# include "virutil.h" +# include "virerror.h" +# include "viralloc.h" +# include "virlog.h" +# include "virportallocator.h" +# include "virstring.h" -static bool host_has_ipv6; -static int (*realsocket)(int domain, int type, int protocol); - -static void init_syms(void) -{ - int fd; - - if (realsocket) - return; - - realsocket = dlsym(RTLD_NEXT, "socket"); - - if (!realsocket) { - fprintf(stderr, "Unable to find 'socket' symbol\n"); - abort(); - } - - fd = realsocket(AF_INET6, SOCK_STREAM, 0); - if (fd < 0) - return; - - host_has_ipv6 = true; - close(fd); -} - -int socket(int domain, - int type, - int protocol) -{ - init_syms(); - - if (getenv("LIBVIRT_TEST_IPV4ONLY") && domain == AF_INET6) { - errno = EAFNOSUPPORT; - return -1; - } - - return realsocket(domain, type, protocol); -} - -int bind(int sockfd ATTRIBUTE_UNUSED, - const struct sockaddr *addr, - socklen_t addrlen ATTRIBUTE_UNUSED) -{ - struct sockaddr_in saddr; - - memcpy(&saddr, addr, sizeof(saddr)); - - if (host_has_ipv6 && !getenv("LIBVIRT_TEST_IPV4ONLY")) { - if (saddr.sin_port == htons(5900) || - (saddr.sin_family == AF_INET && - saddr.sin_port == htons(5904)) || - (saddr.sin_family == AF_INET6 && - (saddr.sin_port == htons(5905) || - saddr.sin_port == htons(5906)))) { - errno = EADDRINUSE; - return -1; - } - return 0; - } - - if (saddr.sin_port == htons(5900) || - saddr.sin_port == htons(5904) || - saddr.sin_port == htons(5905) || - saddr.sin_port == htons(5906)) { - errno = EADDRINUSE; - return -1; - } - - return 0; -} - -# else - -# include "virutil.h" -# include "virerror.h" -# include "viralloc.h" -# include "virlog.h" -# include "virportallocator.h" -# include "virstring.h" - -# define VIR_FROM_THIS VIR_FROM_RPC +# define VIR_FROM_THIS VIR_FROM_RPC VIR_LOG_INIT("tests.portallocatortest"); @@ -255,8 +174,6 @@ mymain(void) } VIRT_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/libvirportallocatormock.so") -# endif - #else /* ! defined(RTLD_NEXT) */ int main(void)