diff options
author | Sebastian Ottlik <ottlik@fzi.de> | 2013-10-02 12:23:15 +0200 |
---|---|---|
committer | Stefan Weil <sw@weilnetz.de> | 2013-10-02 19:20:31 +0200 |
commit | 52e0850bfa0e713928e5eb7f8a785eb473837b49 (patch) | |
tree | 3518810addbcec657267b9757f2245bba3856797 | |
parent | fe46980c85354e35ccd342b971855d5a028fe181 (diff) | |
download | slirp-52e0850bfa0e713928e5eb7f8a785eb473837b49.zip slirp-52e0850bfa0e713928e5eb7f8a785eb473837b49.tar.gz slirp-52e0850bfa0e713928e5eb7f8a785eb473837b49.tar.bz2 |
slirp: call socket_set_fast_reuse instead of setting SO_REUSEADDR
SO_REUSEADDR should be avoided on Windows but is desired on other operating
systems. So instead of setting it we call socket_set_fast_reuse that will result
in the appropriate behaviour on all operating systems.
Signed-off-by: Sebastian Ottlik <ottlik@fzi.de>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Stefan Weil <sw@weilnetz.de>
-rw-r--r-- | misc.c | 3 | ||||
-rw-r--r-- | socket.c | 4 | ||||
-rw-r--r-- | tcp_subr.c | 6 | ||||
-rw-r--r-- | udp.c | 4 |
4 files changed, 6 insertions, 11 deletions
@@ -207,8 +207,7 @@ int fork_exec(struct socket *so, const char *ex, int do_pty) so->s = accept(s, (struct sockaddr *)&addr, &addrlen); } while (so->s < 0 && errno == EINTR); closesocket(s); - opt = 1; - qemu_setsockopt(so->s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); + socket_set_fast_reuse(so->s); opt = 1; qemu_setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); qemu_set_nonblock(so->s); @@ -633,9 +633,7 @@ struct socket *tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, addr.sin_port = hport; if (((s = qemu_socket(AF_INET, SOCK_STREAM, 0)) < 0) || -#ifndef _WIN32 - (qemu_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)) < 0) || -#endif + (socket_set_fast_reuse(s) < 0) || (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) || (listen(s, 1) < 0)) { int tmperrno = errno; /* Don't clobber the real reason we failed */ @@ -335,8 +335,7 @@ int tcp_fconnect(struct socket *so) struct sockaddr_in addr; qemu_set_nonblock(s); - opt = 1; - qemu_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + socket_set_fast_reuse(s); opt = 1; qemu_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt)); @@ -425,8 +424,7 @@ void tcp_connect(struct socket *inso) return; } qemu_set_nonblock(s); - opt = 1; - qemu_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); + socket_set_fast_reuse(s); opt = 1; qemu_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int)); socket_set_nodelay(s); @@ -344,7 +344,7 @@ struct socket *udp_listen(Slirp *slirp, uint32_t haddr, u_int hport, { struct sockaddr_in addr; struct socket *so; - socklen_t addrlen = sizeof(struct sockaddr_in), opt = 1; + socklen_t addrlen = sizeof(struct sockaddr_in); so = socreate(slirp); if (!so) { @@ -362,7 +362,7 @@ struct socket *udp_listen(Slirp *slirp, uint32_t haddr, u_int hport, udp_detach(so); return NULL; } - qemu_setsockopt(so->s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); + socket_set_fast_reuse(so->s); getsockname(so->s, (struct sockaddr *)&addr, &addrlen); so->so_fport = addr.sin_port; |