--- curl-7.8\lib\telnet.c	Fri Mar 16 16:21:44 2001
+++ curl_telnet\lib\telnet.c	Fri Jul 06 09:19:06 2001
@@ -35,7 +35,7 @@
 #include <errno.h>
 
 #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
-#include <winsock.h>
+#include <winsock2.h>
 #include <time.h>
 #include <io.h>
 #else
@@ -152,8 +152,8 @@
   int him[256]; 
   int himq[256]; 
   int him_preferred[256]; 
-  char *subopt_ttype;             /* Set with suboption TTYPE */
-  char *subopt_xdisploc;          /* Set with suboption XDISPLOC */
+  char subopt_ttype[32];             /* Set with suboption TTYPE */
+  char subopt_xdisploc[128];          /* Set with suboption XDISPLOC */
   struct curl_slist *telnet_vars; /* Environment variables */
 
   /* suboptions */
@@ -765,14 +765,16 @@
 
       /* Terminal type */
       if(strequal(option_keyword, "TTYPE")) {
-        tn->subopt_ttype = option_arg;
+        strncpy(tn->subopt_ttype, option_arg, 31);
+        tn->subopt_ttype[31] = 0; /* String termination */
         tn->us_preferred[TELOPT_TTYPE] = YES;
         continue;
       }
 
       /* Display variable */
       if(strequal(option_keyword, "XDISPLOC")) {
-        tn->subopt_xdisploc = option_arg;
+        strncpy(tn->subopt_xdisploc, option_arg, 127);
+        tn->subopt_xdisploc[127] = 0; /* String termination */
         tn->us_preferred[TELOPT_XDISPLOC] = YES;
         continue;
       }
@@ -1033,9 +1035,16 @@
   CURLcode code;
   struct UrlData *data = conn->data;
   int sockfd = conn->firstsocket;
+#ifdef WIN32
+  WSAEVENT event_handle;
+  WSANETWORKEVENTS events;
+  HANDLE stdin_handle;
+  HANDLE objs[2];
+  DWORD waitret;
+#else
   fd_set readfd;
   fd_set keepfd;
-
+#endif
   bool keepon = TRUE;
   char *buf = data->buffer;
   ssize_t nread;
@@ -1050,7 +1059,87 @@
   code = check_telnet_options(conn);
   if(code)
     return code;
-  
+
+#ifdef WIN32
+  /* We want to wait for both stdin and the socket. Since
+  ** the select() function in winsock only works on sockets
+  ** we have to use the WaitForMultipleObjects() call.
+  */
+
+  /* First, create a sockets event object */
+  event_handle = WSACreateEvent();
+
+  /* The get the Windows file handle for stdin */
+  stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
+
+  /* Create the list of objects to wait for */
+  objs[0] = stdin_handle;
+  objs[1] = event_handle;
+
+  /* Tell winsock what events we want to listen to */
+  if(WSAEventSelect(sockfd, event_handle, FD_READ|FD_CLOSE) == SOCKET_ERROR) {
+    return 0;
+  }
+
+  /* Keep on listening and act on events */
+  while(keepon) {
+    waitret = WaitForMultipleObjects(2, objs, FALSE, INFINITE);
+    switch(waitret - WAIT_OBJECT_0)
+    {
+      case 0:
+      {
+        unsigned char outbuf[2];
+        int out_count = 0;
+        size_t bytes_written;
+        char *buffer = buf;
+              
+        if(!ReadFile(stdin_handle, buf, 255, &nread, NULL)) {
+          keepon = FALSE;
+          break;
+        }
+        
+        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);
+        }
+      }
+      break;
+      
+      case 1:
+        if(WSAEnumNetworkEvents(sockfd, event_handle, &events)
+           != SOCKET_ERROR)
+        {
+          if(events.lNetworkEvents & FD_READ)
+          {
+            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;
+    }
+  }
+#else
   FD_ZERO (&readfd);		/* clear it */
   FD_SET (sockfd, &readfd);
   FD_SET (1, &readfd);
@@ -1108,6 +1197,7 @@
       }
     }
   }
+#endif
   /* mark this as "no further transfer wanted" */
   return Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
 }


