diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/server/tftpd.c | 50 | 
1 files changed, 42 insertions, 8 deletions
| diff --git a/tests/server/tftpd.c b/tests/server/tftpd.c index 9562f5a84..53d476d36 100644 --- a/tests/server/tftpd.c +++ b/tests/server/tftpd.c @@ -72,6 +72,8 @@  #endif  #ifdef HAVE_ARPA_TFTP_H  #include <arpa/tftp.h> +#else +#include "tftp.h"  #endif  #ifdef HAVE_NETDB_H  #include <netdb.h> @@ -88,8 +90,9 @@  #include <string.h>  #include <stdlib.h>  #include <unistd.h> +#ifdef HAVE_PWD_H  #include <pwd.h> -#include <grp.h> +#endif  #define ENABLE_CURLX_PRINTF  /* make the curlx header define all printf() functions to use the curlx_* @@ -111,7 +114,7 @@ struct testcase {    FILE *server;   /* write input "protocol" there for client verification */  }; -static int synchnet(int); +static int synchnet(curl_socket_t);  static struct tftphdr *r_init(void);  static struct tftphdr *w_init(void);  static int readit(struct testcase *test, struct tftphdr **dpp, int convert); @@ -352,13 +355,23 @@ static ssize_t write_behind(struct testcase *test, int convert)  static int synchnet(curl_socket_t f /* socket to flush */)  { -  int i, j = 0; + +#if defined(HAVE_IOCTLSOCKET) +  unsigned long i; +#else +  int i; +#endif +  int j = 0;    char rbuf[PKTSIZE];    struct sockaddr_in from;    socklen_t fromlen;    while (1) { +#if defined(HAVE_IOCTLSOCKET) +    (void) ioctlsocket(f, FIONREAD, &i); +#else	      (void) ioctl(f, FIONREAD, &i); +#endif      if (i) {        j++;        fromlen = sizeof from; @@ -371,6 +384,7 @@ static int synchnet(curl_socket_t f /* socket to flush */)    return j;  } +#if defined(HAVE_ALARM) && defined(SIGALRM)  /*   * Like signal(), but with well-defined semantics.   */ @@ -381,7 +395,7 @@ static void mysignal(int sig, void (*handler)(int))    sa.sa_handler = handler;    sigaction(sig, &sa, NULL);  } - +#endif  #ifndef DEFAULT_LOGFILE  #define DEFAULT_LOGFILE "log/tftpd.log" @@ -698,7 +712,9 @@ static int validate_access(struct testcase *test,  }  int timeout; +#ifdef HAVE_SIGSETJMP  sigjmp_buf timeoutbuf; +#endif  static void timer(int signum)  { @@ -709,7 +725,9 @@ static void timer(int signum)    timeout += rexmtval;    if (timeout >= maxtimeout)      exit(1); +#ifdef HAVE_SIGSETJMP    siglongjmp(timeoutbuf, 1); +#endif  }  /* @@ -721,8 +739,9 @@ static void sendtftp(struct testcase *test, struct formats *pf)    struct tftphdr *ap;    /* ack packet */    unsigned short block = 1;    int size, n; - +#if defined(HAVE_ALARM) && defined(SIGALRM)    mysignal(SIGALRM, timer); +#endif    dp = r_init();    ap = (struct tftphdr *)ackbuf;    do { @@ -734,8 +753,9 @@ static void sendtftp(struct testcase *test, struct formats *pf)      dp->th_opcode = htons((u_short)DATA);      dp->th_block = htons((u_short)block);      timeout = 0; +#ifdef HAVE_SIGSETJMP	      (void) sigsetjmp(timeoutbuf, 1); - +#endif      send_data:      if (send(peer, dp, size + 4, 0) != size + 4) {        logmsg("write\n"); @@ -743,9 +763,13 @@ static void sendtftp(struct testcase *test, struct formats *pf)      }      read_ahead(test, pf->f_convert);      for ( ; ; ) { +#ifdef HAVE_ALARM	        alarm(rexmtval);        /* read the ack */ +#endif        n = recv(peer, ackbuf, sizeof (ackbuf), 0); +#ifdef HAVE_ALARM	          alarm(0); +#endif	          if (n < 0) {          logmsg("read: fail\n");          return; @@ -790,8 +814,9 @@ static void recvtftp(struct testcase *test, struct formats *pf)    struct tftphdr *ap;    /* ack buffer */    unsigned short block = 0;    int n, size; - +#if defined(HAVE_ALARM) && defined(SIGALRM)    mysignal(SIGALRM, timer); +#endif    dp = w_init();    ap = (struct tftphdr *)ackbuf;    do { @@ -799,7 +824,9 @@ static void recvtftp(struct testcase *test, struct formats *pf)      ap->th_opcode = htons((u_short)ACK);      ap->th_block = htons((u_short)block);      block++; +#ifdef HAVE_SIGSETJMP      (void) sigsetjmp(timeoutbuf, 1); +#endif  send_ack:      if (send(peer, ackbuf, 4, 0) != 4) {        logmsg("write: fail\n"); @@ -807,9 +834,13 @@ send_ack:      }      write_behind(test, pf->f_convert);      for ( ; ; ) { +#ifdef HAVE_ALARM	        alarm(rexmtval); +#endif	          n = recv(peer, dp, PKTSIZE, 0); +#ifdef HAVE_ALARM	          alarm(0); +#endif        if (n < 0) {                       /* really? */          logmsg("read: fail\n");          goto abort; @@ -843,11 +874,14 @@ send_ack:    ap->th_opcode = htons((u_short)ACK);   /* send the "final" ack */    ap->th_block = htons((u_short)(block));    (void) send(peer, ackbuf, 4, 0); - +#if defined(HAVE_ALARM) && defined(SIGALRM)    mysignal(SIGALRM, justquit);           /* just quit on timeout */    alarm(rexmtval); +#endif      n = recv(peer, buf, sizeof (buf), 0);  /* normally times out and quits */ +#ifdef HAVE_ALARM      alarm(0); +#endif      if (n >= 4 &&                          /* if read some data */        dp->th_opcode == DATA &&           /* and got a data block */        block == dp->th_block) {           /* then my last ack was lost */ | 
