diff options
author | Gunter Knauf <gk@gknw.de> | 2007-07-12 01:07:49 +0000 |
---|---|---|
committer | Gunter Knauf <gk@gknw.de> | 2007-07-12 01:07:49 +0000 |
commit | 0878b14f79ffc967c1bde19bbda1d6363d05172d (patch) | |
tree | cd67e8df39f016c5dce11f9fcb4648057156efd9 | |
parent | 7d56f353884bb46ddd4e1dd31bbd693142ccc44c (diff) |
added time loop to sockfilt.c in order to wait for SO_REUSEADDR;
added go_sleep() to util.c.
-rw-r--r-- | tests/server/sockfilt.c | 15 | ||||
-rw-r--r-- | tests/server/util.c | 32 | ||||
-rw-r--r-- | tests/server/util.h | 2 |
3 files changed, 45 insertions, 4 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; - - if (setsockopt - (sock, SOL_SOCKET, SO_REUSEADDR, (void *)&flag, - sizeof(flag)) < 0) { + int maxretr = 100; + + 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 <netdb.h> #endif +#ifdef HAVE_SYS_POLL_H +#include <sys/poll.h> +#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 */ |