Commit b4fae9d7 authored by Marc Hoersken's avatar Marc Hoersken
Browse files

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

parent e51b23c9
Loading
Loading
Loading
Loading
+20 −17
Original line number Original line Diff line number Diff line
@@ -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