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