/* * Callback for when data is available on the standard output handle of * a process channel that is interactive mode */ DWORD process_channel_interact_notify(Remote *remote, Channel *channel) { ProcessChannelContext *ctx = (ProcessChannelContext *)channel->ops.stream.native.context; DWORD bytesRead, bytesAvail = 0; CHAR buffer[16384]; DWORD result = ERROR_SUCCESS; #ifdef _WIN32 if( PeekNamedPipe( ctx->pStdout, NULL, 0, NULL, &bytesAvail, NULL ) ) { if( bytesAvail ) { if( ReadFile( ctx->pStdout, buffer, sizeof(buffer) - 1, &bytesRead, NULL ) ) { return channel_write( channel, remote, NULL, 0, buffer, bytesRead, NULL ); } } else { // sf: if no data is available on the pipe we sleep to avoid running a tight loop // in this thread, as anonymous pipes won't block for data to arrive. Sleep( 100 ); } } #else bytesRead = read ( ctx->pStdout, buffer, sizeof(buffer) - 1); if ( bytesRead > 0 ) { dprintf("bytesRead: %d, errno: %d", bytesRead, errno); result = channel_write ( channel, remote, NULL, 0, buffer, bytesRead, NULL ); } if(bytesRead == -1) { if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) { errno = ERROR_SUCCESS; } } if(bytesRead == 0) { errno = ECONNRESET; } if(bytesRead <= 0) result = errno; #endif if( GetLastError() != ERROR_SUCCESS ) { dprintf("Closing down socket: errno: %d\n", errno); process_channel_close( channel, NULL, ctx ); channel_close( channel, remote, NULL, 0, NULL ); } return result; }
/* * Callback for when data is available on the standard output handle of * a process channel that is interactive mode */ DWORD process_channel_interact_notify(Remote *remote, LPVOID entryContext, LPVOID threadContext) { Channel *channel = (Channel*)entryContext; ProcessChannelContext *ctx = (ProcessChannelContext *)threadContext; DWORD bytesRead, bytesAvail = 0; CHAR buffer[16384]; DWORD result = ERROR_SUCCESS; if (!channel_exists(channel) || ctx == NULL) { return result; } if( PeekNamedPipe( ctx->pStdout, NULL, 0, NULL, &bytesAvail, NULL ) ) { if( bytesAvail ) { if( ReadFile( ctx->pStdout, buffer, sizeof(buffer) - 1, &bytesRead, NULL ) ) { return channel_write( channel, remote, NULL, 0, buffer, bytesRead, NULL ); } result = GetLastError(); } else { // sf: if no data is available on the pipe we sleep to avoid running a tight loop // in this thread, as anonymous pipes won't block for data to arrive. Sleep( 100 ); } } else { result = GetLastError(); } if( result != ERROR_SUCCESS ) { dprintf("Closing down socket: result: %d\n", result); process_channel_close( channel, NULL, ctx ); channel_close( channel, remote, NULL, 0, NULL ); } return result; }