]> Zhao Yanbai Git Server - minix.git/commitdiff
Import poll() from NetBSD's libnbcompat
authorArun Thomas <arun@minix3.org>
Mon, 26 Jul 2010 20:46:04 +0000 (20:46 +0000)
committerArun Thomas <arun@minix3.org>
Mon, 26 Jul 2010 20:46:04 +0000 (20:46 +0000)
include/sys/Makefile
include/sys/poll.h [new file with mode: 0644]
lib/libc/posix/Makefile.inc
lib/libc/posix/poll.c [new file with mode: 0644]

index e53387b250c179481fd3e49aa24cbba6d7d9cb21..b95b2ce9db5c4ec3a5329b23e86480e10b67338d 100644 (file)
@@ -9,6 +9,6 @@ INCS=   asynchio.h dir.h file.h ioc_cmos.h ioc_disk.h \
        select.h sem.h shm.h sigcontext.h signal.h socket.h \
        soundcard.h statfs.h statvfs.h stat.h svrctl.h timeb.h \
        time.h times.h types.h ucontext.h ucred.h uio.h un.h \
-       utsname.h video.h vm.h wait.h cdefs.h null.h
+       utsname.h video.h vm.h wait.h cdefs.h null.h poll.h
 
 .include <bsd.kinc.mk>
diff --git a/include/sys/poll.h b/include/sys/poll.h
new file mode 100644 (file)
index 0000000..7c57e93
--- /dev/null
@@ -0,0 +1,67 @@
+/*     $NetBSD: poll.h,v 1.3 2008/04/29 05:46:08 martin Exp $  */
+
+/*-
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Charles M. Hannum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _NBCOMPAT_POLL_H_
+#define        _NBCOMPAT_POLL_H_
+
+#include <sys/cdefs.h>
+
+typedef unsigned int   nfds_t;
+
+struct pollfd {
+       int     fd;             /* file descriptor */
+       short   events;         /* events to look for */
+       short   revents;        /* events returned */
+};
+
+/*
+ * Testable events (may be specified in events field).
+ */
+#define        POLLIN          0x0001
+#define        POLLPRI         0x0002
+#define        POLLOUT         0x0004
+#define        POLLRDNORM      0x0040
+#define        POLLWRNORM      POLLOUT
+#define        POLLRDBAND      0x0080
+#define        POLLWRBAND      0x0100
+
+/*
+ * Non-testable events (may not be specified in events field).
+ */
+#define        POLLERR         0x0008
+#define        POLLHUP         0x0010
+#define        POLLNVAL        0x0020
+
+__BEGIN_DECLS
+int    poll (struct pollfd *, nfds_t, int);
+__END_DECLS
+
+#endif /* !_NBCOMPAT_POLL_H_ */
index cb5b007cf5aa426e3105449584676910b5ac6166..e5d5bf9075b2f9d2823f5e04029718c5a3f36255 100644 (file)
@@ -110,4 +110,5 @@ SRCS+=       \
        priority.c \
        pread.c \
        pwrite.c \
-       usleep.c
+       usleep.c \
+       poll.c
diff --git a/lib/libc/posix/poll.c b/lib/libc/posix/poll.c
new file mode 100644 (file)
index 0000000..bd99b95
--- /dev/null
@@ -0,0 +1,94 @@
+/*     $NetBSD: poll.c,v 1.3 2008/04/29 05:46:08 martin Exp $  */
+
+/*-
+ * Copyright (c) 2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Charles Blundell.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <sys/poll.h>
+#include <errno.h>
+
+int
+poll(struct pollfd *p, nfds_t nfds, int timout)
+{
+       fd_set read, write, except;
+       struct timeval tv;
+       nfds_t i;
+       int highfd, rval;
+
+       /*
+        * select cannot tell us much wrt POLL*BAND, POLLPRI, POLLHUP or
+        * POLLNVAL.
+        */
+       FD_ZERO(&read);
+       FD_ZERO(&write);
+       FD_ZERO(&except);
+
+       highfd = -1;
+       for (i = 0; i < nfds; i++) {
+               if (p[i].fd < 0)
+                       continue;
+               if (p[i].fd >= FD_SETSIZE) {
+                       errno = EINVAL;
+                       return -1;
+               }
+               if (p[i].fd > highfd)
+                       highfd = p[i].fd;
+
+               if (p[i].events & (POLLIN|POLLRDNORM|POLLRDBAND|POLLPRI))
+                       FD_SET(p[i].fd, &read);
+               if (p[i].events & (POLLOUT|POLLWRNORM|POLLWRBAND))
+                       FD_SET(p[i].fd, &write);
+               FD_SET(p[i].fd, &except);
+       }
+
+       tv.tv_sec = timout / 1000;
+       tv.tv_usec = (timout % 1000) * 1000;
+
+       rval = select(highfd + 1, &read, &write, &except,
+               timout == -1 ? NULL : &tv);
+       if (rval <= 0)
+               return rval;
+
+       rval = 0;
+       for (i = 0; i < nfds; i++) {
+               p[i].revents = 0;
+               if (FD_ISSET(p[i].fd, &read))
+                       p[i].revents |= POLLIN|POLLRDNORM|POLLRDBAND|POLLPRI;
+               if (FD_ISSET(p[i].fd, &write))
+                       p[i].revents |= POLLOUT|POLLWRNORM|POLLWRBAND;
+               if (FD_ISSET(p[i].fd, &except))
+                       p[i].revents |= POLLERR;
+               /* XXX: POLLHUP/POLLNVAL? */
+               if (p[i].revents != 0)
+                       rval++;
+       }
+       return rval;
+}