On 06/22/2011 09:33 AM, Daniel P. Berrange wrote:
Introduces a simple wrapper around the raw POSIX sockets APIs
and name resolution APIs. Allows for easy creation of client
and server sockets with correct usage of name resolution APIs
for protocol agnostic socket setup.
It can listen for UNIX and TCP stream sockets.
It can connect to UNIX, TCP streams directly, or indirectly
to UNIX sockets via an SSH tunnel or external command
* src/Makefile.am: Add to libvirt-net-rpc.la
* src/rpc/virnetsocket.c, src/rpc/virnetsocket.h: Generic
sockets APIs
* tests/Makefile.am: Add socket test
* tests/virnetsockettest.c: New test case
* tests/testutils.c: Avoid overriding LIBVIRT_DEBUG settings
* tests/ssh.c: Dumb helper program for SSH tunnelling tests
Again, problems with 'make check', first linking failures, then test
failures.
+#ifdef IPV6_V6ONLY
+ if (runp->ai_family == PF_INET6) {
+ int on = 1;
+ /*
+ * Normally on Linux an INET6 socket will bind to the INET4
+ * address too. If getaddrinfo returns results with INET4
+ * first though, this will result in INET6 binding failing.
+ * We can trivially cope with multiple server sockets, so
+ * we force it to only listen on IPv6
+ */
+ if (setsockopt(fd, IPPROTO_IPV6,IPV6_V6ONLY,
Formatting nit.
+ if (virCommandRunAsync(cmd, &pid) < 0)
+ goto error;
+
+ /* Parent continues here. */
+ VIR_FORCE_CLOSE(sv[1]);
+ VIR_FORCE_CLOSE(errfd[1]);
+
+ if (!(*retsock = virNetSocketNew(NULL, NULL, true, sv[0], errfd[0], pid)))
+ goto error;
+
+ virCommandFree(cmd);
+
+ return 0;
+
+error:
+ VIR_FORCE_CLOSE(sv[0]);
+ VIR_FORCE_CLOSE(sv[1]);
+ VIR_FORCE_CLOSE(errfd[0]);
+ VIR_FORCE_CLOSE(errfd[1]);
+
+ if (pid > 0) {
+ kill(pid, SIGTERM);
+ if (virCommandWait(cmd, NULL) < 0) {
+ kill(pid, SIGKILL);
+ if (virCommandWait(cmd, NULL) < 0) {
+ VIR_WARN("Unable to wait for command %d", pid);
+ }
+ }
+ }
This can be simplified.
Here's what I applied to get compilation to complete, but I'm still
seeing test failures (is this test too sensitive to firewalls, or
running as non-root)?
diff --git i/src/rpc/virnetsocket.c w/src/rpc/virnetsocket.c
index eedced0..5e9066f 100644
--- i/src/rpc/virnetsocket.c
+++ w/src/rpc/virnetsocket.c
@@ -206,7 +206,7 @@ int virNetSocketNewListenTCP(const char *nodename,
* We can trivially cope with multiple server sockets, so
* we force it to only listen on IPv6
*/
- if (setsockopt(fd, IPPROTO_IPV6,IPV6_V6ONLY,
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
(void*)&on, sizeof on) < 0) {
virReportSystemError(errno, "%s",
_("Unable to force bind to IPv6
only"));
@@ -542,16 +542,7 @@ error:
VIR_FORCE_CLOSE(errfd[0]);
VIR_FORCE_CLOSE(errfd[1]);
- if (pid > 0) {
- kill(pid, SIGTERM);
- if (virCommandWait(cmd, NULL) < 0) {
- kill(pid, SIGKILL);
- if (virCommandWait(cmd, NULL) < 0) {
- VIR_WARN("Unable to wait for command %d", pid);
- }
- }
- }
-
+ virCommandAbort(cmd);
virCommandFree(cmd);
return -1;
diff --git i/tests/Makefile.am w/tests/Makefile.am
index f3e2c77..5ed9d0a 100644
--- i/tests/Makefile.am
+++ w/tests/Makefile.am
@@ -414,7 +414,7 @@ virnetmessagetest_LDADD = ../src/libvirt-net-rpc.la
$(LDADDS)
virnetsockettest_SOURCES = \
virnetsockettest.c testutils.h testutils.c
virnetsockettest_CFLAGS = -Dabs_builddir="\"$(abs_builddir)\""
-virnetsockettest_LDADD = $(LDADDS)
+virnetsockettest_LDADD = ../src/libvirt-net-rpc.la $(LDADDS)
seclabeltest_SOURCES = \
Any ideas on how best to go about debugging these test failures?
TEST: virnetsockettest
1) Socket TCP/IPv4 Accept
... FAILED
2) Socket TCP/IPv6 Accept
... FAILED
3) Socket TCP/IPv4+IPv6 Accept
... FAILED
4) Socket TCP/IPv4+IPv6 Accept
... FAILED
5) Socket UNIX Accept ... OK
6) Socket UNIX Addrs ... OK
7) Socket External Command /dev/zero ... OK
8) Socket External Command /dev/does-not-exist
... FAILED
9) SSH test 1 ...
Expect [somehost nc -U /tmp/socket
]
Actual []
... FAILED
10) SSH test 2 ...
Expect [-p 9000 -l fred -T -o BatchMode=yes -e none somehost netcat -U
/tmp/socket
]
Actual []
... FAILED
11) SSH test 3
... FAILED
12) SSH test 4 ...
Expect [crashyhost nc -U /tmp/socket
]
Actual []
... FAILED
FAIL: virnetsockettest
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org