diff options
Diffstat (limited to 'usr/src/man/man4i/streamio.4i')
-rw-r--r-- | usr/src/man/man4i/streamio.4i | 1550 |
1 files changed, 1550 insertions, 0 deletions
diff --git a/usr/src/man/man4i/streamio.4i b/usr/src/man/man4i/streamio.4i new file mode 100644 index 0000000000..4e99ba3dfe --- /dev/null +++ b/usr/src/man/man4i/streamio.4i @@ -0,0 +1,1550 @@ +.\" Copyright (c) 2017, Joyent, Inc. +.\" Copyright (c) 2009, Sun Microsystems, Inc. All Rights Reserved. +.\" Copyright 1989 AT&T +.\" The contents of this file are subject to the terms of the +.\" Common Development and Distribution License (the "License"). +.\" You may not use this file except in compliance with the License. +.\" +.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +.\" or http://www.opensolaris.org/os/licensing. +.\" See the License for the specific language governing permissions +.\" and limitations under the License. +.\" +.\" When distributing Covered Code, include this CDDL HEADER in each +.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. +.\" If applicable, add the following below this CDDL HEADER, with the +.\" fields enclosed by brackets "[]" replaced with your own identifying +.\" information: Portions Copyright [yyyy] [name of copyright owner] +.Dd October 29, 2017 +.Dt STREAMIO 4I +.Os +.Sh NAME +.Nm streamio +.Nd STREAMS ioctl commands +.Sh SYNOPSIS +.In sys/types.h +.In stropts.h +.In sys/conf.h +.Ft int +.Fo ioctl +.Fa "int fildes" +.Fa "int command" +.Fa "\&... /*arg*/" +.Fc +.Sh DESCRIPTION +STREAMS (see +.Xr Intro 3 ) +.Fn ioctl +commands are a subset of the +.Xr ioctl 2 +commands and perform a variety of control functions on streams. +.Pp +The +.Fa fildes +argument is an open file descriptor that refers to a stream. +The +.Fa command +argument determines the control function to be performed as +described below. +The +.Fa arg +argument represents additional information that +is needed by this command. +The type of +.Fa arg +depends upon the command, but +it is generally an integer or a pointer to a command-specific data structure. +The +.Fa command +and +.Fa arg +arguments are interpreted by the STREAM head. +Certain combinations of these arguments may be passed to a module or driver in +the stream. +.Pp +Since these STREAMS commands are +.Sy ioctls , +they are subject to the errors described in +.Xr ioctl 2 . +In addition to those errors, the call will fail +with +.Va errno +set to +.Er EINVAL , +without processing a control function, if the STREAM referenced by +.Fa fildes +is linked below a multiplexor, or if +.Fa command +is not a valid value for a stream. +.Pp +Also, as described in +.Xr ioctl 2 , +STREAMS modules and drivers can detect +errors. +In this case, the module or driver sends an error message to the STREAM +head containing an error value. +This causes subsequent calls to fail with +.Va errno +set to this value. +.Sh IOCTLS +The following +.Fn ioctl +commands, with error values indicated, are applicable to all STREAMS files: +.Bl -tag -width I_SETCLTIME +.It Dv I_PUSH +Pushes the module whose name is pointed to by +.Va arg +onto the top of the current stream, just below the STREAM head. +If the STREAM is a pipe, the module +will be inserted between the stream heads of both ends of the pipe. +It then calls the open routine of the newly-pushed module. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width ENOTSUP +.It Er EINVAL +Invalid module name. +.It Er EFAULT +.Va arg +points outside the allocated address space. +.It Er ENXIO +Open routine of new module failed. +.It Er ENXIO +Hangup received on +.Va fildes . +.It Er ENOTSUP +Pushing a module is not supported on this stream. +.El +.It Dv I_POP +Removes the module just below the STREAM head of the STREAM pointed to by +.Fa fildes . +To remove a module from a pipe requires that the module was +pushed on the side it is being removed from. +.Fa arg +should be +.Sy 0 +in an +.Dv I_POP +request. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width ENOTSUP +.It Er EINVAL +No module present in the stream. +.It Er ENXIO +Hangup received on +.Fa fildes . +.It Er EPERM +Attempt to pop through an anchor by an unprivileged process. +.It Er ENOTSUP +Removal is not supported. +.El +.It Dv I_ANCHOR +Positions the stream anchor to be at the stream's module directly below the +stream head. +Once this has been done, only a privileged process may pop modules +below the anchor on the stream. +.Va arg +must be +.Sy 0 +in an +.Dv I_ANCHOR +request. +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EINVAL +.It Er EINVAL +Request to put an anchor on a pipe. +.El +.It Dv I_LOOK +Retrieves the name of the module just below the stream head of the stream +pointed to by +.Fa fildes , +and places it in a null terminated character string +pointed at by +.Fa arg . +The buffer pointed to by +.Fa arg +should be at least +.Dv FMNAMESZ Ns +1 +bytes long. +This requires the declaration +.Ql "#include <sys/conf.h>" . +On failure, +.Dv errno +is set to one of the following values: +.Bl -tag -width EFAULT +.It Er EFAULT +.Fa arg +points outside the allocated address space. +.It Er EINVAL +No module present in stream. +.El +.It Dv I_FLUSH +This request flushes all input and/or output queues, depending on the value of +.Fa arg . +Legal +.Fa arg +values are: +.Bl -tag -width FLUSHRW +.It Dv FLUSHR +Flush read queues. +.It Dv FLUSHW +Flush write queues. +.It Dv FLUSHRW +Flush read and write queues. +.El +.Pp +If a pipe or FIFO does not have any modules pushed, the read queue of the +stream head on either end is flushed depending on the value of +.Fa arg . +.Pp +If +.Dv FLUSHR +is set and +.Fa fildes +is a pipe, the read queue for that end +of the pipe is flushed and the write queue for the other end is flushed. +If +.Fa fildes +is a FIFO, both queues are flushed. +.Pp +If +.Dv FLUSHW +is set and +.Fa fildes +is a pipe and the other end of the pipe +exists, the read queue for the other end of the pipe is flushed and the write +queue for this end is flushed. +If +.Fa fildes +is a FIFO, both queues of the +FIFO are flushed. +.Pp +If +.Dv FLUSHRW +is set, all read queues are flushed, that is, the read queue +for the FIFO and the read queue on both ends of the pipe are flushed. +.Pp +Correct flush handling of a pipe or FIFO with modules pushed is achieved via +the +.Sy pipemod +module. +This module should be the first module pushed onto a +pipe so that it is at the midpoint of the pipe itself. +.Pp +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EINVAL +.It Er ENOSR +Unable to allocate buffers for flush message due to insufficient stream memory +resources. +.It Er EINVAL +Invalid +.Va arg +value. +.It Er ENXIO +Hangup received on +.Fa fildes . +.El +.It Dv I_FLUSHBAND +Flushes a particular band of messages. +.Fa arg +points to a +.Vt bandinfo +structure that has the following members: +.Bd -literal -offset 2n +unsigned char bi_pri; +int bi_flag; +.Ed +.Pp +The +.Fa bi_flag +field may be one of +.Dv FLUSHR , +.Dv FLUSHW , +or +.Dv FLUSHRW +as described earlier. +.It Dv I_SETSIG +Informs the stream head that the user wishes the kernel to issue the +.Dv SIGPOLL +signal (see +.Xr signal 3C ) +when a particular event has occurred on the stream associated with +.Fa fildes . +.Dv I_SETSIG +supports an asynchronous processing capability in streams. +The value of +.Fa arg +is a bitmask that specifies the events for which the user should be signaled. +It is the bitwise OR of any combination of the following constants: +.Bl -tag -width S_BANDURG +.It Dv S_INPUT +Any message other than an +.Dv M_PCPROTO +has arrived on a stream head read queue. +This event is maintained for compatibility with previous releases. +This event is triggered even if the message is of zero length. +.It Dv S_RDNORM +An ordinary (non-priority) message has arrived on a stream head read queue. +This event is triggered even if the message is of zero length. +.It Dv S_RDBAND +A priority band message (band > 0) has arrived on a stream head read queue. +This event is triggered even if the message is of zero length. +.It Dv S_HIPRI +A high priority message is present on the stream head read queue. +This event is triggered even if the message is of zero length. +.It Dv S_OUTPUT +The write queue just below the stream head is no longer full. +This notifies the +user that there is room on the queue for sending (or writing) data downstream. +.It Dv S_WRNORM +This event is the same as +.Dv S_OUTPUT . +.It Dv S_WRBAND +A priority band greater than 0 of a queue downstream exists and is writable. +This notifies the user that there is room on the queue for sending (or writing) +priority data downstream. +.It Dv S_MSG +A STREAMS signal message that contains the +.Dv SIGPOLL +signal has reached the +front of the stream head read queue. +.It Dv S_ERROR +An +.Dv M_ERROR +message has reached the stream head. +.It Dv S_HANGUP +An +.Dv M_HANGUP +message has reached the stream head. +.It Dv S_BANDURG +When used in conjunction with +.Dv S_RDBAND , +.Dv SIGURG +is generated instead of +.Dv SIGPOLL +when a priority message reaches the front of the stream head +read queue. +.El +.Pp +A user process may choose to be signaled only of high priority messages by +setting the +.Fa arg +bitmask to the value +.Dv S_HIPRI . +.Pp +Processes that wish to receive +.Dv SIGPOLL +signals must explicitly register +to receive them using +.Dv I_SETSIG . +If several processes register to receive +this signal for the same event on the same stream, each process will be +signaled when the event occurs. +.Pp +If the value of +.Fa arg +is zero, the calling process will be unregistered and +will not receive further +.Dv SIGPOLL +signals. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EINVAL +.It Sy EINVAL +.Fa arg +value is invalid or +.Fa arg +is zero and process is not registered to receive the +.Dv SIGPOLL +signal. +.It Sy EAGAIN +Allocation of a data structure to store the signal request failed. +.El +.It Dv I_GETSIG +Returns the events for which the calling process is currently registered to be +sent a +.Dv SIGPOLL +signal. +The events are returned as a bitmask pointed to by +.Va arg , +where the events are those specified in the description of +.Dv I_SETSIG +above. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EINVAL +.It Sy EINVAL +Process not registered to receive the +.Dv SIGPOLL +signal. +.It Sy EFAULT +.Fa arg +points outside the allocated address space. +.El +.It Dv I_FIND +Compares the names of all modules currently present in the stream to the name +pointed to by +.Fa arg , +and returns 1 if the named module is present in the stream. +It returns 0 if the named module is not present. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EINVAL +.It Sy EFAULT +.Fa arg +points outside the allocated address space. +.It Sy EINVAL +.Fa arg +does not contain a valid module name. +.El +.It Dv I_PEEK +Allows a user to retrieve the information in the first message on the stream +head read queue without taking the message off the queue. +.Dv I_PEEK +is analogous to +.Xr getmsg 2 +except that it does not remove the message from the queue. +.Fa arg +points to a +.Vt strpeek +structure, which contains the following members: +.Bd -literal -offset 2n +struct strbuf ctlbuf; +struct strbuf databuf; +long flags; +.Ed +.Pp +The +.Ft maxlen +field in the +.Vt ctlbuf +and +.Vt databuf +.Vt strbuf +structures (see +.Xr getmsg 2 ) +must be set to the number of bytes of control +information and/or data information, respectively, to retrieve. +.Fa flags +may be set to +.Dv RS_HIPRI +or +.Sy 0 . +If +.Dv RS_HIPRI +is set, +.Dv I_PEEK +will look for a high priority message on the stream head read queue. +Otherwise, +.Dv I_PEEK +will look for the first message on the stream head read queue. +.Pp +.Dv I_PEEK +returns +.Sy 1 +if a message was retrieved, and returns +.Sy 0 +if no message was found on the stream head read queue. +It does not wait for a message to arrive. +On return, +.Vt ctlbuf +specifies information in the control buffer, +.Vt databuf +specifies information in the data buffer, and +.Fa flags +contains the value +.Dv RS_HIPRI +or +.Sy 0 . +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EBADMSG +.It Er EFAULT +.Fa arg +points, or the buffer area specified in +.Vt ctlbuf +or +.Vt databuf +is, outside the allocated address space. +.It Er EBADMSG +Queued message to be read is not valid for +.Dv I_PEEK . +.It Er EINVAL +Illegal value for +.Vt flags . +.It Er ENOSR +Unable to allocate buffers to perform the +.Dv I_PEEK +due to insufficient STREAMS memory resources. +.El +.It Dv I_SRDOPT +Sets the read mode (see +.Xr read 2 ) +using the value of the argument +.Va arg . +Legal +.Va arg +values are: +.Bl -tag -width RNORM +.It Dv RNORM +Byte-stream mode, the default. +.It Dv RMSGD +Message-discard mode. +.It Dv RMSGN +Message-nondiscard mode. +.El +.Pp +In addition, the stream head's treatment of control messages may be changed by +setting the following flags in +.Va arg : +.Bl -tag -width RPROTNORM +.It Dv RPROTNORM +Reject +.Xr read 2 +with +.Er EBADMSG +if a control message is at the front of the stream head read queue. +.It Dv RPROTDAT +Deliver the control portion of a message as data when a user issues +.Xr read 2 . +This is the default behavior. +.It Dv RPROTDIS +Discard the control portion of a message, delivering any data portion, when a +user issues a +.Xr read 2 . +.El +.Pp +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EINVAL +.It Er EINVAL +.Va arg +is not one of the above legal values, or +.Va arg +is the bitwise +inclusive +.Sy OR +of +.Dv RMSGD +and +.Dv RMSGN . +.El +.It Dv I_GRDOPT +Returns the current read mode setting in an +.Vt int +pointed to by the argument +.Fa arg . +Read modes are described in +.Xr read 2 . +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EFAULT +.It Er EFAULT +.Fa arg +points outside the allocated address space. +.El +.It Dv I_NREAD +Counts the number of data bytes in data blocks in the first message on the +stream head read queue, and places this value in the location pointed to by +.Fa arg . +The return value for the command is the number of messages on the +stream head read queue. +For example, if zero is returned in +.Fa arg , +but the +.Fn ioctl +return value is greater than zero, this indicates that a +zero-length message is next on the queue. +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EFAULT +.It Er EFAULT +.Fa arg +points outside the allocated address space. +.El +.It Dv I_FDINSERT +Creates a message from specified buffer(s), adds information about another +stream and sends the message downstream. +The message contains a control part and an optional data part. +The data and control parts to be sent are +distinguished by placement in separate buffers, as described below. +.Pp +The +.Fa arg +argument points to a +.Vt strfdinsert +structure, which contains +the following members: +.Bd -literal -offset 2n +struct strbuf ctlbuf; +struct strbuf databuf; +t_uscalar_t flags; +int fildes; +int offset; +.Ed +.Pp +The +.Fa len +member in the +.Vt ctlbuf +.Vt strbuf +structure (see +.Xr putmsg 2 ) +must be set to the size of a +.Vt t_uscalar_t +plus the number of bytes of +control information to be sent with the message. +The +.Fa fildes +member specifies the file descriptor of the other stream, and the +.Fa offset +member, which must be suitably aligned for use as a +.Vt t_uscalar_t , +specifies the offset from the start of the control buffer where +.Dv I_FDINSERT +will store a +.Vt t_uscalar_t +whose interpretation is specific to the stream end. +The +.Fa len +member in the +.Vt databuf +.Vt strbuf +structure must be set to the number of bytes of data information to be sent with +the message, or to 0 if no data part is to be sent. +.Pp +The +.Fa flags +member specifies the type of message to be created. +A normal message is created if +.Fa flags +is set to 0, and a high-priority message is created if +.Fa flags +is set to +.Dv RS_HIPRI . +For non-priority messages, +.Dv I_FDINSERT +will block if the stream write queue is full due to internal +flow control conditions. +For priority messages, +.Dv I_FDINSERT +does not block on this condition. +or non-priority messages, +.Dv I_FDINSERT +does not +block when the write queue is full and +.Dv O_NDELAY +or +.Dv O_NONBLOCK +is set. +Instead, it fails and sets +.Va errno +to +.Er EAGAIN . +.Pp +.Dv I_FDINSERT +also blocks, unless prevented by lack of internal resources, waiting for the +availability of message blocks in the stream, regardless of priority or whether +.Dv O_NDELAY +or +.Dv O_NONBLOCK +has been specified. +No partial message is sent. +.Pp +The +.Fn ioctl +function with the +.Dv I_FDINSERT +command will fail if: +.Bl -tag -width EAGAIN +.It Er EAGAIN +A non-priority message is specified, the +.Dv O_NDELAY +or +.Dv O_NONBLOCK +flag is set, and the stream write queue is full due to internal flow control +conditions. +.It Er ENOSR +Buffers can not be allocated for the message that is to be created. +.It Er EFAULT +The +.Fa arg +argument points, or the buffer area specified in +.Vt ctlbuf +or +.Vt databuf +is, outside the allocated address space. +.It Er EINVAL +One of the following: The +.Fa fildes +member of the +.Vt strfdinsert +structure is not a valid, open stream file descriptor; the size of a +.Vt t_uscalar_t +plus +.Fa offset +is greater than the +.Fa len +member for the buffer specified through +.Fa ctlptr ; +the +.Fa offset +member does not specify a properly-aligned location in the data buffer; or an +undefined value is stored in +.Fa flags . +.It Er ENXIO +Hangup received on the +.Fa fildes +argument of the +.Fn ioctl +call or the +.Fa fildes +member of the +.Vt strfdinsert +structure. +.It Er ERANGE +The +.Fa len +field for the buffer specified through +.Vt databuf +does not fall within the range specified by the maximum and minimum packet +sizes of the topmost stream module; or the +.Fa len +member for the buffer specified through +.Vt databuf +is larger than the maximum configured size of the data part of a message; or the +.Fa len +member for the buffer specified through +.Vt ctlbuf +is larger than the maximum configured size of the control part of a message. +.El +.Pp +.Dv I_FDINSERT +can also fail if an error message was received by the stream +head of the stream corresponding to the +.Fa fildes +member of the +.Vt strfdinsert +structure. +In this case, +.Va errno +will be set to the value in the message. +.It Dv I_STR +Constructs an internal +.Sy STREAMS +ioctl message from the data pointed to by +.Fa arg , +and sends that message downstream. +.Pp +This mechanism is provided to send user +.Fn ioctl +requests to downstream modules and drivers. +It allows information to be sent with the +.Fn ioctl , +and will return to the user any information sent upstream by the downstream +recipient. +.Dv I_STR +blocks until the system responds with either a positive or negative +acknowledgement message, or until the request times out after some period of +time. +If the request times out, it fails with +.Va errno +set to +.Er ETIME . +.Pp +To send requests downstream, +.Fa arg +must point to a +.Vt strioctl +structure which contains the following members: +.Bd -literal -offset 2n +int ic_cmd; +int ic_timout; +int ic_len; +char *ic_dp; +.Ed +.Pp +.Fa ic_cmd +is the internal +.Fn ioctl +command intended for a downstream module or driver and +.Fa ic_timout +is the number of seconds (-1 = infinite, 0 = use default, >0 = as specified) an +.Dv I_STR +request will wait for acknowledgement before timing out. +.Fa ic_len +is the number of bytes in the data argument and +.Fa ic_dp +is a pointer to the data argument. +The +.Fa ic_len +field has two uses: on input, it contains the length of the data +argument passed in, and on return from the command, it contains the number of +bytes being returned to the user (the buffer pointed to by +.Fa ic_dp +should be large enough to contain the maximum amount of data that any module or +the driver in the stream can return). +.Pp +At most one +.Dv I_STR +can be active on a stream. +Further +.Dv I_STR +calls +will block until the active +.Dv I_STR +completes via a positive or negative +acknowlegment, a timeout, or an error condition at the stream head. +By setting the +.Fa ic_timout +field to 0, the user is requesting STREAMS to provide +the +.Sy DEFAULT +timeout. +The default timeout is specific to the STREAMS +implementation and may vary depending on which release of Solaris you are +using. +For Solaris 8 (and earlier versions), the default timeout is fifteen +seconds. +The +.Dv O_NDELAY +and +.Dv O_NONBLOCK +(see +.Xr open 2 ) +flags have no effect on this call. +.Pp +The stream head will convert the information pointed to by the +.Vt strioctl +structure to an internal +.Fn ioctl +command message and send it downstream. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EFAULT +.It Er ENOSR +Unable to allocate buffers for the +.Fn ioctl +message due to insufficient STREAMS memory resources. +.It Er EFAULT +Either +.Fa arg +points outside the allocated address space, or the buffer area +specified by +.Fa ic_dp +and +.Fa ic_len +(separately for data sent and data returned) is outside the allocated address +space. +.It Er EINVAL +.Fa ic_len +is less than 0 or +.Fa ic_len +is larger than the maximum configured size of the data part of a message or +.Fa ic_timout +is less than \(mi1. +.It Er ENXIO +Hangup received on +.Fa fildes . +.It Er ETIME +A downstream +.Fn ioctl +timed out before acknowledgement was received. +.El +.Pp +An +.Dv I_STR +can also fail while waiting for an acknowledgement if a message +indicating an error or a hangup is received at the stream head. +In addition, an +error code can be returned in the positive or negative acknowledgement message, +in the event the ioctl command sent downstream fails. +For these cases, +.Dv I_STR +will fail with +.Va errno +set to the value in the message. +.It Dv I_SWROPT +Sets the write mode using the value of the argument +.Fa arg . +Legal bit settings for +.Fa arg +are: +.Bl -tag -width SNDZERO +.It Dv SNDZERO +Send a zero-length message downstream when a write of 0 bytes occurs. +.El +.Pp +To not send a zero-length message when a write of 0 bytes occurs, this bit must +not be set in +.Fa arg . +.Pp +On failure, +.Va errno +may be set to the following value: +.Bl -tag -width EINVAL +.It Sy EINVAL +.Fa arg +is not the above legal value. +.El +.It Dv I_GWROPT +Returns the current write mode setting, as described above, in the +.Vt int +that is pointed to by the argument +.Fa arg . +.It Dv I_SENDFD +Requests the stream associated with +.Fa fildes +to send a message, containing +a file pointer, to the stream head at the other end of a stream pipe. +The file +pointer corresponds to +.Fa arg , +which must be an open file descriptor. +.Pp +.Dv I_SENDFD +converts +.Fa arg +into the corresponding system file pointer. +It allocates a message block and inserts the file pointer in the block. +The user id and group id associated with the sending process are also inserted. +This message is placed directly on the read queue (see +.Xr Intro 3 ) +of the stream head at the other end of the stream pipe to which it is connected. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EAGAIN +.It Er EAGAIN +The sending stream is unable to allocate a message block to contain the file +pointer. +.It Er EAGAIN +The read queue of the receiving stream head is full and cannot accept the +message sent by +.Dv I_SENDFD . +.It Er EBADF +.Fa arg +is not a valid, open file descriptor. +.It Er EINVAL +.Va fildes +is not connected to a stream pipe. +.It Er ENXIO +Hangup received on +.Fa fildes . +.El +.It Dv I_RECVFD +Retrieves the file descriptor associated with the message sent by an +.Dv I_SENDFD +.Fn ioctl +over a stream pipe. +.Fa arg +is a pointer to a data buffer large enough to hold an +.Vt strrecvfd +data structure containing the following members: +.Bd -literal -offset 2n +int fd; +uid_t uid; +gid_t gid; +.Ed +.Pp +.Fa fd +is an integer file descriptor. +.Fa uid +and +.Fa gid +are the user id and group id, respectively, of the sending stream. +.Pp +If +.Dv O_NDELAY +and +.Dv O_NONBLOCK +are clear (see +.Xr open 2 ) , +.Dv I_RECVFD +will block until a message is present at the stream head. +If +.Dv O_NDELAY +or +.Dv O_NONBLOCK +is set, +.Dv I_RECVFD +will fail with +.Va errno +set to +.Er EAGAIN +if no message is present at the stream head. +.Pp +If the message at the stream head is a message sent by an +.Dv I_SENDFD , +a new +user file descriptor is allocated for the file pointer contained in the +message. +The new file descriptor is placed in the +.Fa fd +field of the +.Vt strrecvfd +structure. +The structure is copied into the user data buffer pointed to by +.Fa arg . +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EOVERFLOW +.It Er EAGAIN +A message is not present at the stream head read queue, and the +.Dv O_NDELAY +or +.Dv O_NONBLOCK +flag is set. +.It Er EBADMSG +The message at the stream head read queue is not a message containing a passed +file descriptor. +.It Er EFAULT +.Fa arg +points outside the allocated address space. +.It Er EMFILE +.Dv NOFILES +file descriptors are currently open. +.It Er ENXIO +Hangup received on +.Fa fildes . +.It Er EOVERFLOW +.Fa uid +or +.Fa gid +is too large to be stored in the structure pointed to by +.Fa arg . +.El +.It Dv I_LIST +Allows the user to list all the module names on the stream, up to and including +the topmost driver name. +If +.Fa arg +is +.Dv NULL , +the return value is the number of modules, including the driver, that are on +the stream pointed to by +.Fa fildes . +This allows the user to allocate enough space for the module +names. +If +.Fa arg +is non-null, it should point to an +.Vt str_list +structure that has the following members: +.Bd -literal -offset 2n +int sl_nmods; +struct str_mlist *sl_modlist; +.Ed +.Pp +The +.Vt str_mlist +structure has the following member: +.Bd -literal -offset 2n +char l_name[FMNAMESZ+1]; +.Ed +.Pp +The +.Fa sl_nmods +member indicates the number of entries the process has allocated in the array. +Upon return, the +.Fa sl_modlist +member of the +.Vt str_list +structure contains the list of module names, and the number of +entries that have been filled into the +.Fa sl_modlist +array is found in the +.Fa sl_nmods +member (the number includes the number of modules including the driver). +The return value from +.Fn ioctl +is 0. +The entries are filled in +starting at the top of the stream and continuing downstream until either the +end of the stream is reached, or the number of requested modules +.Pq Fa sl_nmods +is satisfied. +On failure, +.Va errno +may be set to one of the following values: +.Bl -tag -width EINVAL +.It Er EINVAL +The +.Fa sl_nmods +member is less than 1. +.It Er EAGAIN +Unable to allocate buffers +.El +.It Dv I_ATMARK +Allows the user to see if the current message on the stream head read queue is +.Dq marked +by some module downstream. +.Fa arg +determines how the checking is +done when there may be multiple marked messages on the stream head read queue. +It may take the following values: +.Bl -tag -width LASTMARK +.It Dv ANYMARK +Check if the message is marked. +.It Dv LASTMARK +Check if the message is the last one marked on the queue. +.El +.Pp +The return value is +.Sy 1 +if the mark condition is satisfied and +.Sy 0 +otherwise. +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EINVAL +.It Er EINVAL +Invalid +.Fa arg +value. +.El +.It Dv I_CKBAND +Check if the message of a given priority band exists on the stream head read +queue. +This returns +.Sy 1 +if a message of a given priority exists, +.Sy 0 +if not, or +.Sy \(mi1 +on error. +.Fa arg +should be an integer containing the value of the priority band in question. +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EINVAL +.It Er EINVAL +Invalid +.Fa arg +value. +.El +.It Dv I_GETBAND +Returns the priority band of the first message on the stream head read queue in +the integer referenced by +.Fa arg . +On failure, +.Va errno +is set to the following value: +.Bl -tag -width ENODATA +.It Er ENODATA +No message on the stream head read queue. +.El +.It Dv I_CANPUT +Check if a certain band is writable. +.Fa arg +is set to the priority band in question. +The return value is +.Sy 0 +if the priority band +.Fa arg +is flow controlled, +.Sy 1 +if the band is writable, or +.Sy \(mi1 +on error. +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EINVAL +.It Sy EINVAL +Invalid +.Va arg +value. +.El +.It Dv I_SETCLTIME +Allows the user to set the time the stream head will delay when a stream is +closing and there are data on the write queues. +Before closing each module and driver, the stream head will delay for the +specified amount of time to allow the data to drain. +Note, however, that the module or driver may itself delay in its close routine; +this delay is independent of the stream head's delay and is not settable. +If, after the delay, data are still present, data will be flushed. +.Fa arg +is a pointer to an integer containing the number of +milliseconds to delay, rounded up to the nearest legal value on the system. +The default is fifteen seconds. +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EINVAL +.It Er EINVAL +Invalid +.Fa arg +value. +.El +.It Dv I_GETCLTIME +Returns the close time delay in the integer pointed by +.Va arg . +.It Dv I_SERROPT +Sets the error mode using the value of the argument +.Fa arg . +.Pp +Normally stream head errors are persistent; once they are set due to an +.Dv M_ERROR +or +.Dv M_HANGUP , +the error condition will remain until the stream is closed. +This option can be used to set the stream head into +non-persistent error mode i\.e\. once the error has been returned in response +to a +.Xr read 2 , +.Xr getmsg 2 , +.Xr ioctl 2 , +.Xr write 2 , +or +.Xr putmsg 2 +call the error condition will be cleared. +The error mode can be controlled independently for read and write side errors. +Legal +.Fa arg +values +are either none or one of: +.Bl -tag -width RERRNONPERSIST +.It Dv RERRNORM +Persistent read errors, the default. +.It Dv RERRNONPERSIST +Non-persistent read errors. +.El +.Pp +.Sy OR Ns 'ed +with either none or one of: +.Bl -tag -width WERRNONPERSIST +.It Dv WERRNORM +Persistent write errors, the default. +.It Dv WERRNONPERSIST +Non-persistent write errors. +.El +.Pp +When no value is specified e\.g\. for the read side error behavior then the +behavior for that side will be left unchanged. +.Pp +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EINVAL +.It Er EINVAL +.Va arg +is not one of the above legal values. +.El +.It Dv I_GERROPT +Returns the current error mode setting in an +.Vt int +pointed to by the argument +.Fa arg . +Error modes are described above for +.Dv I_SERROPT . +On failure, +.Va errno +is set to the following value: +.Bl -tag -width EFAULT +.It Sy EFAULT +.Fa arg +points outside the allocated address space. +.El +.El +.Pp +The following four commands are used for connecting and disconnecting +multiplexed STREAMS configurations. +.Bl -tag -width I_PUNLINK +.It Dv I_LINK +Connects two streams, where +.Fa fildes +is the file descriptor of the stream +connected to the multiplexing driver, and +.Fa arg +is the file descriptor of the stream connected to another driver. +The stream designated by +.Va arg +gets +connected below the multiplexing driver. +.Dv I_LINK +requires the multiplexing +driver to send an acknowledgement message to the stream head regarding the +linking operation. +This call returns a multiplexor ID number (an identifier +used to disconnect the multiplexor, see +.Dv I_UNLINK ) +on success, and \(mi1 on failure. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EAGAIN +.It Er ENXIO +Hangup received on +.Va fildes . +.It Er ETIME +Time out before acknowledgement message was received at stream head. +.It Er EAGAIN +Temporarily unable to allocate storage to perform the +.Dv I_LINK . +.It Er ENOSR +Unable to allocate storage to perform the +.Dv I_LINK +due to insufficient +.Sy STREAMS +memory resources. +.It Er EBADF +.Va arg +is not a valid, open file descriptor. +.It Er EINVAL +.Va fildes +stream does not support multiplexing. +.It Er EINVAL +is not a stream, or is already linked under a multiplexor. +.It Er EINVAL +The specified link operation would cause a +.Dq cycle +in the resulting configuration; that is, a driver would be linked into the +multiplexing configuration in more than one place. +.It Er EINVAL +.Va fildes +is the file descriptor of a pipe or FIFO. +.It Er EINVAL +Either the upper or lower stream has a major number \(>= the maximum major +number on the system. +.El +.Pp +An +.Dv I_LINK +can also fail while waiting for the multiplexing driver to +acknowledge the link request, if a message indicating an error or a hangup is +received at the stream head of +.Fa fildes . +In addition, an error code can be +returned in the positive or negative acknowledgement message. +For these cases, +.Dv I_LINK +will fail with +.Va errno +set to the value in the message. +.It Dv I_UNLINK +Disconnects the two streams specified by +.Fa fildes +and +.Fa arg . +.Fa fildes +is the file descriptor of the stream connected to the multiplexing +driver. +.Fa arg +is the multiplexor ID number that was returned by the +.Dv I_LINK . +If +.Fa arg +is \(mi1, then all streams that were linked to +.Fa fildes +are disconnected. +As in +.Dv I_LINK , +this command requires the multiplexing driver to acknowledge the unlink. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EINVAL +.It Er ENXIO +Hangup received on +.Va fildes . +.It Er ETIME +Time out before acknowledgement message was received at stream head. +.It Er ENOSR +Unable to allocate storage to perform the +.Dv I_UNLINK +due to insufficient +STREAMS memory resources. +.It Er EINVAL +.Fa arg +is an invalid multiplexor ID number or +.Fa fildes +is not the stream on which the +.Dv I_LINK +that returned +.Fa arg +was performed. +.It Er EINVAL +.Fa fildes +is the file descriptor of a pipe or FIFO. +.El +.Pp +An +.Dv I_UNLINK +can also fail while waiting for the multiplexing driver to +acknowledge the link request, if a message indicating an error or a hangup is +received at the stream head of +.Fa fildes . +In addition, an error code can be +returned in the positive or negative acknowledgement message. +For these cases, +.Dv I_UNLINK +will fail with +.Va errno +set to the value in the message. +.It Dv I_PLINK +Connects two streams, where +.Fa fildes +is the file descriptor of the stream +connected to the multiplexing driver, and +.Fa arg +is the file descriptor of +the stream connected to another driver. +The stream designated by +.Fa arg +gets +connected via a persistent link below the multiplexing driver. +.Dv I_PLINK +requires the multiplexing driver to send an acknowledgement message to the +stream head regarding the linking operation. +This call creates a persistent +link that continues to exist even if the file descriptor +.Fa fildes +associated with the upper stream to the multiplexing driver is closed. +This +call returns a multiplexor ID number (an identifier that may be used to +disconnect the multiplexor, see +.Dv I_PUNLINK ) +on success, and \(mi1 on failure. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EAGAIN +.It Er ENXIO +Hangup received on +.Fa fildes . +.It Er ETIME +Time out before acknowledgement message was received at the stream head. +.It Er EAGAIN +Unable to allocate STREAMS storage to perform the +.Dv I_PLINK . +.It Er EBADF +.Va arg +is not a valid, open file descriptor. +.It Er EINVAL +.Va fildes +does not support multiplexing. +.It Er EINVAL +.Va arg +is not a stream or is already linked under a multiplexor. +.It Er EINVAL +The specified link operation would cause a +.Dq cycle +in the resulting configuration; that is, if a driver would be linked into the +multiplexing configuration in more than one place. +.It Er EINVAL +.Fa fildes +is the file descriptor of a pipe or FIFO. +.El +.Pp +An +.Dv I_PLINK +can also fail while waiting for the multiplexing driver to +acknowledge the link request, if a message indicating an error on a hangup is +received at the stream head of +.Fa fildes . +In addition, an error code can be +returned in the positive or negative acknowledgement message. +For these cases, +.Dv I_PLINK +will fail with +.Va errno +set to the value in the message. +.It Dv I_PUNLINK +Disconnects the two streams specified by +.Fa fildes +and +.Fa arg +that are +connected with a persistent link. +.Fa fildes +is the file descriptor of the +stream connected to the multiplexing driver. +.Fa arg +is the multiplexor ID number that was returned by +.Dv I_PLINK +when a stream was linked below the multiplexing driver. +If +.Fa arg +is +.Dv MUXID_ALL +then all streams that are persistent links to +.Fa fildes +are disconnected. +As in +.Dv I_PLINK , +this command requires the multiplexing driver to acknowledge the unlink. +On failure, +.Va errno +is set to one of the following values: +.Bl -tag -width EAGAIN +.It Sy ENXIO +Hangup received on +.Fa fildes . +.It Er ETIME +Time out before acknowledgement message was received at the stream head. +.It Er EAGAIN +Unable to allocate buffers for the acknowledgement message. +.It Er EINVAL +Invalid multiplexor ID number. +.It Er EINVAL +.Fa fildes +is the file descriptor of a pipe or FIFO. +.El +.Pp +An +.Dv I_PUNLINK +can also fail while waiting for the multiplexing driver to +acknowledge the link request if a message indicating an error or a hangup is +received at the stream head of +.Fa fildes . +In addition, an error code can be +returned in the positive or negative acknowledgement message. +For these cases, +.Dv I_PUNLINK +will fail with +.Va errno +set to the value in the message. +.El +.Sh RETURN VALUES +Unless specified otherwise above, the return value from +.Xr ioctl 2 +is +.Sy 0 +upon success and +.Sy \(mi1 +upon failure, with +.Va errno +set as indicated. +.Sh SEE ALSO +.Xr close 2 , +.Xr fcntl 2 , +.Xr getmsg 2 , +.Xr ioctl 2 , +.Xr open 2 , +.Xr poll 2 , +.Xr putmsg 2 , +.Xr read 2 , +.Xr write 2 , +.Xr Intro 3 , +.Xr signal 3C , +.Xr signal.h 3HEAD +.Pp +.%B STREAMS Programming Guide |