diff --git a/harbour/ChangeLog b/harbour/ChangeLog index be1b32fc9d..566550651d 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,11 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-07-29 05:19 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/rtl/hbsocket.c + * force blocking IO on socket returned by accept() - on some system + new sockets can inherit blocking IO flag from the listening socket + 2009-07-29 04:24 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/rtl/hbsocket.c ! finished hb_socketResolveAddr() in systems where getaddrinfo() diff --git a/harbour/source/rtl/hbsocket.c b/harbour/source/rtl/hbsocket.c index f86c0368aa..1f3d1eb431 100644 --- a/harbour/source/rtl/hbsocket.c +++ b/harbour/source/rtl/hbsocket.c @@ -724,6 +724,9 @@ static void hb_socketSetOsError( int err ) #if defined( HB_OS_WIN ) switch( err ) { + case 0: + uiErr = 0; + break; case WSAEINTR: uiErr = HB_SOCKET_ERR_INTERRUPT; break; @@ -913,6 +916,9 @@ static void hb_socketSetOsError( int err ) #else switch( err ) { + case 0: + uiErr = 0; + break; #if defined( EPFNOSUPPORT ) case EPFNOSUPPORT: uiErr = HB_SOCKET_ERR_PFNOSUPPORT; @@ -2026,6 +2032,13 @@ HB_SOCKET hb_socketAccept( HB_SOCKET sd, void ** pSockAddr, unsigned * puiLen, H *puiLen = ( unsigned ) len; } } + /* it's not guarantied that socket returned by accept will use + * blocking IO operations. On some systems it inherits blocking IO + * from parent handler so we have to force blocking IO mode + * explicitly.. + */ + if( newsd != HB_NO_SOCKET ) + hb_socketSetBlockingIO( newsd, TRUE ); } else if( ret == 0 ) hb_socketSetRawError( HB_SOCKET_ERR_TIMEOUT );