1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 23 /* All Rights Reserved */ 24 25 26 /* 27 * Copyright 2014 Garrett D'Amore <garrett@damore.org> 28 * 29 * Copyright (c) 1995, 1998 by Sun Microsystems, Inc. 30 * All rights reserved. 31 */ 32 33 /* 34 * Copyright 2015, Joyent, Inc. 35 */ 36 37 #ifndef _SYS_POLL_H 38 #define _SYS_POLL_H 39 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 /* 45 * Structure of file descriptor/event pairs supplied in 46 * the poll arrays. 47 */ 48 typedef struct pollfd { 49 int fd; /* file desc to poll */ 50 short events; /* events of interest on fd */ 51 short revents; /* events that occurred on fd */ 52 } pollfd_t; 53 54 typedef unsigned long nfds_t; 55 56 /* 57 * Testable select events 58 */ 59 #define POLLIN 0x0001 /* fd is readable */ 60 #define POLLPRI 0x0002 /* high priority info at fd */ 61 #define POLLOUT 0x0004 /* fd is writeable (won't block) */ 62 #define POLLRDNORM 0x0040 /* normal data is readable */ 63 #define POLLWRNORM POLLOUT 64 #define POLLRDBAND 0x0080 /* out-of-band data is readable */ 65 #define POLLWRBAND 0x0100 /* out-of-band data is writeable */ 66 #define POLLRDHUP 0x4000 /* read-side hangup */ 67 68 #define POLLNORM POLLRDNORM 69 70 /* 71 * Non-testable poll events (may not be specified in events field, 72 * but may be returned in revents field). 73 */ 74 #define POLLERR 0x0008 /* fd has error condition */ 75 #define POLLHUP 0x0010 /* fd has been hung up on */ 76 #define POLLNVAL 0x0020 /* invalid pollfd entry */ 77 78 /* 79 * These events will never be specified in revents, but may be specified in 80 * events to control /dev/poll behavior. 81 */ 82 #define POLLREMOVE 0x0800 /* remove cached /dev/poll fd */ 83 #define POLLONESHOT 0x1000 /* /dev/poll should one-shot this fd */ 84 #define POLLET 0x2000 /* edge-triggered /dev/poll fd */ 85 86 #ifdef _KERNEL 87 88 /* 89 * Additional private poll flags supported only by strpoll(). 90 * Must be bit-wise distinct from the above POLL flags. 91 */ 92 #define POLLRDDATA 0x0200 /* Wait for M_DATA; ignore M_PROTO only msgs */ 93 #define POLLNOERR 0x0400 /* Ignore POLLERR conditions */ 94 95 #define POLLCLOSED 0x8000 /* a (cached) poll fd has been closed */ 96 97 #endif /* _KERNEL */ 98 99 #if defined(_KERNEL) || defined(_KMEMUSER) 100 101 #include <sys/thread.h> 102 103 /* 104 * XXX We are forced to use a forward reference here because including 105 * file.h here will break i386 build. The real solution is to fix the 106 * broken parts in usr/src/stand/lib/fs. 107 */ 108 struct fpollinfo; 109 110 /* 111 * Poll list head structure. A pointer to this is passed to 112 * pollwakeup() from the caller indicating an event has occurred. 113 * Only the ph_list field is used, but for DDI compliance, we can't 114 * change the size of the structure. 115 */ 116 typedef struct pollhead { 117 struct polldat *ph_list; /* list of pollers */ 118 void *ph_pad1; /* unused -- see above */ 119 short ph_pad2; /* unused -- see above */ 120 } pollhead_t; 121 122 #if defined(_KERNEL) 123 124 /* 125 * Routine called to notify a process of the occurrence 126 * of an event. 127 */ 128 extern void pollwakeup(pollhead_t *, short); 129 130 /* 131 * Internal routines. 132 */ 133 extern int polllock(pollhead_t *, kmutex_t *); 134 extern int pollunlock(int *); 135 extern void pollrelock(int); 136 extern void pollcleanup(void); 137 extern void pollblockexit(struct fpollinfo *); 138 extern void pollcacheclean(struct fpollinfo *, int); 139 140 /* 141 * public poll head interface: 142 * 143 * pollhead_clean clean up all polldats on a pollhead list 144 */ 145 extern void pollhead_clean(pollhead_t *); 146 147 #endif /* defined(_KERNEL) */ 148 149 #endif /* defined(_KERNEL) || defined(_KMEMUSER) */ 150 151 #if !defined(_KERNEL) 152 int poll(struct pollfd *, nfds_t, int); 153 #endif /* !_KERNEL */ 154 155 #ifdef __cplusplus 156 } 157 #endif 158 159 #endif /* _SYS_POLL_H */ 160