Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2000-07-04 20:58:49 +0400
committerCorinna Vinschen <corinna@vinschen.de>2000-07-04 20:58:49 +0400
commitafb7e7196a6dc16c145a455d6cf0761cbaeb7a48 (patch)
treedf00f47f3e724366b081f190f7a122019c68bdc7 /winsup/cygwin/poll.cc
parentf88cc353838d8e406545d08f98eea8ad4b4cac5c (diff)
* poll.cc: New file. Implement `poll' system call.
* include/poll.h: Ditto. * include/sys/poll.h: Ditto. * Makefile.in: Add poll.o as dependency. * cygwin.din: Add poll and _poll symbols.
Diffstat (limited to 'winsup/cygwin/poll.cc')
-rw-r--r--winsup/cygwin/poll.cc63
1 files changed, 63 insertions, 0 deletions
diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc
new file mode 100644
index 000000000..e806b5ed0
--- /dev/null
+++ b/winsup/cygwin/poll.cc
@@ -0,0 +1,63 @@
+/* poll.cc. Implements poll(2) via usage of select(2) call.
+
+ Copyright 2000 Cygnus Solutions.
+
+ This file is part of Cygwin.
+
+ This software is a copyrighted work licensed under the terms of the
+ Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+ details. */
+
+#include <sys/poll.h>
+#include "winsup.h"
+
+extern "C"
+int
+poll (struct pollfd *fds, unsigned int nfds, int timeout)
+{
+ int max_fd = 0;
+ fd_set open_fds, read_fds, write_fds, except_fds;
+ struct timeval tv = { timeout / 1000, (timeout % 1000) * 1000 };
+
+ FD_ZERO (&read_fds);
+ FD_ZERO (&write_fds);
+ FD_ZERO (&except_fds);
+
+ for (unsigned int i = 0; i < nfds; ++i)
+ if (!dtable.not_open (fds[i].fd))
+ {
+ FD_SET (fds[i].fd, &open_fds);
+ if (fds[i].events & POLLIN)
+ FD_SET (fds[i].fd, &read_fds);
+ if (fds[i].events & POLLOUT)
+ FD_SET (fds[i].fd, &write_fds);
+ if (fds[i].events & POLLPRI)
+ FD_SET (fds[i].fd, &except_fds);
+ if (fds[i].fd > max_fd)
+ max_fd = fds[i].fd;
+ }
+
+ int ret = cygwin_select (max_fd + 1, &read_fds, &write_fds, &except_fds,
+ timeout < 0 ? NULL : &tv);
+
+ if (ret >= 0)
+ for (unsigned int i = 0; i < nfds; ++i)
+ {
+ if (!FD_ISSET (fds[i].fd, &open_fds))
+ fds[i].revents = POLLNVAL;
+ else if (dtable.not_open(fds[i].fd))
+ fds[i].revents = POLLHUP;
+ else
+ {
+ fds[i].revents = 0;
+ if (!FD_ISSET (fds[i].fd, &read_fds))
+ fds[i].revents |= POLLIN;
+ if (!FD_ISSET (fds[i].fd, &write_fds))
+ fds[i].revents |= POLLOUT;
+ if (!FD_ISSET (fds[i].fd, &except_fds))
+ fds[i].revents |= POLLPRI;
+ }
+ }
+
+ return ret;
+}