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; result = 2;
break; break;
} }
if (connect(peer, &from.sa, sizeof(from.sa6)) < 0) { if(connect(peer, &from.sa, sizeof(from.sa6)) < 0) {
logmsg("connect: fail"); logmsg("connect: fail");
result = 1; result = 1;
break; break;
@ -964,6 +964,9 @@ static int do_tftp(struct testcase *test, struct tftphdr *tp, ssize_t size)
char *filename, *mode = NULL; char *filename, *mode = NULL;
int error; int error;
FILE *server; FILE *server;
#ifdef USE_WINSOCK
DWORD recvtimeout, recvtimeoutbak;
#endif
/* Open request dump file. */ /* Open request dump file. */
server = fopen(REQUEST_DUMP, "ab"); server = fopen(REQUEST_DUMP, "ab");
@ -1018,11 +1021,27 @@ again:
nak(ecode); nak(ecode);
return 1; 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) if (tp->th_opcode == opcode_WRQ)
recvtftp(test, pf); recvtftp(test, pf);
else else
sendtftp(test, pf); sendtftp(test, pf);
#ifdef USE_WINSOCK
recvtimeout = recvtimeoutbak;
setsockopt(peer, SOL_SOCKET, SO_RCVTIMEO,
(const char*)&recvtimeout, sizeof(recvtimeout));
#endif
return 0; return 0;
} }
@ -1196,9 +1215,6 @@ static void sendtftp(struct testcase *test, struct formats *pf)
*/ */
static void recvtftp(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; ssize_t n, size;
recvblock = 0; recvblock = 0;
#if defined(HAVE_ALARM) && defined(SIGALRM) #if defined(HAVE_ALARM) && defined(SIGALRM)
@ -1268,20 +1284,7 @@ send_ack:
alarm(rexmtval); alarm(rexmtval);
#endif #endif
/* normally times out and quits */ /* 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)); 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 #ifdef HAVE_ALARM
alarm(0); alarm(0);
#endif #endif