Skip to content

Commit

Permalink
sockets: move fd_is_socket() into common sockets code
Browse files Browse the repository at this point in the history
The fd_is_socket() helper method is useful in a few places, so put it in
the common sockets code. Make the code more compact while moving it.

Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
  • Loading branch information
berrange committed Mar 13, 2018
1 parent abd983c commit 58dc31f
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 13 deletions.
1 change: 1 addition & 0 deletions include/qemu/sockets.h
Expand Up @@ -12,6 +12,7 @@ int inet_aton(const char *cp, struct in_addr *ia);
#include "qapi/qapi-types-sockets.h"

/* misc helpers */
bool fd_is_socket(int fd);
int qemu_socket(int domain, int type, int protocol);
int qemu_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
int socket_set_cork(int fd, int v);
Expand Down
13 changes: 0 additions & 13 deletions io/channel-util.c
Expand Up @@ -24,19 +24,6 @@
#include "io/channel-socket.h"


static bool fd_is_socket(int fd)
{
int optval;
socklen_t optlen;
optlen = sizeof(optval);
return qemu_getsockopt(fd,
SOL_SOCKET,
SO_TYPE,
(char *)&optval,
&optlen) == 0;
}


QIOChannel *qio_channel_new_fd(int fd,
Error **errp)
{
Expand Down
1 change: 1 addition & 0 deletions tests/.gitignore
Expand Up @@ -86,6 +86,7 @@ test-thread-pool
test-throttle
test-timed-average
test-uuid
test-util-sockets
test-visitor-serialization
test-vmstate
test-write-threshold
Expand Down
3 changes: 3 additions & 0 deletions tests/Makefile.include
Expand Up @@ -146,6 +146,7 @@ ifneq (,$(findstring qemu-ga,$(TOOLS)))
check-unit-$(CONFIG_LINUX) += tests/test-qga$(EXESUF)
endif
check-unit-y += tests/test-timed-average$(EXESUF)
check-unit-y += tests/test-util-sockets$(EXESUF)
check-unit-y += tests/test-io-task$(EXESUF)
check-unit-y += tests/test-io-channel-socket$(EXESUF)
check-unit-y += tests/test-io-channel-file$(EXESUF)
Expand Down Expand Up @@ -713,6 +714,8 @@ tests/test-crypto-tlscredsx509$(EXESUF): tests/test-crypto-tlscredsx509.o \
tests/test-crypto-tlssession.o-cflags := $(TASN1_CFLAGS)
tests/test-crypto-tlssession$(EXESUF): tests/test-crypto-tlssession.o \
tests/crypto-tls-x509-helpers.o tests/pkix_asn1_tab.o $(test-crypto-obj-y)
tests/test-util-sockets$(EXESUF): tests/test-util-sockets.o \
tests/socket-helpers.o $(test-util-obj-y)
tests/test-io-task$(EXESUF): tests/test-io-task.o $(test-io-obj-y)
tests/test-io-channel-socket$(EXESUF): tests/test-io-channel-socket.o \
tests/io-channel-helpers.o tests/socket-helpers.o $(test-io-obj-y)
Expand Down
77 changes: 77 additions & 0 deletions tests/test-util-sockets.c
@@ -0,0 +1,77 @@
/*
* Tests for util/qemu-sockets.c
*
* Copyright 2018 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this library; if not, see <http://www.gnu.org/licenses/>.
*
*/

#include "qemu/osdep.h"
#include "qemu-common.h"
#include "qemu/sockets.h"
#include "qapi/error.h"
#include "socket-helpers.h"

static void test_fd_is_socket_bad(void)
{
char *tmp = g_strdup("qemu-test-util-sockets-XXXXXX");
int fd = mkstemp(tmp);
if (fd != 0) {
unlink(tmp);
}
g_free(tmp);

g_assert(fd >= 0);

g_assert(!fd_is_socket(fd));
close(fd);
}

static void test_fd_is_socket_good(void)
{
int fd = qemu_socket(PF_INET, SOCK_STREAM, 0);

g_assert(fd >= 0);

g_assert(fd_is_socket(fd));
close(fd);
}

int main(int argc, char **argv)
{
bool has_ipv4, has_ipv6;

socket_init();

g_test_init(&argc, &argv, NULL);

/* We're creating actual IPv4/6 sockets, so we should
* check if the host running tests actually supports
* each protocol to avoid breaking tests on machines
* with either IPv4 or IPv6 disabled.
*/
if (socket_check_protocol_support(&has_ipv4, &has_ipv6) < 0) {
return 1;
}

if (has_ipv4) {
g_test_add_func("/util/socket/is-socket/bad",
test_fd_is_socket_bad);
g_test_add_func("/util/socket/is-socket/good",
test_fd_is_socket_good);
}

return g_test_run();
}
8 changes: 8 additions & 0 deletions util/qemu-sockets.c
Expand Up @@ -91,6 +91,14 @@ NetworkAddressFamily inet_netfamily(int family)
return NETWORK_ADDRESS_FAMILY_UNKNOWN;
}

bool fd_is_socket(int fd)
{
int optval;
socklen_t optlen = sizeof(optval);
return !qemu_getsockopt(fd, SOL_SOCKET, SO_TYPE, &optval, &optlen);
}


/*
* Matrix we're trying to apply
*
Expand Down

0 comments on commit 58dc31f

Please sign in to comment.