mirror of
https://github.com/PowerShell/Win32-OpenSSH.git
synced 2025-07-26 07:25:25 +02:00
3-3 c3
This commit is contained in:
parent
18bd5676ce
commit
61b9e0c585
@ -435,136 +435,135 @@ w32_select(int fds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (writefds) {
|
if (writefds) {
|
||||||
for (i = 0; i < fds; i++)
|
for (i = 0; i < fds; i++)
|
||||||
if (FD_ISSET(i, writefds)) {
|
if (FD_ISSET(i, writefds)) {
|
||||||
CHECK_FD(i);
|
CHECK_FD(i);
|
||||||
in_set_fds++;
|
in_set_fds++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//if none of input fds are set return error
|
//if none of input fds are set return error
|
||||||
if (in_set_fds == 0) {
|
if (in_set_fds == 0) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
debug("ERROR: empty fd_sets");
|
debug("ERROR: empty fd_sets");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug2("Total in fds:%d", in_set_fds);
|
debug2("Total in fds:%d", in_set_fds);
|
||||||
//start async io on selected fds if needed and pick up any events that select needs to listen on
|
//start async io on selected fds if needed and pick up any events that select needs to listen on
|
||||||
for (int i = 0; i < fds; i++) {
|
for (int i = 0; i < fds; i++) {
|
||||||
|
|
||||||
if (readfds && FD_ISSET(i, readfds)) {
|
if (readfds && FD_ISSET(i, readfds)) {
|
||||||
if (w32_io_on_select(fd_table.w32_ios[i], TRUE) == -1)
|
if (w32_io_on_select(fd_table.w32_ios[i], TRUE) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
if ((fd_table.w32_ios[i]->type == SOCK_FD) && (fd_table.w32_ios[i]->internal.state == SOCK_LISTENING)) {
|
if ((fd_table.w32_ios[i]->type == SOCK_FD) && (fd_table.w32_ios[i]->internal.state == SOCK_LISTENING)) {
|
||||||
events[num_events++] = fd_table.w32_ios[i]->read_overlapped.hEvent;
|
events[num_events++] = fd_table.w32_ios[i]->read_overlapped.hEvent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (writefds && FD_ISSET(i, writefds)) {
|
if (writefds && FD_ISSET(i, writefds)) {
|
||||||
if (w32_io_on_select(fd_table.w32_ios[i], FALSE) == -1)
|
if (w32_io_on_select(fd_table.w32_ios[i], FALSE) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
if ((fd_table.w32_ios[i]->type == SOCK_FD) && (fd_table.w32_ios[i]->internal.state == SOCK_CONNECTING)) {
|
if ((fd_table.w32_ios[i]->type == SOCK_FD) && (fd_table.w32_ios[i]->internal.state == SOCK_CONNECTING)) {
|
||||||
events[num_events++] = fd_table.w32_ios[i]->write_overlapped.hEvent;
|
events[num_events++] = fd_table.w32_ios[i]->write_overlapped.hEvent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//excute any scheduled APCs
|
//excute any scheduled APCs
|
||||||
if (0 != wait_for_any_event(NULL, 0, 0)) {
|
if (0 != wait_for_any_event(NULL, 0, 0))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
//see if any io is ready
|
//see if any io is ready
|
||||||
for (i = 0; i < fds; i++) {
|
for (i = 0; i < fds; i++) {
|
||||||
|
|
||||||
if (readfds && FD_ISSET(i, readfds)) {
|
if (readfds && FD_ISSET(i, readfds)) {
|
||||||
if (w32_io_is_io_available(fd_table.w32_ios[i], TRUE)) {
|
if (w32_io_is_io_available(fd_table.w32_ios[i], TRUE)) {
|
||||||
FD_SET(i, &read_ready_fds);
|
FD_SET(i, &read_ready_fds);
|
||||||
out_ready_fds++;
|
out_ready_fds++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (writefds && FD_ISSET(i, writefds)) {
|
if (writefds && FD_ISSET(i, writefds)) {
|
||||||
if (w32_io_is_io_available(fd_table.w32_ios[i], FALSE)) {
|
if (w32_io_is_io_available(fd_table.w32_ios[i], FALSE)) {
|
||||||
FD_SET(i, &write_ready_fds);
|
FD_SET(i, &write_ready_fds);
|
||||||
out_ready_fds++;
|
out_ready_fds++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//if io on some fds is already ready, return
|
//if io on some fds is already ready, return
|
||||||
if (out_ready_fds)
|
if (out_ready_fds) {
|
||||||
{
|
if (readfds)
|
||||||
if (readfds)
|
*readfds = read_ready_fds;
|
||||||
*readfds = read_ready_fds;
|
if (writefds)
|
||||||
if (writefds)
|
*writefds = write_ready_fds;
|
||||||
*writefds = write_ready_fds;
|
debug2("IO ready:%d, no wait", out_ready_fds);
|
||||||
debug2("IO ready:%d, no wait", out_ready_fds);
|
return out_ready_fds;
|
||||||
return out_ready_fds;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ticks_now = GetTickCount64();
|
ticks_now = GetTickCount64();
|
||||||
if (time_milliseconds < (ticks_now - ticks_start)) {
|
if (time_milliseconds < (ticks_now - ticks_start)) {
|
||||||
errno = ETIMEDOUT;
|
errno = ETIMEDOUT;
|
||||||
debug("select timing out");
|
debug("select timing out");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != wait_for_any_event(events, num_events, time_milliseconds - ((ticks_now - ticks_start) & 0xffffffff))) {
|
if (0 != wait_for_any_event(events, num_events, time_milliseconds - ((ticks_now - ticks_start) & 0xffffffff)))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
//check on fd status
|
//check on fd status
|
||||||
out_ready_fds = 0;
|
out_ready_fds = 0;
|
||||||
for (int i = 0; i < fds; i++) {
|
for (int i = 0; i < fds; i++) {
|
||||||
|
|
||||||
if (readfds && FD_ISSET(i, readfds)) {
|
if (readfds && FD_ISSET(i, readfds)) {
|
||||||
in_set_fds++;
|
in_set_fds++;
|
||||||
if (w32_io_is_io_available(fd_table.w32_ios[i], TRUE)) {
|
if (w32_io_is_io_available(fd_table.w32_ios[i], TRUE)) {
|
||||||
FD_SET(i, &read_ready_fds);
|
FD_SET(i, &read_ready_fds);
|
||||||
out_ready_fds++;
|
out_ready_fds++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (writefds && FD_ISSET(i, writefds)) {
|
if (writefds && FD_ISSET(i, writefds)) {
|
||||||
in_set_fds++;
|
in_set_fds++;
|
||||||
if (w32_io_is_io_available(fd_table.w32_ios[i], FALSE)) {
|
if (w32_io_is_io_available(fd_table.w32_ios[i], FALSE)) {
|
||||||
FD_SET(i, &write_ready_fds);
|
FD_SET(i, &write_ready_fds);
|
||||||
out_ready_fds++;
|
out_ready_fds++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (out_ready_fds)
|
if (out_ready_fds)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
debug2("wait ended without any IO completion, looping again");
|
debug2("wait ended without any IO completion, looping again");
|
||||||
|
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
if (readfds)
|
if (readfds)
|
||||||
*readfds = read_ready_fds;
|
*readfds = read_ready_fds;
|
||||||
if (writefds)
|
if (writefds)
|
||||||
*writefds = write_ready_fds;
|
*writefds = write_ready_fds;
|
||||||
|
|
||||||
return out_ready_fds;
|
return out_ready_fds;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int w32_dup(int oldfd) {
|
int
|
||||||
CHECK_FD(oldfd);
|
w32_dup(int oldfd) {
|
||||||
errno = EOPNOTSUPP;
|
CHECK_FD(oldfd);
|
||||||
debug("ERROR: dup is not implemented yet");
|
errno = EOPNOTSUPP;
|
||||||
return -1;
|
debug("ERROR: dup is not implemented yet");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int w32_dup2(int oldfd, int newfd) {
|
int
|
||||||
CHECK_FD(oldfd);
|
w32_dup2(int oldfd, int newfd) {
|
||||||
errno = EOPNOTSUPP;
|
CHECK_FD(oldfd);
|
||||||
debug("ERROR: dup2 is not implemented yet");
|
errno = EOPNOTSUPP;
|
||||||
return -1;
|
debug("ERROR: dup2 is not implemented yet");
|
||||||
|
return -1;
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user