Only works for pipes, as commented in the source code.
Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
---
win32/mingw.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 69 insertions(+), 0 deletions(-)
diff --git a/win32/mingw.c b/win32/mingw.c
index cb0e7be..c156adc 100644
--- a/win32/mingw.c
+++ b/win32/mingw.c
@@ -176,6 +176,75 @@ int pipe(int filedes[2])
return 0;
}
+int poll(struct pollfd *ufds, unsigned int nfds, int timeout)
+{
+ int i, pending;
+
+ if (timeout >= 0) {
+ if (nfds == 0) {
+ Sleep(timeout);
+ return 0;
+ }
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* When there is only one fd to wait for, then we pretend that
+ * input is available and let the actual wait happen when the
+ * caller invokes read().
+ */
+ if (nfds == 1) {
+ if (!(ufds[0].events & POLLIN)) {
+ errno = EINVAL;
+ return -1;
+ }
+ ufds[0].revents = POLLIN;
+ return 0;
+ }
+
+repeat:
+ pending = 0;
+ for (i = 0; i < nfds; i++) {
+ DWORD avail = 0;
+ HANDLE h = (HANDLE) _get_osfhandle(ufds[i].fd);
+ if (h == INVALID_HANDLE_VALUE)
+ return -1; /* errno was set */
+
+ if (!(ufds[i].events & POLLIN)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* this emulation works only for pipes */
+ if (!PeekNamedPipe(h, NULL, 0, NULL, &avail, NULL)) {
+ int err = GetLastError();
+ if (err == ERROR_BROKEN_PIPE) {
+ ufds[i].revents = POLLHUP;
+ pending++;
+ } else {
+ errno = EINVAL;
+ return -1;
+ }
+ } else if (avail) {
+ ufds[i].revents = POLLIN;
+ pending++;
+ } else
+ ufds[i].revents = 0;
+ }
+ if (!pending) {
+ /* The only times that we spin here is when the process
+ * that is connected through the pipes is waiting for
+ * its own input data to become available. But since
+ * the process (pack-objects) is itself CPU intensive,
+ * it will happily pick up the time slice that we are
+ * relinguishing here.
+ */
+ Sleep(0);
+ goto repeat;
+ }
+ return 0;
+}
+
struct tm *gmtime_r(const time_t *timep, struct tm *result)
{
/* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox