6198 Let's EOL cachefs
[illumos-gate.git] / usr / src / uts / common / sys / stropts.h
blob354de4b18697128960cf7c8a11baceb391d2f7ff
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
21 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
22 /* All Rights Reserved */
26 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
27 * Use is subject to license terms.
30 #ifndef _SYS_STROPTS_H
31 #define _SYS_STROPTS_H
33 #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 11.20 */
35 #include <sys/feature_tests.h>
36 #include <sys/types.h>
38 * For FMNAMESZ define.
40 #include <sys/conf.h>
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
47 * Write options
49 #define SNDZERO 0x001 /* send a zero length message */
50 #define SNDPIPE 0x002 /* send SIGPIPE on write and */
51 /* putmsg if sd_werror is set */
54 * Read options
56 #define RNORM 0x000 /* read msg norm */
57 #define RMSGD 0x001 /* read msg discard */
58 #define RMSGN 0x002 /* read msg no discard */
60 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
61 #define RMODEMASK 0x003 /* all above bits */
62 #endif
65 * These next three read options are added for the sake of
66 * user-level transparency. RPROTDAT will cause the stream head
67 * to treat the contents of M_PROTO and M_PCPROTO message blocks
68 * as data. RPROTDIS will prevent the stream head from failing
69 * a read with EBADMSG if an M_PROTO or M_PCPROTO message is on
70 * the front of the stream head read queue. Rather, the protocol
71 * blocks will be silently discarded and the data associated with
72 * the message (in linked M_DATA blocks), if any, will be delivered
73 * to the user. RPROTNORM sets the default behavior, where read
74 * will fail with EBADMSG if an M_PROTO or M_PCPROTO are at the
75 * stream head.
77 #define RPROTDAT 0x004 /* read protocol messages as data */
78 #define RPROTDIS 0x008 /* discard protocol messages, but */
79 /* read data portion */
80 #define RPROTNORM 0x010
82 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
83 #define RPROTMASK 0x01c /* all RPROT bits */
86 * The next read option is used so that a TPI aware module can tell the
87 * stream head to not flush M_PCPROTO messages when processing a read side
88 * flush. This will avoid problems where a flush removes a T_OK_ACK.
90 #define RFLUSHMASK 0x020 /* all RFLUSH bits */
92 #define RFLUSHPCPROT 0x020 /* do not flush PCPROTOs */
94 #endif
97 * Error options
101 * Error options to adjust the stream head error behavior with respect
102 * to M_ERROR message for read and write side errors respectively.
103 * The normal case is that the read/write side error is
104 * persistent and these options allow the application or streams module/driver
105 * to specify that errors are nonpersistent. In this case the error is cleared
106 * after having been returned to read(), getmsg(), ioctl(), write(), putmsg(),
107 * etc.
109 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
110 #define RERRNORM 0x001 /* Normal, persistent read errors */
111 #define RERRNONPERSIST 0x002 /* Nonpersistent read errors */
113 #define RERRMASK (RERRNORM|RERRNONPERSIST)
115 #define WERRNORM 0x004 /* Normal, persistent write errors */
116 #define WERRNONPERSIST 0x008 /* Nonpersistent write errors */
118 #define WERRMASK (WERRNORM|WERRNONPERSIST)
119 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */
122 * Flush options
125 #define FLUSHR 0x01 /* flush read queue */
126 #define FLUSHW 0x02 /* flush write queue */
127 #define FLUSHRW 0x03 /* flush both queues */
128 #define FLUSHBAND 0x04 /* flush only band specified */
129 /* in next byte */
131 * Copy options for M_SETOPS/SO_COPYOPT
133 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
134 #define ZCVMSAFE 0x01 /* safe to borrow file (segmapped) */
135 /* pages instead of bcopy */
136 #define ZCVMUNSAFE 0x02 /* unsafe to borrow file pages */
137 #define COPYCACHED 0x04 /* copy should NOT bypass cache */
138 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */
141 * Events for which the SIGPOLL signal is to be sent.
143 #define S_INPUT 0x0001 /* any msg but hipri on read Q */
144 #define S_HIPRI 0x0002 /* high priority msg on read Q */
145 #define S_OUTPUT 0x0004 /* write Q no longer full */
146 #define S_MSG 0x0008 /* signal msg at front of read Q */
147 #define S_ERROR 0x0010 /* error msg arrived at stream head */
148 #define S_HANGUP 0x0020 /* hangup msg arrived at stream head */
149 #define S_RDNORM 0x0040 /* normal msg on read Q */
150 #define S_WRNORM S_OUTPUT
151 #define S_RDBAND 0x0080 /* out of band msg on read Q */
152 #define S_WRBAND 0x0100 /* can write out of band */
153 #define S_BANDURG 0x0200 /* modifier to S_RDBAND, to generate */
154 /* SIGURG instead of SIGPOLL */
157 * Flags for getmsg() and putmsg() syscall arguments.
158 * "RS" stands for recv/send. The system calls were originally called
159 * recv() and send(), but were renamed to avoid confusion with the BSD
160 * calls of the same name. A value of zero will cause getmsg() to return
161 * the first message on the stream head read queue and putmsg() to send
162 * a normal priority message.
164 * Flags for strmakemsg() arguments (should define strmakemsg() flags).
165 * Used to determine the message type of the control part of a message,
166 * if RS_HIPRI, M_PCPROTO, else M_PROTO.
169 #define RS_HIPRI 0x01 /* send/recv high priority message */
170 #define STRUIO_POSTPONE 0x08 /* postpone copyin() for struio() */
173 * Flags for getpmsg() and putpmsg() syscall arguments.
177 * These are settable by the user and will be set on return
178 * to indicate the priority of message received.
180 #define MSG_HIPRI 0x01 /* send/recv high priority message */
181 #define MSG_ANY 0x02 /* recv any messages */
182 #define MSG_BAND 0x04 /* recv messages from specified band */
183 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
185 * This is a private flag passed by libc to kernel to
186 * identify that it is a XPG4_2 application. No
187 * applications need to know about this flag.
189 #define MSG_XPG4 0x08
190 #endif
192 #ifdef _KERNEL
195 * Additional private flags for kstrgetmsg and kstrputmsg.
196 * These must be bit-wise distinct from the above MSG flags.
198 #define MSG_IPEEK 0x10 /* Peek - don't remove the message */
199 #define MSG_DISCARDTAIL 0x20 /* Discard tail if it doesn't fit */
200 #define MSG_HOLDSIG 0x40 /* Ignore signals. */
201 #define MSG_IGNERROR 0x80 /* Ignore stream head errors */
202 #define MSG_DELAYERROR 0x100 /* Delay error check until we sleep */
203 #define MSG_IGNFLOW 0x200 /* Ignore flow control */
204 #define MSG_NOMARK 0x400 /* Do not read if message is marked */
206 #endif /* _KERNEL */
209 * Flags returned as value of getmsg() and getpmsg() syscall.
211 #define MORECTL 1 /* more ctl info is left in message */
212 #define MOREDATA 2 /* more data is left in message */
215 * Define to indicate that all multiplexors beneath a stream should
216 * be unlinked.
218 #define MUXID_ALL (-1)
221 * Flag definitions for the I_ATMARK ioctl.
223 #define ANYMARK 0x01
224 #define LASTMARK 0x02
227 * Stream Ioctl defines
229 #define STR ('S'<<8)
230 /* (STR|000) in use */
231 #define I_NREAD (STR|01)
232 #define I_PUSH (STR|02)
233 #define I_POP (STR|03)
234 #define I_LOOK (STR|04)
235 #define I_FLUSH (STR|05)
236 #define I_SRDOPT (STR|06)
237 #define I_GRDOPT (STR|07)
238 #define I_STR (STR|010)
239 #define I_SETSIG (STR|011)
240 #define I_GETSIG (STR|012)
241 #define I_FIND (STR|013)
242 #define I_LINK (STR|014)
243 #define I_UNLINK (STR|015)
244 /* (STR|016) in use */
245 #define I_PEEK (STR|017)
246 #define I_FDINSERT (STR|020)
247 #define I_SENDFD (STR|021)
249 #if defined(_KERNEL)
250 #define I_RECVFD (STR|022)
251 #define I_E_RECVFD (STR|016)
252 #else /* user level definition */
253 #define I_RECVFD (STR|016) /* maps to kernel I_E_RECVFD */
254 #endif /* defined(_KERNEL) */
256 #define I_SWROPT (STR|023)
257 #define I_GWROPT (STR|024)
258 #define I_LIST (STR|025)
259 #define I_PLINK (STR|026)
260 #define I_PUNLINK (STR|027)
261 #define I_ANCHOR (STR|030)
262 #define I_FLUSHBAND (STR|034)
263 #define I_CKBAND (STR|035)
264 #define I_GETBAND (STR|036)
265 #define I_ATMARK (STR|037)
266 #define I_SETCLTIME (STR|040)
267 #define I_GETCLTIME (STR|041)
268 #define I_CANPUT (STR|042)
269 #define I_SERROPT (STR|043)
270 #define I_GERROPT (STR|044)
271 #define I_ESETSIG (STR|045)
272 #define I_EGETSIG (STR|046)
274 #define __I_PUSH_NOCTTY (STR|047) /* push module, no cntrl tty */
277 * IOCTLs (STR|050) - (STR|055) are available for use.
280 #define _I_MUXID2FD (STR|056) /* Private: get a fd from a muxid */
281 #define _I_INSERT (STR|057) /* Private: insert a module */
282 #define _I_REMOVE (STR|060) /* Private: remove a module */
283 #define _I_GETPEERCRED (STR|061) /* Private: get peer cred */
284 #define _I_PLINK_LH (STR|062) /* Private: Layered Driver ioctl */
285 #define _I_CMD (STR|063) /* Private: send ioctl via M_CMD */
288 * User level ioctl format for ioctls that go downstream (I_STR)
290 struct strioctl {
291 int ic_cmd; /* command */
292 int ic_timout; /* timeout value */
293 int ic_len; /* length of data */
294 char *ic_dp; /* pointer to data */
297 #if defined(_SYSCALL32)
299 struct strioctl32 {
300 int32_t ic_cmd; /* command */
301 int32_t ic_timout; /* timeout value */
302 int32_t ic_len; /* length of data */
303 caddr32_t ic_dp; /* pointer to data */
306 #endif /* _SYSCALL32 */
309 * Value for timeouts (ioctl, select) that denotes infinity
311 #define _INFTIM -1
312 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
313 #define INFTIM _INFTIM
314 #endif
316 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
318 * For _I_CMD: similar to strioctl, but with included buffer (to avoid copyin/
319 * copyout from another address space). NOTE: the size of this structure must
320 * be less than libproc.h`MAXARGL for pr_ioctl() to handle it.
322 #define STRCMDBUFSIZE 2048
323 typedef struct strcmd {
324 int sc_cmd; /* ioctl command */
325 int sc_timeout; /* timeout value (in seconds) */
326 int sc_len; /* length of data */
327 int sc_pad;
328 char sc_buf[STRCMDBUFSIZE]; /* data buffer */
329 } strcmd_t;
330 #endif
333 * Stream buffer structure for putmsg and getmsg system calls
335 struct strbuf {
336 int maxlen; /* no. of bytes in buffer */
337 int len; /* no. of bytes returned */
338 caddr_t buf; /* pointer to data */
341 #if defined(_SYSCALL32)
343 struct strbuf32 {
344 int32_t maxlen; /* no. of bytes in buffer */
345 int32_t len; /* no. of bytes returned */
346 caddr32_t buf; /* pointer to data */
348 #endif /* _SYSCALL32 */
351 * Stream I_PEEK ioctl format
353 struct strpeek {
354 struct strbuf ctlbuf;
355 struct strbuf databuf;
356 t_uscalar_t flags;
359 #if defined(_SYSCALL32)
361 struct strpeek32 {
362 struct strbuf32 ctlbuf;
363 struct strbuf32 databuf;
364 uint32_t flags;
367 #endif /* _SYSCALL32 */
370 * Stream I_FDINSERT ioctl format
372 struct strfdinsert {
373 struct strbuf ctlbuf;
374 struct strbuf databuf;
375 t_uscalar_t flags;
376 int fildes;
377 int offset;
380 #if defined(_SYSCALL32)
382 struct strfdinsert32 {
383 struct strbuf32 ctlbuf;
384 struct strbuf32 databuf;
385 uint32_t flags;
386 int32_t fildes;
387 int32_t offset;
390 #endif /* _SYSCALL32 */
393 * Receive file descriptor structure
395 #if defined(_KERNEL)
397 struct o_strrecvfd { /* SVR3 syscall structure */
398 int fd;
399 o_uid_t uid; /* always ushort */
400 o_gid_t gid;
401 char fill[8];
405 * Although EFT is enabled in the kernel we kept the following definition
406 * to support an EFT application on a 4.0 non-EFT system.
408 struct k_strrecvfd { /* SVR4 expanded syscall interface structure */
409 struct file *fp;
410 uid_t uid;
411 gid_t gid;
412 char fill[8];
416 * Private _I_GETPEERCRED data.
419 typedef struct k_peercred {
420 cred_t *pc_cr;
421 pid_t pc_cpid;
422 } k_peercred_t;
424 #endif /* defined(_KERNEL) */
426 struct strrecvfd {
427 int fd;
428 uid_t uid;
429 gid_t gid;
430 #if defined(_XPG4_2)
431 char __fill[8];
432 #else
433 char fill[8];
434 #endif
439 * For I_LIST ioctl.
441 struct str_mlist {
442 char l_name[FMNAMESZ+1];
445 struct str_list {
446 int sl_nmods;
447 struct str_mlist *sl_modlist;
450 #if defined(_SYSCALL32)
452 struct str_list32 {
453 int32_t sl_nmods;
454 caddr32_t sl_modlist;
457 #endif /* _SYSCALL32 */
459 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
461 * Private, for _I_INSERT/_I_REMOVE ioctl.
463 struct strmodconf {
464 int pos; /* Position to be inserted/removed. */
465 caddr_t mod_name; /* Name of module. */
468 #if defined(_SYSCALL32)
470 struct strmodconf32 {
471 int32_t pos;
472 caddr32_t mod_name;
475 #endif /* _SYSCALL32 */
476 #endif /* (_XPG4_2) || defined(__EXTENSIONS__) */
479 * For I_FLUSHBAND ioctl. Describes the priority
480 * band for which the operation applies.
482 struct bandinfo {
483 unsigned char bi_pri;
484 int bi_flag;
489 * The argument for I_ESETSIG and I_EGETSIG ioctls.
491 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
492 struct strsigset {
493 pid_t ss_pid; /* pgrp if negative */
494 int ss_events; /* S_ events */
496 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */
498 #ifdef _XPG4_2
499 #ifdef __PRAGMA_REDEFINE_EXTNAME
501 #pragma redefine_extname putmsg __xpg4_putmsg
502 #pragma redefine_extname putpmsg __xpg4_putpmsg
504 #else /* __PRAGMA_REDEFINE_EXTNAME */
506 #define putmsg __xpg4_putmsg
507 #define putpmsg __xpg4_putpmsg
509 #endif /* __PRAGMA_REDEFINE_EXTNAME */
510 #endif /* _XPG4_2 */
512 #ifdef __cplusplus
514 #endif
516 #endif /* _SYS_STROPTS_H */