[libvirt] [PATCH 03/10] Introduce a generic object for using network sockets

Eric Blake eblake at redhat.com
Thu Jun 23 22:57:17 UTC 2011


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 at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110623/327c28e8/attachment-0001.sig>


More information about the libvir-list mailing list