xref: /illumos-gate/usr/src/uts/common/sys/stropts.h (revision 75eba5b6d79ed4d2ce3daf7b2806306b6b69a938)
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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
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.
12  *
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]
18  *
19  * CDDL HEADER END
20  */
21 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
22 /*	  All Rights Reserved  	*/
23 
24 
25 /*
26  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
27  * Use is subject to license terms.
28  */
29 
30 #ifndef _SYS_STROPTS_H
31 #define	_SYS_STROPTS_H
32 
33 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 11.20	*/
34 
35 #include <sys/feature_tests.h>
36 #include <sys/types.h>
37 /*
38  * For FMNAMESZ define.
39  */
40 #include <sys/conf.h>
41 
42 #ifdef	__cplusplus
43 extern "C" {
44 #endif
45 
46 /*
47  * Write options
48  */
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 */
52 
53 /*
54  * Read options
55  */
56 #define	RNORM		0x000		/* read msg norm */
57 #define	RMSGD		0x001		/* read msg discard */
58 #define	RMSGN		0x002		/* read msg no discard */
59 
60 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
61 #define	RMODEMASK	0x003		/* all above bits */
62 #endif
63 
64 /*
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.
76  */
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
81 
82 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
83 #define	RPROTMASK	0x01c		/* all RPROT bits */
84 
85 /*
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.
89  */
90 #define	RFLUSHMASK	0x020		/* all RFLUSH bits */
91 
92 #define	RFLUSHPCPROT	0x020		/* do not flush PCPROTOs */
93 
94 #endif
95 
96 /*
97  * Error options
98  */
99 
100 /*
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.
108  */
109 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
110 #define	RERRNORM	0x001		/* Normal, persistent read errors */
111 #define	RERRNONPERSIST	0x002		/* Nonpersistent read errors */
112 
113 #define	RERRMASK	(RERRNORM|RERRNONPERSIST)
114 
115 #define	WERRNORM	0x004		/* Normal, persistent write errors */
116 #define	WERRNONPERSIST	0x008		/* Nonpersistent write errors */
117 
118 #define	WERRMASK	(WERRNORM|WERRNONPERSIST)
119 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */
120 
121 /*
122  * Flush options
123  */
124 
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 */
130 /*
131  * Copy options for M_SETOPS/SO_COPYOPT
132  */
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__) */
139 
140 /*
141  * Events for which the SIGPOLL signal is to be sent.
142  */
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 */
155 
156 /*
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.
163  *
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.
167  */
168 
169 #define	RS_HIPRI	0x01		/* send/recv high priority message */
170 #define	STRUIO_POSTPONE	0x08		/* postpone copyin() for struio() */
171 
172 /*
173  * Flags for getpmsg() and putpmsg() syscall arguments.
174  */
175 
176 /*
177  * These are settable by the user and will be set on return
178  * to indicate the priority of message received.
179  */
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__)
184 /*
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.
188  */
189 #define	MSG_XPG4	0x08
190 #endif
191 
192 #ifdef _KERNEL
193 
194 /*
195  * Additional private flags for kstrgetmsg and kstrputmsg.
196  * These must be bit-wise distinct from the above MSG flags.
197  */
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 */
205 
206 #endif /* _KERNEL */
207 
208 /*
209  * Flags returned as value of getmsg() and getpmsg() syscall.
210  */
211 #define	MORECTL		1		/* more ctl info is left in message */
212 #define	MOREDATA	2		/* more data is left in message */
213 
214 /*
215  * Define to indicate that all multiplexors beneath a stream should
216  * be unlinked.
217  */
218 #define	MUXID_ALL	(-1)
219 
220 /*
221  * Flag definitions for the I_ATMARK ioctl.
222  */
223 #define	ANYMARK		0x01
224 #define	LASTMARK	0x02
225 
226 /*
227  *  Stream Ioctl defines
228  */
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)
248 
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) */
255 
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)
273 
274 #define	__I_PUSH_NOCTTY	(STR|047)	/* push module, no cntrl tty */
275 
276 /*
277  * IOCTLs (STR|050) - (STR|055) are available for use.
278  */
279 
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 */
286 
287 /*
288  * User level ioctl format for ioctls that go downstream (I_STR)
289  */
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 */
295 };
296 
297 #if defined(_SYSCALL32)
298 
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 */
304 };
305 
306 #endif /* _SYSCALL32 */
307 
308 /*
309  * Value for timeouts (ioctl, select) that denotes infinity
310  */
311 #define	_INFTIM		-1
312 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
313 #define	INFTIM		_INFTIM
314 #endif
315 
316 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
317 /*
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.
321  */
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
331 
332 /*
333  * Stream buffer structure for putmsg and getmsg system calls
334  */
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 */
339 };
340 
341 #if defined(_SYSCALL32)
342 
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 */
347 };
348 #endif /* _SYSCALL32 */
349 
350 /*
351  * Stream I_PEEK ioctl format
352  */
353 struct strpeek {
354 	struct strbuf	ctlbuf;
355 	struct strbuf	databuf;
356 	t_uscalar_t	flags;
357 };
358 
359 #if defined(_SYSCALL32)
360 
361 struct strpeek32 {
362 	struct strbuf32	ctlbuf;
363 	struct strbuf32	databuf;
364 	uint32_t	flags;
365 };
366 
367 #endif /* _SYSCALL32 */
368 
369 /*
370  * Stream I_FDINSERT ioctl format
371  */
372 struct strfdinsert {
373 	struct strbuf	ctlbuf;
374 	struct strbuf	databuf;
375 	t_uscalar_t	flags;
376 	int		fildes;
377 	int		offset;
378 };
379 
380 #if defined(_SYSCALL32)
381 
382 struct strfdinsert32 {
383 	struct strbuf32	ctlbuf;
384 	struct strbuf32	databuf;
385 	uint32_t	flags;
386 	int32_t		fildes;
387 	int32_t		offset;
388 };
389 
390 #endif /* _SYSCALL32 */
391 
392 /*
393  * Receive file descriptor structure
394  */
395 #if defined(_KERNEL)
396 
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];
402 };
403 
404 /*
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.
407  */
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];
413 };
414 
415 /*
416  * Private _I_GETPEERCRED data.
417  */
418 
419 typedef struct k_peercred {
420 	cred_t	*pc_cr;
421 	pid_t	pc_cpid;
422 } k_peercred_t;
423 
424 #endif	/* defined(_KERNEL) */
425 
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
435 };
436 
437 
438 /*
439  * For I_LIST ioctl.
440  */
441 struct str_mlist {
442 	char l_name[FMNAMESZ+1];
443 };
444 
445 struct str_list {
446 	int sl_nmods;
447 	struct str_mlist *sl_modlist;
448 };
449 
450 #if defined(_SYSCALL32)
451 
452 struct str_list32 {
453 	int32_t 	sl_nmods;
454 	caddr32_t 	sl_modlist;
455 };
456 
457 #endif /* _SYSCALL32 */
458 
459 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
460 /*
461  * Private, for _I_INSERT/_I_REMOVE ioctl.
462  */
463 struct strmodconf {
464 	int	pos;			/* Position to be inserted/removed. */
465 	caddr_t	mod_name;		/* Name of module. */
466 };
467 
468 #if defined(_SYSCALL32)
469 
470 struct strmodconf32 {
471 	int32_t		pos;
472 	caddr32_t	mod_name;
473 };
474 
475 #endif /* _SYSCALL32 */
476 #endif /* (_XPG4_2) || defined(__EXTENSIONS__) */
477 
478 /*
479  * For I_FLUSHBAND ioctl.  Describes the priority
480  * band for which the operation applies.
481  */
482 struct bandinfo {
483 	unsigned char	bi_pri;
484 	int		bi_flag;
485 };
486 
487 
488 /*
489  * The argument for I_ESETSIG and I_EGETSIG ioctls.
490  */
491 #if !defined(_XPG4_2) || defined(__EXTENSIONS__)
492 struct strsigset {
493 	pid_t		ss_pid;		/* pgrp if negative */
494 	int		ss_events;	/* S_ events */
495 };
496 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */
497 
498 #ifdef	_XPG4_2
499 #ifdef	__PRAGMA_REDEFINE_EXTNAME
500 
501 #pragma	redefine_extname putmsg		__xpg4_putmsg
502 #pragma	redefine_extname putpmsg	__xpg4_putpmsg
503 
504 #else	/* __PRAGMA_REDEFINE_EXTNAME */
505 
506 #define	putmsg	__xpg4_putmsg
507 #define	putpmsg	__xpg4_putpmsg
508 
509 #endif	/* __PRAGMA_REDEFINE_EXTNAME */
510 #endif	/* _XPG4_2 */
511 
512 #ifdef	__cplusplus
513 }
514 #endif
515 
516 #endif	/* _SYS_STROPTS_H */
517