aboutsummaryrefslogtreecommitdiff
path: root/tests/server/tftpd.c
diff options
context:
space:
mode:
authorMarc Hoersken <info@marc-hoersken.de>2013-04-06 19:00:42 +0200
committerMarc Hoersken <info@marc-hoersken.de>2013-04-06 19:00:42 +0200
commitb4fae9d73fece4e9ec7e347f69b84be4da49e94c (patch)
treea4db84c9d3788c31747038ac15210d6de8710b8f /tests/server/tftpd.c
parente51b23c925a2721cf7c29b2b376d3d8903cfb067 (diff)
tftpd.c: Apply sread timeout to the whole data transfer session
Diffstat (limited to 'tests/server/tftpd.c')
-rw-r--r--tests/server/tftpd.c37
1 files 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