summaryrefslogtreecommitdiff
path: root/qemu_socket.h
diff options
context:
space:
mode:
authorOrit Wasserman <owasserm@redhat.com>2012-09-24 13:11:09 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2012-09-25 19:05:56 -0500
commit233aa5c2d1cf4655ffe335025a68cf5454f87dad (patch)
tree8a772e4cd7a5a48d7f4abc49eef1e08e7622e11e /qemu_socket.h
parent5db5f44cb4b7f24b9e0efdefc9015e36b7c34881 (diff)
downloadqemu-233aa5c2d1cf4655ffe335025a68cf5454f87dad.tar.gz
Fix address handling in inet_nonblocking_connect
getaddrinfo can give us a list of addresses, but we only try to connect to the first one. If that fails we never proceed to the next one. This is common on desktop setups that often have ipv6 configured but not actually working. To fix this make inet_connect_nonblocking retry connection with a different address. callers on inet_nonblocking_connect register a callback function that will be called when connect opertion completes, in case of failure the fd will have a negative value Signed-off-by: Orit Wasserman <owasserm@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'qemu_socket.h')
-rw-r--r--qemu_socket.h16
1 files changed, 11 insertions, 5 deletions
diff --git a/qemu_socket.h b/qemu_socket.h
index 80696aa6d8..3e8aee9cad 100644
--- a/qemu_socket.h
+++ b/qemu_socket.h
@@ -38,15 +38,21 @@ void socket_set_block(int fd);
void socket_set_nonblock(int fd);
int send_all(int fd, const void *buf, int len1);
-/* New, ipv6-ready socket helper functions, see qemu-sockets.c */
+/* callback function for nonblocking connect
+ * valid fd on success, negative error code on failure
+ */
+typedef void NonBlockingConnectHandler(int fd, void *opaque);
+
int inet_listen_opts(QemuOpts *opts, int port_offset, Error **errp);
int inet_listen(const char *str, char *ostr, int olen,
int socktype, int port_offset, Error **errp);
-int inet_connect_opts(QemuOpts *opts, bool block, bool *in_progress,
- Error **errp);
+int inet_connect_opts(QemuOpts *opts, Error **errp,
+ NonBlockingConnectHandler *callback, void *opaque);
int inet_connect(const char *str, Error **errp);
-int inet_nonblocking_connect(const char *str, bool *in_progress,
- Error **errp);
+int inet_nonblocking_connect(const char *str,
+ NonBlockingConnectHandler *callback,
+ void *opaque, Error **errp);
+
int inet_dgram_opts(QemuOpts *opts);
const char *inet_strfamily(int family);