Fix winsock conformance test on Windows NT
Martin Wilck
Martin.Wilck at Fujitsu-Siemens.com
Tue Dec 3 12:17:55 CST 2002
With the following fixes, the winsock test runs fine (0 errors) on Win
NT (and Wine!).
Modified files: dlls/winsock/tests: sock.c
Index: dlls/winsock/tests/sock.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/tests/sock.c,v
retrieving revision 1.5
diff -u -r1.5 sock.c
--- dlls/winsock/tests/sock.c 17 Sep 2002 00:05:34 -0000 1.5
+++ dlls/winsock/tests/sock.c 3 Dec 2002 18:10:58 -0000
@@ -18,13 +18,18 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#ifdef _WIN32
+#include <winsock2.h>
+#include <mswsock.h>
+#include "wine/test.h"
+#else
#include "wine/test.h"
#include <winbase.h>
#include <winnt.h>
#include <winerror.h>
-#undef USE_WS_PREFIX
#include <winsock2.h>
#include <mswsock.h>
+#endif
#define MAX_CLIENTS 4 /* Max number of clients */
#define NUM_TESTS 2 /* Number of tests performed */
@@ -503,30 +508,32 @@
WSAEventSelect ( mem->s, event, mask );
}
}
- else if ( wsa_events.lNetworkEvents & FD_READ )
+ if ( wsa_events.lNetworkEvents & FD_READ )
{
err = wsa_events.iErrorCode[ FD_READ_BIT ];
ok ( err == 0, "event_client (%x): FD_READ error code: %d\n", id, err );
-
+ if ( err != 0 ) break;
+
+ /* First read must succeed */
n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 );
wsa_ok ( n, 0 <=, "event_client (%lx): recv error: %d\n" );
- if ( err != 0 || n < 0 )
- break;
- else if ( n == 0 )
- {
- ok ( 0, "event_client (%x): empty receive", id );
- break;
- }
- recv_p += n;
- if ( recv_p == recv_last )
- {
- trace ( "event_client (%x): all data received\n", id );
- mask &= ~FD_READ;
- WSAEventSelect ( mem->s, event, mask );
+ while ( n >= 0 ) {
+ recv_p += n;
+ if ( recv_p == recv_last )
+ {
+ mask &= ~FD_READ;
+ trace ( "event_client (%x): all data received\n", id );
+ WSAEventSelect ( mem->s, event, mask );
+ break;
+ }
+ n = recv ( mem->s, recv_p, min ( recv_last - recv_p, par->buflen ), 0 );
+ if ( n < 0 && ( err = WSAGetLastError()) != WSAEWOULDBLOCK )
+ ok ( 0, "event_client (%x): read error: %d\n", id, err );
+
}
- }
- else if ( wsa_events.lNetworkEvents & FD_CLOSE )
+ }
+ if ( wsa_events.lNetworkEvents & FD_CLOSE )
{
trace ( "event_client (%x): close event\n", id );
err = wsa_events.iErrorCode[ FD_CLOSE_BIT ];
@@ -592,8 +599,8 @@
static void do_test( test_setup *test )
{
- int i, n = min (test->general.n_clients, MAX_CLIENTS);
- int wait;
+ DWORD i, n = min (test->general.n_clients, MAX_CLIENTS);
+ DWORD wait;
server_ready = CreateEventA ( NULL, TRUE, FALSE, NULL );
for (i = 0; i <= n; i++)
@@ -604,9 +611,10 @@
WaitForSingleObject ( server_ready, INFINITE );
wait = WaitForMultipleObjects ( 1 + n, thread, TRUE, 1000 * TEST_TIMEOUT );
- ok ( wait == WAIT_OBJECT_0, "some threads have not completed\n" );
+ ok ( wait >= WAIT_OBJECT_0 && wait <= WAIT_OBJECT_0 + n ,
+ "some threads have not completed: %lx\n", wait );
- if ( wait == WAIT_TIMEOUT )
+ if ( ! ( wait >= WAIT_OBJECT_0 && wait <= WAIT_OBJECT_0 + n ) )
{
for (i = 0; i <= n; i++)
{
More information about the wine-patches
mailing list