diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/telnet.c | 60 | 
1 files changed, 38 insertions, 22 deletions
| diff --git a/lib/telnet.c b/lib/telnet.c index 750fa234f..7c0b20283 100644 --- a/lib/telnet.c +++ b/lib/telnet.c @@ -5,7 +5,7 @@   *                            | (__| |_| |  _ <| |___   *                             \___|\___/|_| \_\_____|   * - * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.   *   * This software is licensed as described in the file COPYING, which   * you should have received as part of this distribution. The terms @@ -1195,11 +1195,13 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)    DWORD  wait_timeout;    DWORD waitret;    DWORD readfile_read; +  int err;  #else    int interval_ms;    struct pollfd pfd[2];  #endif    ssize_t nread; +  struct timeval now;    bool keepon = TRUE;    char *buf = data->state.buffer;    struct TELNET *tn; @@ -1305,7 +1307,7 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)      wait_timeout = 100;    } else {      obj_count = 2; -    wait_timeout = INFINITE; +    wait_timeout = 1000;    }    /* Keep on listening and act on events */ @@ -1358,30 +1360,45 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)      break;      case WAIT_OBJECT_0: -      if(enum_netevents_func(sockfd, event_handle, &events) -         != SOCKET_ERROR) { -        if(events.lNetworkEvents & FD_READ) { -          /* This reallu OUGHT to check its return code. */ -          (void)Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread); - -          telrcv(conn, (unsigned char *)buf, nread); - -          fflush(stdout); - -          /* Negotiate if the peer has started negotiating, -             otherwise don't. We don't want to speak telnet with -             non-telnet servers, like POP or SMTP. */ -          if(tn->please_negotiate && !tn->already_negotiated) { -            negotiate(conn); -            tn->already_negotiated = 1; -          } -        } -        if(events.lNetworkEvents & FD_CLOSE) { +      if(SOCKET_ERROR == enum_netevents_func(sockfd, event_handle, &events)) { +        if((err = SOCKERRNO) != EINPROGRESS) { +          infof(data,"WSAEnumNetworkEvents failed (%d)", err);            keepon = FALSE; +          code = CURLE_READ_ERROR; +          break; +        } +      } +      if(events.lNetworkEvents & FD_READ) { +        /* This reallu OUGHT to check its return code. */ +        (void)Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread); + +        telrcv(conn, (unsigned char *)buf, nread); + +        fflush(stdout); + +        /* Negotiate if the peer has started negotiating, +           otherwise don't. We don't want to speak telnet with +           non-telnet servers, like POP or SMTP. */ +        if(tn->please_negotiate && !tn->already_negotiated) { +          negotiate(conn); +          tn->already_negotiated = 1;          }        } +      if(events.lNetworkEvents & FD_CLOSE) { +        keepon = FALSE; +      }        break; + +    } + +    if(data->set.timeout) { +      now = Curl_tvnow(); +      if(Curl_tvdiff(now, conn->created) >= data->set.timeout) { +        failf(data, "Time-out"); +        code = CURLE_OPERATION_TIMEDOUT; +        keepon = FALSE; +      }      }    } @@ -1446,7 +1463,6 @@ static CURLcode telnet_do(struct connectdata *conn, bool *done)        }      }      if(data->set.timeout) { -      struct timeval now;           /* current time */        now = Curl_tvnow();        if(Curl_tvdiff(now, conn->created) >= data->set.timeout) {          failf(data, "Time-out"); | 
