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 #ifndef _SYS_POLL_H
  34 #define _SYS_POLL_H
  35 
  36 #ifdef  __cplusplus
  37 extern "C" {
  38 #endif
  39 
  40 /*
  41  * Structure of file descriptor/event pairs supplied in
  42  * the poll arrays.
  43  */
  44 typedef struct pollfd {
  45         int fd;                         /* file desc to poll */
  46         short events;                   /* events of interest on fd */
  47         short revents;                  /* events that occurred on fd */
  48 } pollfd_t;
  49 
  50 typedef unsigned long   nfds_t;
  51 
  52 /*
  53  * Testable select events
  54  */
  55 #define POLLIN          0x0001          /* fd is readable */
  56 #define POLLPRI         0x0002          /* high priority info at fd */
  57 #define POLLOUT         0x0004          /* fd is writeable (won't block) */
  58 #define POLLRDNORM      0x0040          /* normal data is readable */
  59 #define POLLWRNORM      POLLOUT
  60 #define POLLRDBAND      0x0080          /* out-of-band data is readable */
  61 #define POLLWRBAND      0x0100          /* out-of-band data is writeable */
  62 
  63 #define POLLNORM        POLLRDNORM
  64 
  65 /*
  66  * Non-testable poll events (may not be specified in events field,
  67  * but may be returned in revents field).
  68  */
  69 #define POLLERR         0x0008          /* fd has error condition */
  70 #define POLLHUP         0x0010          /* fd has been hung up on */
  71 #define POLLNVAL        0x0020          /* invalid pollfd entry */
  72 
  73 #define POLLREMOVE      0x0800  /* remove a cached poll fd from /dev/poll */
  74 
  75 #ifdef _KERNEL
  76 
  77 /*
  78  * Additional private poll flags supported only by strpoll().
  79  * Must be bit-wise distinct from the above POLL flags.
  80  */
  81 #define POLLRDDATA      0x0200  /* Wait for M_DATA; ignore M_PROTO only msgs */
  82 #define POLLNOERR       0x0400  /* Ignore POLLERR conditions */
  83 
  84 #define POLLCLOSED      0x8000  /* a (cached) poll fd has been closed */
  85 
  86 #endif /* _KERNEL */
  87 
  88 #if defined(_KERNEL) || defined(_KMEMUSER)
  89 
  90 #include <sys/thread.h>
  91 
  92 /*
  93  * XXX We are forced to use a forward reference here because including
  94  * file.h here will break i386 build. The real solution is to fix the
  95  * broken parts in usr/src/stand/lib/fs.
  96  */
  97 struct fpollinfo;
  98 
  99 /*
 100  * Poll list head structure.  A pointer to this is passed to
 101  * pollwakeup() from the caller indicating an event has occurred.
 102  * Only the ph_list field is used, but for DDI compliance, we can't
 103  * change the size of the structure.
 104  */
 105 typedef struct pollhead {
 106         struct polldat          *ph_list;       /* list of pollers */
 107         void                    *ph_pad1;       /* unused -- see above */
 108         short                   ph_pad2;        /* unused -- see above */
 109 } pollhead_t;
 110 
 111 #if defined(_KERNEL)
 112 
 113 /*
 114  * Routine called to notify a process of the occurrence
 115  * of an event.
 116  */
 117 extern void pollwakeup(pollhead_t *, short);
 118 
 119 /*
 120  * Internal routines.
 121  */
 122 extern void polllock(pollhead_t *, kmutex_t *);
 123 extern int pollunlock(void);
 124 extern void pollrelock(int);
 125 extern void pollcleanup(void);
 126 extern void pollblockexit(struct fpollinfo *);
 127 extern void pollcacheclean(struct fpollinfo *, int);
 128 
 129 /*
 130  * public poll head interface:
 131  *
 132  *  pollhead_clean      clean up all polldats on a pollhead list
 133  */
 134 extern void pollhead_clean(pollhead_t *);
 135 
 136 #endif /* defined(_KERNEL) */
 137 
 138 #endif /* defined(_KERNEL) || defined(_KMEMUSER) */
 139 
 140 #if !defined(_KERNEL)
 141 int poll(struct pollfd *, nfds_t, int);
 142 #endif /* !_KERNEL */
 143 
 144 #ifdef  __cplusplus
 145 }
 146 #endif
 147 
 148 #endif  /* _SYS_POLL_H */