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
43extern "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 */
290struct 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
299struct 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
323typedef 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 */
335struct 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
343struct 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 */
353struct strpeek {
354	struct strbuf	ctlbuf;
355	struct strbuf	databuf;
356	t_uscalar_t	flags;
357};
358
359#if defined(_SYSCALL32)
360
361struct 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 */
372struct 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
382struct 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
397struct 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 */
408struct 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
419typedef struct k_peercred {
420	cred_t	*pc_cr;
421	pid_t	pc_cpid;
422} k_peercred_t;
423
424#endif	/* defined(_KERNEL) */
425
426struct 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 */
441struct str_mlist {
442	char l_name[FMNAMESZ+1];
443};
444
445struct str_list {
446	int sl_nmods;
447	struct str_mlist *sl_modlist;
448};
449
450#if defined(_SYSCALL32)
451
452struct 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 */
463struct strmodconf {
464	int	pos;			/* Position to be inserted/removed. */
465	caddr_t	mod_name;		/* Name of module. */
466};
467
468#if defined(_SYSCALL32)
469
470struct 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 */
482struct 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__)
492struct 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