Skip to content
telnet.c 24.1 KiB
Newer Older
  fd_set keepfd;
Daniel Stenberg's avatar
Daniel Stenberg committed

  bool keepon = TRUE;
  char *buf = data->buffer;
Daniel Stenberg's avatar
Daniel Stenberg committed

  init_telnet(conn);
Daniel Stenberg's avatar
Daniel Stenberg committed
   
  code = check_telnet_options(conn);
  if(code)
    return code;
  
  FD_ZERO (&readfd);		/* clear it */
  FD_SET (sockfd, &readfd);
  FD_SET (1, &readfd);
Daniel Stenberg's avatar
Daniel Stenberg committed

  keepfd = readfd;
Daniel Stenberg's avatar
Daniel Stenberg committed

  while (keepon) {
    readfd = keepfd;		/* set this every lap in the loop */
Daniel Stenberg's avatar
Daniel Stenberg committed

    switch (select (sockfd + 1, &readfd, NULL, NULL, NULL)) {
    case -1:			/* error, stop reading */
      keepon = FALSE;
      continue;
    case 0:			/* timeout */
      break;
    default:			/* read! */
      if(FD_ISSET(1, &readfd)) { /* read from stdin */
        unsigned char outbuf[2];
        int out_count = 0;
        size_t bytes_written;
        char *buffer = buf;
        
        nread = read(1, buf, 255);

        while(nread--) {
          outbuf[0] = *buffer++;
          out_count = 1;
          if(outbuf[0] == IAC)
            outbuf[out_count++] = IAC;
      
          Curl_write(conn, conn->firstsocket, outbuf,
                     out_count, &bytes_written);
        }
      }
Daniel Stenberg's avatar
Daniel Stenberg committed

      if(FD_ISSET(sockfd, &readfd)) {
        Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
Daniel Stenberg's avatar
Daniel Stenberg committed

        /* if we receive 0 or less here, the server closed the connection and
           we bail out from this! */
        if (nread <= 0) {
          keepon = FALSE;
          break;
        }
        telrcv(conn, (unsigned char *)buf, nread);

        /* 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(please_negotiate && !already_negotiated) {
          negotiate(conn);
          already_negotiated = 1;
        }
  /* mark this as "no further transfer wanted" */
  return Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
Daniel Stenberg's avatar
Daniel Stenberg committed
}