From b4fae9d73fece4e9ec7e347f69b84be4da49e94c Mon Sep 17 00:00:00 2001 From: Marc Hoersken Date: Sat, 6 Apr 2013 19:00:42 +0200 Subject: [PATCH] tftpd.c: Apply sread timeout to the whole data transfer session --- tests/server/tftpd.c | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c index bfb7d58e2..10f88a1e0 100644 --- a/tests/server/tftpd.c +++ b/tests/server/tftpd.c @@ -875,7 +875,7 @@ int main(int argc, char **argv) result = 2; break; } - if (connect(peer, &from.sa, sizeof(from.sa6)) < 0) { + if(connect(peer, &from.sa, sizeof(from.sa6)) < 0) { logmsg("connect: fail"); result = 1; break; @@ -964,6 +964,9 @@ static int do_tftp(struct testcase *test, struct tftphdr *tp, ssize_t size) char *filename, *mode = NULL; int error; FILE *server; +#ifdef USE_WINSOCK + DWORD recvtimeout, recvtimeoutbak; +#endif /* Open request dump file. */ server = fopen(REQUEST_DUMP, "ab"); @@ -1018,11 +1021,27 @@ again: nak(ecode); return 1; } + +#ifdef USE_WINSOCK + recvtimeout = sizeof(recvtimeoutbak); + getsockopt(peer, SOL_SOCKET, SO_RCVTIMEO, + (char*)&recvtimeoutbak, (int*)&recvtimeout); + recvtimeout = TIMEOUT*1000; + setsockopt(peer, SOL_SOCKET, SO_RCVTIMEO, + (const char*)&recvtimeout, sizeof(recvtimeout)); +#endif + if (tp->th_opcode == opcode_WRQ) recvtftp(test, pf); else sendtftp(test, pf); +#ifdef USE_WINSOCK + recvtimeout = recvtimeoutbak; + setsockopt(peer, SOL_SOCKET, SO_RCVTIMEO, + (const char*)&recvtimeout, sizeof(recvtimeout)); +#endif + return 0; } @@ -1196,9 +1215,6 @@ static void sendtftp(struct testcase *test, struct formats *pf) */ static void recvtftp(struct testcase *test, struct formats *pf) { -#ifdef USE_WINSOCK - DWORD recvtimeout, recvtimeoutbak; -#endif ssize_t n, size; recvblock = 0; #if defined(HAVE_ALARM) && defined(SIGALRM) @@ -1268,20 +1284,7 @@ send_ack: alarm(rexmtval); #endif /* normally times out and quits */ -#ifdef USE_WINSOCK - recvtimeout = sizeof(recvtimeoutbak); - getsockopt(peer, SOL_SOCKET, SO_RCVTIMEO, - (char*)&recvtimeoutbak, (int*)&recvtimeout); - recvtimeout = 10; - setsockopt(peer, SOL_SOCKET, SO_RCVTIMEO, - (const char*)&recvtimeout, sizeof(recvtimeout)); -#endif n = sread(peer, &buf.storage[0], sizeof(buf.storage)); -#ifdef USE_WINSOCK - recvtimeout = recvtimeoutbak; - setsockopt(peer, SOL_SOCKET, SO_RCVTIMEO, - (const char*)&recvtimeout, sizeof(recvtimeout)); -#endif #ifdef HAVE_ALARM alarm(0); #endif