diff mbox

slirp: Port redirection option behave differently on Linux and Windows

Message ID 1376424027-26208-1-git-send-email-tmirza@codesourcery.com
State New
Headers show

Commit Message

Mirza, Taimoor Aug. 13, 2013, 8 p.m. UTC
From: Taimoor Mirza <tmirza@codesourcery.com>

port redirection code uses SO_REUSEADDR socket option before binding to
host port. Behavior of SO_REUSEADDR is different on Windows and Linux.
Relaunching QEMU with same host and guest port redirection values on Linux
throws error but on Windows it does not throw any error.
Problem is discussed in http://lists.gnu.org/archive/html/qemu-devel/2013-04/msg03089.html

Signed-off-by: Taimoor Mirza <tmirza@codesourcery.com>
---
 slirp/socket.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

Comments

Stefan Weil Aug. 13, 2013, 8:21 p.m. UTC | #1
Am 13.08.2013 22:00, schrieb Taimoor:
> From: Taimoor Mirza <tmirza@codesourcery.com>
>
> port redirection code uses SO_REUSEADDR socket option before binding to
> host port. Behavior of SO_REUSEADDR is different on Windows and Linux.
> Relaunching QEMU with same host and guest port redirection values on Linux
> throws error but on Windows it does not throw any error.
> Problem is discussed in http://lists.gnu.org/archive/html/qemu-devel/2013-04/msg03089.html
>
> Signed-off-by: Taimoor Mirza <tmirza@codesourcery.com>
> ---
>  slirp/socket.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/slirp/socket.c b/slirp/socket.c
> index 8e8819c..23780b3 100644
> --- a/slirp/socket.c
> +++ b/slirp/socket.c
> @@ -627,7 +627,9 @@ tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr,
>  	addr.sin_port = hport;
>  
>  	if (((s = qemu_socket(AF_INET,SOCK_STREAM,0)) < 0) ||
> +#ifdef _WIN32

Shouldn't this be replaced by #ifndef _WIN32?

>  	    (qemu_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)) < 0) ||
> +#endif
>  	    (bind(s,(struct sockaddr *)&addr, sizeof(addr)) < 0) ||
>  	    (listen(s,1) < 0)) {
>  		int tmperrno = errno; /* Don't clobber the real reason we failed */
Mirza, Taimoor Aug. 13, 2013, 9:02 p.m. UTC | #2
Thanks for reviewing the patch

On Wed, Aug 14, 2013 at 1:21 AM, Stefan Weil <sw@weilnetz.de> wrote:
> Am 13.08.2013 22:00, schrieb Taimoor:
>> From: Taimoor Mirza <tmirza@codesourcery.com>
>>
>> port redirection code uses SO_REUSEADDR socket option before binding to
>> host port. Behavior of SO_REUSEADDR is different on Windows and Linux.
>> Relaunching QEMU with same host and guest port redirection values on Linux
>> throws error but on Windows it does not throw any error.
>> Problem is discussed in http://lists.gnu.org/archive/html/qemu-devel/2013-04/msg03089.html
>>
>> Signed-off-by: Taimoor Mirza <tmirza@codesourcery.com>
>> ---
>>  slirp/socket.c |    2 ++
>>  1 files changed, 2 insertions(+), 0 deletions(-)
>>
>> diff --git a/slirp/socket.c b/slirp/socket.c
>> index 8e8819c..23780b3 100644
>> --- a/slirp/socket.c
>> +++ b/slirp/socket.c
>> @@ -627,7 +627,9 @@ tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr,
>>       addr.sin_port = hport;
>>
>>       if (((s = qemu_socket(AF_INET,SOCK_STREAM,0)) < 0) ||
>> +#ifdef _WIN32
>
> Shouldn't this be replaced by #ifndef _WIN32?
Yes it should be. I am resending the patch
>
>>           (qemu_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)) < 0) ||
>> +#endif
>>           (bind(s,(struct sockaddr *)&addr, sizeof(addr)) < 0) ||
>>           (listen(s,1) < 0)) {
>>               int tmperrno = errno; /* Don't clobber the real reason we failed */
>

-Taimoor
diff mbox

Patch

diff --git a/slirp/socket.c b/slirp/socket.c
index 8e8819c..23780b3 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -627,7 +627,9 @@  tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr,
 	addr.sin_port = hport;
 
 	if (((s = qemu_socket(AF_INET,SOCK_STREAM,0)) < 0) ||
+#ifdef _WIN32
 	    (qemu_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)) < 0) ||
+#endif
 	    (bind(s,(struct sockaddr *)&addr, sizeof(addr)) < 0) ||
 	    (listen(s,1) < 0)) {
 		int tmperrno = errno; /* Don't clobber the real reason we failed */