tftpd.c: Apply sread timeout to the whole data transfer session

This commit is contained in:
Marc Hoersken 2013-04-06 19:00:42 +02:00
parent e51b23c925
commit b4fae9d73f
1 changed files with 20 additions and 17 deletions

View File

@ -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