mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
TommyTam made a patch to handle stdin redirection for win32.
This commit is contained in:
parent
c93e972543
commit
8e935b58a2
66
lib/telnet.c
66
lib/telnet.c
@ -1089,7 +1089,9 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
|||||||
WSAEVENT event_handle;
|
WSAEVENT event_handle;
|
||||||
WSANETWORKEVENTS events;
|
WSANETWORKEVENTS events;
|
||||||
HANDLE stdin_handle;
|
HANDLE stdin_handle;
|
||||||
HANDLE objs[2];
|
HANDLE objs[2];
|
||||||
|
DWORD obj_count;
|
||||||
|
DWORD wait_timeout;
|
||||||
DWORD waitret;
|
DWORD waitret;
|
||||||
DWORD readfile_read;
|
DWORD readfile_read;
|
||||||
#else
|
#else
|
||||||
@ -1181,8 +1183,8 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
|||||||
stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
|
stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
|
|
||||||
/* Create the list of objects to wait for */
|
/* Create the list of objects to wait for */
|
||||||
objs[0] = stdin_handle;
|
objs[0] = event_handle;
|
||||||
objs[1] = event_handle;
|
objs[1] = stdin_handle;
|
||||||
|
|
||||||
/* Tell winsock what events we want to listen to */
|
/* Tell winsock what events we want to listen to */
|
||||||
if(event_select_func(sockfd, event_handle, FD_READ|FD_CLOSE) == SOCKET_ERROR) {
|
if(event_select_func(sockfd, event_handle, FD_READ|FD_CLOSE) == SOCKET_ERROR) {
|
||||||
@ -1190,12 +1192,60 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
|||||||
FreeLibrary(wsock2);
|
FreeLibrary(wsock2);
|
||||||
return 0;
|
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 */
|
/* Keep on listening and act on events */
|
||||||
while(keepon) {
|
while(keepon) {
|
||||||
waitret = WaitForMultipleObjects(2, objs, FALSE, INFINITE);
|
waitret = WaitForMultipleObjects(obj_count, objs, FALSE, wait_timeout);
|
||||||
switch(waitret - WAIT_OBJECT_0) {
|
switch(waitret) {
|
||||||
case 0:
|
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];
|
unsigned char outbuf[2];
|
||||||
int out_count = 0;
|
int out_count = 0;
|
||||||
@ -1221,7 +1271,7 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case WAIT_OBJECT_0:
|
||||||
if(enum_netevents_func(sockfd, event_handle, &events)
|
if(enum_netevents_func(sockfd, event_handle, &events)
|
||||||
!= SOCKET_ERROR) {
|
!= SOCKET_ERROR) {
|
||||||
if(events.lNetworkEvents & FD_READ) {
|
if(events.lNetworkEvents & FD_READ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user