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 2005 Sun Microsystems, Inc. All rights reserved. 28 * Use is subject to license terms. 29 */ 30 31 #ifndef _SYS_STROPTS_H 32 #define _SYS_STROPTS_H 33 34 #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 11.20 */ 35 36 #include <sys/feature_tests.h> 37 #include <sys/types.h> 38 /* 39 * For FMNAMESZ define. 40 */ 41 #include <sys/conf.h> 42 43 #ifdef __cplusplus 44 extern "C" { 45 #endif 46 47 /* 48 * Write options 49 */ 50 #define SNDZERO 0x001 /* send a zero length message */ 51 #define SNDPIPE 0x002 /* send SIGPIPE on write and */ 52 /* putmsg if sd_werror is set */ 53 54 /* 55 * Read options 56 */ 57 #define RNORM 0x000 /* read msg norm */ 58 #define RMSGD 0x001 /* read msg discard */ 59 #define RMSGN 0x002 /* read msg no discard */ 60 61 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 62 #define RMODEMASK 0x003 /* all above bits */ 63 #endif 64 65 /* 66 * These next three read options are added for the sake of 67 * user-level transparency. RPROTDAT will cause the stream head 68 * to treat the contents of M_PROTO and M_PCPROTO message blocks 69 * as data. RPROTDIS will prevent the stream head from failing 70 * a read with EBADMSG if an M_PROTO or M_PCPROTO message is on 71 * the front of the stream head read queue. Rather, the protocol 72 * blocks will be silently discarded and the data associated with 73 * the message (in linked M_DATA blocks), if any, will be delivered 74 * to the user. RPROTNORM sets the default behavior, where read 75 * will fail with EBADMSG if an M_PROTO or M_PCPROTO are at the 76 * stream head. 77 */ 78 #define RPROTDAT 0x004 /* read protocol messages as data */ 79 #define RPROTDIS 0x008 /* discard protocol messages, but */ 80 /* read data portion */ 81 #define RPROTNORM 0x010 82 83 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 84 #define RPROTMASK 0x01c /* all RPROT bits */ 85 86 /* 87 * The next read option is used so that a TPI aware module can tell the 88 * stream head to not flush M_PCPROTO messages when processing a read side 89 * flush. This will avoid problems where a flush removes a T_OK_ACK. 90 */ 91 #define RFLUSHMASK 0x020 /* all RFLUSH bits */ 92 93 #define RFLUSHPCPROT 0x020 /* do not flush PCPROTOs */ 94 95 #endif 96 97 /* 98 * Error options 99 */ 100 101 /* 102 * Error options to adjust the stream head error behavior with respect 103 * to M_ERROR message for read and write side errors respectively. 104 * The normal case is that the read/write side error is 105 * persistent and these options allow the application or streams module/driver 106 * to specify that errors are nonpersistent. In this case the error is cleared 107 * after having been returned to read(), getmsg(), ioctl(), write(), putmsg(), 108 * etc. 109 */ 110 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 111 #define RERRNORM 0x001 /* Normal, persistent read errors */ 112 #define RERRNONPERSIST 0x002 /* Nonpersistent read errors */ 113 114 #define RERRMASK (RERRNORM|RERRNONPERSIST) 115 116 #define WERRNORM 0x004 /* Normal, persistent write errors */ 117 #define WERRNONPERSIST 0x008 /* Nonpersistent write errors */ 118 119 #define WERRMASK (WERRNORM|WERRNONPERSIST) 120 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 121 122 /* 123 * Flush options 124 */ 125 126 #define FLUSHR 0x01 /* flush read queue */ 127 #define FLUSHW 0x02 /* flush write queue */ 128 #define FLUSHRW 0x03 /* flush both queues */ 129 #define FLUSHBAND 0x04 /* flush only band specified */ 130 /* in next byte */ 131 /* 132 * Copy options for M_SETOPS/SO_COPYOPT 133 */ 134 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 135 #define ZCVMSAFE 0x01 /* safe to borrow file (segmapped) */ 136 /* pages instead of bcopy */ 137 #define ZCVMUNSAFE 0x02 /* unsafe to borrow file pages */ 138 #define COPYCACHED 0x04 /* copy should NOT bypass cache */ 139 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 140 141 /* 142 * Events for which the SIGPOLL signal is to be sent. 143 */ 144 #define S_INPUT 0x0001 /* any msg but hipri on read Q */ 145 #define S_HIPRI 0x0002 /* high priority msg on read Q */ 146 #define S_OUTPUT 0x0004 /* write Q no longer full */ 147 #define S_MSG 0x0008 /* signal msg at front of read Q */ 148 #define S_ERROR 0x0010 /* error msg arrived at stream head */ 149 #define S_HANGUP 0x0020 /* hangup msg arrived at stream head */ 150 #define S_RDNORM 0x0040 /* normal msg on read Q */ 151 #define S_WRNORM S_OUTPUT 152 #define S_RDBAND 0x0080 /* out of band msg on read Q */ 153 #define S_WRBAND 0x0100 /* can write out of band */ 154 #define S_BANDURG 0x0200 /* modifier to S_RDBAND, to generate */ 155 /* SIGURG instead of SIGPOLL */ 156 157 /* 158 * Flags for getmsg() and putmsg() syscall arguments. 159 * "RS" stands for recv/send. The system calls were originally called 160 * recv() and send(), but were renamed to avoid confusion with the BSD 161 * calls of the same name. A value of zero will cause getmsg() to return 162 * the first message on the stream head read queue and putmsg() to send 163 * a normal priority message. 164 * 165 * Flags for strmakemsg() arguments (should define strmakemsg() flags). 166 * Used to determine the message type of the control part of a message, 167 * if RS_HIPRI, M_PCPROTO, else M_PROTO. 168 */ 169 170 #define RS_HIPRI 0x01 /* send/recv high priority message */ 171 #define STRUIO_POSTPONE 0x08 /* postpone copyin() for struio() */ 172 173 /* 174 * Flags for getpmsg() and putpmsg() syscall arguments. 175 */ 176 177 /* 178 * These are settable by the user and will be set on return 179 * to indicate the priority of message received. 180 */ 181 #define MSG_HIPRI 0x01 /* send/recv high priority message */ 182 #define MSG_ANY 0x02 /* recv any messages */ 183 #define MSG_BAND 0x04 /* recv messages from specified band */ 184 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 185 /* 186 * This is a private flag passed by libc to kernel to 187 * identify that it is a XPG4_2 application. No 188 * applications need to know about this flag. 189 */ 190 #define MSG_XPG4 0x08 191 #endif 192 193 #ifdef _KERNEL 194 195 /* 196 * Additional private flags for kstrgetmsg and kstrputmsg. 197 * These must be bit-wise distinct from the above MSG flags. 198 */ 199 #define MSG_IPEEK 0x10 /* Peek - don't remove the message */ 200 #define MSG_DISCARDTAIL 0x20 /* Discard tail if it doesn't fit */ 201 #define MSG_HOLDSIG 0x40 /* Ignore signals. */ 202 #define MSG_IGNERROR 0x80 /* Ignore stream head errors */ 203 #define MSG_DELAYERROR 0x100 /* Delay error check until we sleep */ 204 #define MSG_IGNFLOW 0x200 /* Ignore flow control */ 205 #define MSG_NOMARK 0x400 /* Do not read if message is marked */ 206 207 #endif /* _KERNEL */ 208 209 /* 210 * Flags returned as value of getmsg() and getpmsg() syscall. 211 */ 212 #define MORECTL 1 /* more ctl info is left in message */ 213 #define MOREDATA 2 /* more data is left in message */ 214 215 /* 216 * Define to indicate that all multiplexors beneath a stream should 217 * be unlinked. 218 */ 219 #define MUXID_ALL (-1) 220 221 /* 222 * Flag definitions for the I_ATMARK ioctl. 223 */ 224 #define ANYMARK 0x01 225 #define LASTMARK 0x02 226 227 /* 228 * Stream Ioctl defines 229 */ 230 #define STR ('S'<<8) 231 /* (STR|000) in use */ 232 #define I_NREAD (STR|01) 233 #define I_PUSH (STR|02) 234 #define I_POP (STR|03) 235 #define I_LOOK (STR|04) 236 #define I_FLUSH (STR|05) 237 #define I_SRDOPT (STR|06) 238 #define I_GRDOPT (STR|07) 239 #define I_STR (STR|010) 240 #define I_SETSIG (STR|011) 241 #define I_GETSIG (STR|012) 242 #define I_FIND (STR|013) 243 #define I_LINK (STR|014) 244 #define I_UNLINK (STR|015) 245 /* (STR|016) in use */ 246 #define I_PEEK (STR|017) 247 #define I_FDINSERT (STR|020) 248 #define I_SENDFD (STR|021) 249 250 #if defined(_KERNEL) 251 #define I_RECVFD (STR|022) 252 #define I_E_RECVFD (STR|016) 253 #else /* user level definition */ 254 #define I_RECVFD (STR|016) /* maps to kernel I_E_RECVFD */ 255 #endif /* defined(_KERNEL) */ 256 257 #define I_SWROPT (STR|023) 258 #define I_GWROPT (STR|024) 259 #define I_LIST (STR|025) 260 #define I_PLINK (STR|026) 261 #define I_PUNLINK (STR|027) 262 #define I_ANCHOR (STR|030) 263 #define I_FLUSHBAND (STR|034) 264 #define I_CKBAND (STR|035) 265 #define I_GETBAND (STR|036) 266 #define I_ATMARK (STR|037) 267 #define I_SETCLTIME (STR|040) 268 #define I_GETCLTIME (STR|041) 269 #define I_CANPUT (STR|042) 270 #define I_SERROPT (STR|043) 271 #define I_GERROPT (STR|044) 272 #define I_ESETSIG (STR|045) 273 #define I_EGETSIG (STR|046) 274 275 #define __I_PUSH_NOCTTY (STR|047) /* push module, no cntrl tty */ 276 277 /* 278 * IOCTLs (STR|050) - (STR|055) are available for use. 279 */ 280 281 #define _I_MUXID2FD (STR|056) /* Private, get a fd from a muxid */ 282 #define _I_INSERT (STR|057) /* Private, insert a module */ 283 #define _I_REMOVE (STR|060) /* Private, remove a module */ 284 285 #define _I_GETPEERCRED (STR|061) /* Private, get peer cred */ 286 287 /* Private Layered Driver ioctl's */ 288 #define _I_PLINK_LH (STR|062) 289 290 /* 291 * User level ioctl format for ioctls that go downstream (I_STR) 292 */ 293 struct strioctl { 294 int ic_cmd; /* command */ 295 int ic_timout; /* timeout value */ 296 int ic_len; /* length of data */ 297 char *ic_dp; /* pointer to data */ 298 }; 299 300 #if defined(_SYSCALL32) 301 302 struct strioctl32 { 303 int32_t ic_cmd; /* command */ 304 int32_t ic_timout; /* timeout value */ 305 int32_t ic_len; /* length of data */ 306 caddr32_t ic_dp; /* pointer to data */ 307 }; 308 309 #endif /* _SYSCALL32 */ 310 311 /* 312 * Value for timeouts (ioctl, select) that denotes infinity 313 */ 314 #define _INFTIM -1 315 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 316 #define INFTIM _INFTIM 317 #endif 318 319 /* 320 * Stream buffer structure for putmsg and getmsg system calls 321 */ 322 struct strbuf { 323 int maxlen; /* no. of bytes in buffer */ 324 int len; /* no. of bytes returned */ 325 caddr_t buf; /* pointer to data */ 326 }; 327 328 #if defined(_SYSCALL32) 329 330 struct strbuf32 { 331 int32_t maxlen; /* no. of bytes in buffer */ 332 int32_t len; /* no. of bytes returned */ 333 caddr32_t buf; /* pointer to data */ 334 }; 335 #endif /* _SYSCALL32 */ 336 337 /* 338 * Stream I_PEEK ioctl format 339 */ 340 struct strpeek { 341 struct strbuf ctlbuf; 342 struct strbuf databuf; 343 t_uscalar_t flags; 344 }; 345 346 #if defined(_SYSCALL32) 347 348 struct strpeek32 { 349 struct strbuf32 ctlbuf; 350 struct strbuf32 databuf; 351 uint32_t flags; 352 }; 353 354 #endif /* _SYSCALL32 */ 355 356 /* 357 * Stream I_FDINSERT ioctl format 358 */ 359 struct strfdinsert { 360 struct strbuf ctlbuf; 361 struct strbuf databuf; 362 t_uscalar_t flags; 363 int fildes; 364 int offset; 365 }; 366 367 #if defined(_SYSCALL32) 368 369 struct strfdinsert32 { 370 struct strbuf32 ctlbuf; 371 struct strbuf32 databuf; 372 uint32_t flags; 373 int32_t fildes; 374 int32_t offset; 375 }; 376 377 #endif /* _SYSCALL32 */ 378 379 /* 380 * Receive file descriptor structure 381 */ 382 #if defined(_KERNEL) 383 384 struct o_strrecvfd { /* SVR3 syscall structure */ 385 int fd; 386 o_uid_t uid; /* always ushort */ 387 o_gid_t gid; 388 char fill[8]; 389 }; 390 391 /* 392 * Although EFT is enabled in the kernel we kept the following definition 393 * to support an EFT application on a 4.0 non-EFT system. 394 */ 395 struct k_strrecvfd { /* SVR4 expanded syscall interface structure */ 396 struct file *fp; 397 uid_t uid; 398 gid_t gid; 399 char fill[8]; 400 }; 401 402 /* 403 * Private _I_GETPEERCRED data. 404 */ 405 406 typedef struct k_peercred { 407 cred_t *pc_cr; 408 pid_t pc_cpid; 409 } k_peercred_t; 410 411 #endif /* defined(_KERNEL) */ 412 413 struct strrecvfd { 414 int fd; 415 uid_t uid; 416 gid_t gid; 417 #if defined(_XPG4_2) 418 char __fill[8]; 419 #else 420 char fill[8]; 421 #endif 422 }; 423 424 425 /* 426 * For I_LIST ioctl. 427 */ 428 struct str_mlist { 429 char l_name[FMNAMESZ+1]; 430 }; 431 432 struct str_list { 433 int sl_nmods; 434 struct str_mlist *sl_modlist; 435 }; 436 437 #if defined(_SYSCALL32) 438 439 struct str_list32 { 440 int32_t sl_nmods; 441 caddr32_t sl_modlist; 442 }; 443 444 #endif /* _SYSCALL32 */ 445 446 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 447 /* 448 * Private, for _I_INSERT/_I_REMOVE ioctl. 449 */ 450 struct strmodconf { 451 int pos; /* Position to be inserted/removed. */ 452 caddr_t mod_name; /* Name of module. */ 453 }; 454 455 #if defined(_SYSCALL32) 456 457 struct strmodconf32 { 458 int32_t pos; 459 caddr32_t mod_name; 460 }; 461 462 #endif /* _SYSCALL32 */ 463 #endif /* (_XPG4_2) || defined(__EXTENSIONS__) */ 464 465 /* 466 * For I_FLUSHBAND ioctl. Describes the priority 467 * band for which the operation applies. 468 */ 469 struct bandinfo { 470 unsigned char bi_pri; 471 int bi_flag; 472 }; 473 474 475 /* 476 * The argument for I_ESETSIG and I_EGETSIG ioctls. 477 */ 478 #if !defined(_XPG4_2) || defined(__EXTENSIONS__) 479 struct strsigset { 480 pid_t ss_pid; /* pgrp if negative */ 481 int ss_events; /* S_ events */ 482 }; 483 #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ 484 485 #ifdef _XPG4_2 486 #ifdef __PRAGMA_REDEFINE_EXTNAME 487 488 #pragma redefine_extname putmsg __xpg4_putmsg 489 #pragma redefine_extname putpmsg __xpg4_putpmsg 490 491 #else /* __PRAGMA_REDEFINE_EXTNAME */ 492 493 #define putmsg __xpg4_putmsg 494 #define putpmsg __xpg4_putpmsg 495 496 #endif /* __PRAGMA_REDEFINE_EXTNAME */ 497 #endif /* _XPG4_2 */ 498 499 #ifdef __cplusplus 500 } 501 #endif 502 503 #endif /* _SYS_STROPTS_H */ 504