Commit 8e935b58 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

TommyTam made a patch to handle stdin redirection for win32.

parent c93e9725
Loading
Loading
Loading
Loading
+58 −8
Original line number Diff line number Diff line
@@ -1090,6 +1090,8 @@ CURLcode Curl_telnet(struct connectdata *conn)
  WSANETWORKEVENTS events;
  HANDLE stdin_handle;
  HANDLE objs[2];         
  DWORD  obj_count;
  DWORD  wait_timeout;
  DWORD waitret;
  DWORD readfile_read;
#else
@@ -1181,8 +1183,8 @@ CURLcode Curl_telnet(struct connectdata *conn)
  stdin_handle = GetStdHandle(STD_INPUT_HANDLE);

  /* Create the list of objects to wait for */
  objs[0] = stdin_handle;
  objs[1] = event_handle;
  objs[0] = event_handle;
  objs[1] = stdin_handle;

  /* Tell winsock what events we want to listen to */
  if(event_select_func(sockfd, event_handle, FD_READ|FD_CLOSE) == SOCKET_ERROR) {
@@ -1191,11 +1193,59 @@ CURLcode Curl_telnet(struct connectdata *conn)
    return 0;
  }
                                   
  /* If stdin_handle is a pipe, use PeekNamedPipe() method to check it, 
     else use the old WaitForMultipleObjects() way */         
  if(GetFileType(stdin_handle) == FILE_TYPE_PIPE) {
    /* Don't wait for stdin_handle, just wait for event_handle */
    obj_count = 1;      
    /* Check stdin_handle per 100 milliseconds */
    wait_timeout = 100;  
  } else {
    obj_count = 2;
    wait_timeout = INFINITE;
  }
  
  /* Keep on listening and act on events */
  while(keepon) {
    waitret = WaitForMultipleObjects(2, objs, FALSE, INFINITE);
    switch(waitret - WAIT_OBJECT_0) {
    case 0:
    waitret = WaitForMultipleObjects(obj_count, objs, FALSE, wait_timeout);
    switch(waitret) {
    case WAIT_TIMEOUT:
    {
      unsigned char outbuf[2];
      int out_count = 0;
      ssize_t bytes_written;
      char *buffer = buf;

      for(;;) {
        if(!PeekNamedPipe(stdin_handle,NULL,0,NULL,&nread,NULL)) {
          keepon = FALSE;
          break;
        }
        
        if(!nread)
          break;
          
        if(!ReadFile(stdin_handle, buf, sizeof(data->state.buffer),
                     &readfile_read, NULL)) {
          keepon = FALSE;
          break;
        }
        nread = readfile_read;
        
        while(nread--) {
          outbuf[0] = *buffer++;
          out_count = 1;
          if(outbuf[0] == CURL_IAC)
            outbuf[out_count++] = CURL_IAC;
            
          Curl_write(conn, conn->sock[FIRSTSOCKET], outbuf,
                     out_count, &bytes_written);
        }
      }
    }      
    break;
    
    case WAIT_OBJECT_0 + 1:
    {
      unsigned char outbuf[2];
      int out_count = 0;
@@ -1221,7 +1271,7 @@ CURLcode Curl_telnet(struct connectdata *conn)
    }
    break;
      
    case 1:
    case WAIT_OBJECT_0:
      if(enum_netevents_func(sockfd, event_handle, &events)
         != SOCKET_ERROR) {
        if(events.lNetworkEvents & FD_READ) {