mirror of
https://github.com/PowerShell/Win32-OpenSSH.git
synced 2025-10-26 09:14:00 +01:00
69 lines
1.6 KiB
C
69 lines
1.6 KiB
C
/*
|
|
* Author: Manoj Ampalam <manoj.ampalam@microsoft.com>
|
|
*/
|
|
|
|
#include "w32fd.h"
|
|
#include <errno.h>
|
|
|
|
/* signal handlers */
|
|
|
|
/* signal queue */
|
|
|
|
/*
|
|
* Main wait routine used by all blocking calls.
|
|
* It wakes up on
|
|
* - any signals (errno = EINTR ) - TODO
|
|
* - any of the supplied events set
|
|
* - any APCs caused by IO completions
|
|
* - time out (errno = ETIMEOUT)
|
|
* - Returns 0 on IO completion and -1 on rest
|
|
* if milli_seconds is 0, this function returns 0, its called with 0
|
|
* to execute any scheduled APCs
|
|
*/
|
|
int
|
|
wait_for_any_event(HANDLE* events, int num_events, DWORD milli_seconds)
|
|
{
|
|
/* TODO - implement signal catching and handling */
|
|
if (num_events) {
|
|
DWORD ret = WaitForMultipleObjectsEx(num_events, events, FALSE,
|
|
milli_seconds, TRUE);
|
|
if ((ret >= WAIT_OBJECT_0) && (ret <= WAIT_OBJECT_0 + num_events - 1)) {
|
|
//woken up by event signalled
|
|
return 0;
|
|
}
|
|
else if (ret == WAIT_IO_COMPLETION) {
|
|
return 0;
|
|
}
|
|
else if (ret == WAIT_TIMEOUT) {
|
|
if (milli_seconds == 0)
|
|
return 0;
|
|
errno = ETIMEDOUT;
|
|
debug("ERROR: wait timed out");
|
|
return -1;
|
|
}
|
|
/* some other error*/
|
|
else {
|
|
errno = EOTHER;
|
|
debug("ERROR: unxpected wait end with error: %d", ret);
|
|
return -1;
|
|
}
|
|
}
|
|
else {
|
|
DWORD ret = SleepEx(milli_seconds, TRUE);
|
|
if (ret == WAIT_IO_COMPLETION) {
|
|
return 0;
|
|
}
|
|
else if (ret == 0) {
|
|
if (milli_seconds == 0)
|
|
return 0;
|
|
errno = ETIMEDOUT;
|
|
debug("ERROR: wait timed out");
|
|
return -1;
|
|
}
|
|
else { //some other error
|
|
errno = EOTHER;
|
|
debug("ERROR: unxpected SleepEx error: %d", ret);
|
|
return -1;
|
|
}
|
|
}
|
|
} |