From 0878b14f79ffc967c1bde19bbda1d6363d05172d Mon Sep 17 00:00:00 2001 From: Gunter Knauf Date: Thu, 12 Jul 2007 01:07:49 +0000 Subject: [PATCH] added time loop to sockfilt.c in order to wait for SO_REUSEADDR; added go_sleep() to util.c. --- tests/server/sockfilt.c | 13 ++++++++++--- tests/server/util.c | 32 ++++++++++++++++++++++++++++++++ tests/server/util.h | 2 ++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c index ab6682ec5..e8d701393 100644 --- a/tests/server/sockfilt.c +++ b/tests/server/sockfilt.c @@ -399,10 +399,17 @@ static curl_socket_t sockdaemon(curl_socket_t sock, #endif /* ENABLE_IPV6 */ int flag = 1; int rc; + int maxretr = 100; - if (setsockopt - (sock, SOL_SOCKET, SO_REUSEADDR, (void *)&flag, - sizeof(flag)) < 0) { + rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, + (void *)&flag, sizeof(flag)); + while ((rc < 0) && maxretr) { + maxretr--; + go_sleep(10); + rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, + (void *)&flag, sizeof(flag)); + } + if (rc < 0) { perror("setsockopt(SO_REUSEADDR)"); } diff --git a/tests/server/util.c b/tests/server/util.c index 080ef4759..8017081fa 100644 --- a/tests/server/util.c +++ b/tests/server/util.c @@ -45,6 +45,9 @@ #ifdef HAVE_NETDB_H #include #endif +#ifdef HAVE_SYS_POLL_H +#include +#endif #define ENABLE_CURLX_PRINTF /* make the curlx header define all printf() functions to use the curlx_* @@ -159,3 +162,32 @@ char *test2file(long testno) snprintf(filename, sizeof(filename), TEST_DATA_PATH, path, testno); return filename; } + +void go_sleep(long ms) +{ +#ifdef HAVE_POLL_FINE + /* portable subsecond "sleep" */ + poll((void *)0, 0, (int)ms); +#else + /* systems without poll() need other solutions */ + +#ifdef WIN32 + /* Windows offers a millisecond sleep */ + Sleep(ms); +#elif defined(MSDOS) + delay(ms); +#else + /* Other systems must use select() for this */ + struct timeval timeout; + + timeout.tv_sec = ms/1000; + ms = ms%1000; + timeout.tv_usec = ms * 1000; + + select(0, NULL, NULL, NULL, &timeout); +#endif + +#endif +} + + diff --git a/tests/server/util.h b/tests/server/util.h index 69f2cfc3d..c1eccfadb 100644 --- a/tests/server/util.h +++ b/tests/server/util.h @@ -49,4 +49,6 @@ void win32_cleanup(void); /* returns the path name to the test case file */ char *test2file(long testno); +void go_sleep(long ms); + #endif /* __SERVER_UTIL_H */