summaryrefslogtreecommitdiffstats
path: root/man3p/ioctl.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/ioctl.3p')
-rw-r--r--man3p/ioctl.3p1058
1 files changed, 1058 insertions, 0 deletions
diff --git a/man3p/ioctl.3p b/man3p/ioctl.3p
new file mode 100644
index 000000000..783112893
--- /dev/null
+++ b/man3p/ioctl.3p
@@ -0,0 +1,1058 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "IOCTL" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" ioctl
+.SH NAME
+ioctl \- control a STREAMS device (\fBSTREAMS\fP)
+.SH SYNOPSIS
+.LP
+\fB#include <stropts.h>
+.br
+.sp
+int ioctl(int\fP \fIfildes\fP\fB, int\fP \fIrequest\fP\fB, ... /*
+arg */); \fP
+\fB
+.br
+\fP
+.SH DESCRIPTION
+.LP
+The \fIioctl\fP() function shall perform a variety of control functions
+on STREAMS devices. For non-STREAMS devices, the
+functions performed by this call are unspecified. The \fIrequest\fP
+argument and an optional third argument (with varying type)
+shall be passed to and interpreted by the appropriate part of the
+STREAM associated with \fIfildes\fP.
+.LP
+The \fIfildes\fP argument is an open file descriptor that refers to
+a device.
+.LP
+The \fIrequest\fP argument selects the control function to be performed
+and shall depend on the STREAMS device being
+addressed.
+.LP
+The \fIarg\fP argument represents additional information that is needed
+by this specific STREAMS device to perform the
+requested function. The type of \fIarg\fP depends upon the particular
+control request, but it shall be either an integer or a
+pointer to a device-specific data structure.
+.LP
+The \fIioctl\fP() commands applicable to STREAMS, their arguments,
+and error conditions that apply to each individual command
+are described below.
+.LP
+The following \fIioctl\fP() commands, with error values indicated,
+are applicable to all STREAMS files:
+.TP 7
+I_PUSH
+Pushes the module whose name is pointed to by \fIarg\fP onto the top
+of the current STREAM, just below the STREAM head. It
+then calls the \fIopen\fP() function of the newly-pushed module.
+.LP
+The \fIioctl\fP() function with the I_PUSH command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+Invalid module name.
+.RE
+.TP 7
+.B ENXIO
+.RS
+Open function of new module failed.
+.RE
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.sp
+.TP 7
+I_POP
+Removes the module just below the STREAM head of the STREAM pointed
+to by \fIfildes\fP. The \fIarg\fP argument should be 0 in
+an I_POP request.
+.LP
+The \fIioctl\fP() function with the I_POP command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+No module present in the STREAM.
+.RE
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.sp
+.TP 7
+I_LOOK
+Retrieves the name of the module just below the STREAM head of the
+STREAM pointed to by \fIfildes\fP, and places it in a
+character string pointed to by \fIarg\fP. The buffer pointed to by
+\fIarg\fP should be at least FMNAMESZ+1 bytes long, where
+FMNAMESZ is defined in \fI<stropts.h>\fP.
+.LP
+The \fIioctl\fP() function with the I_LOOK command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+No module present in the STREAM.
+.RE
+.sp
+.TP 7
+I_FLUSH
+Flushes read and/or write queues, depending on the value of \fIarg\fP.
+Valid \fIarg\fP values are:
+.TP 7
+FLUSHR
+.RS
+Flush all read queues.
+.RE
+.TP 7
+FLUSHW
+.RS
+Flush all write queues.
+.RE
+.TP 7
+FLUSHRW
+.RS
+Flush all read and all write queues.
+.RE
+.sp
+.LP
+The \fIioctl\fP() function with the I_FLUSH command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+Invalid \fIarg\fP value.
+.RE
+.TP 7
+.B EAGAIN \fRor\fP ENOSR
+.RS
+.sp
+Unable to allocate buffers for flush message.
+.RE
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.sp
+.TP 7
+I_FLUSHBAND
+Flushes a particular band of messages. The \fIarg\fP argument points
+to a \fBbandinfo\fP structure. The \fIbi_flag\fP member
+may be one of FLUSHR, FLUSHW, or FLUSHRW as described above. The \fIbi_pri\fP
+member determines the priority band to be
+flushed.
+.TP 7
+I_SETSIG
+Requests that the STREAMS implementation send the SIGPOLL signal to
+the calling process when a particular event has occurred on
+the STREAM associated with \fIfildes\fP. I_SETSIG supports an asynchronous
+processing capability in STREAMS. The value of
+\fIarg\fP is a bitmask that specifies the events for which the process
+should be signaled. It is the bitwise-inclusive OR of any
+combination of the following constants:
+.TP 7
+S_RDNORM
+.RS
+A normal (priority band set to 0) message has arrived at the head
+of a STREAM head read queue. A signal shall be generated even
+if the message is of zero length.
+.RE
+.TP 7
+S_RDBAND
+.RS
+A message with a non-zero priority band has arrived at the head of
+a STREAM head read queue. A signal shall be generated even
+if the message is of zero length.
+.RE
+.TP 7
+S_INPUT
+.RS
+A message, other than a high-priority message, has arrived at the
+head of a STREAM head read queue. A signal shall be generated
+even if the message is of zero length.
+.RE
+.TP 7
+S_HIPRI
+.RS
+A high-priority message is present on a STREAM head read queue. A
+signal shall be generated even if the message is of zero
+length.
+.RE
+.TP 7
+S_OUTPUT
+.RS
+The write queue for normal data (priority band 0) just below the STREAM
+head is no longer full. This notifies the process that
+there is room on the queue for sending (or writing) normal data downstream.
+.RE
+.TP 7
+S_WRNORM
+.RS
+Equivalent to S_OUTPUT.
+.RE
+.TP 7
+S_WRBAND
+.RS
+The write queue for a non-zero priority band just below the STREAM
+head is no longer full. This notifies the process that there
+is room on the queue for sending (or writing) priority data downstream.
+.RE
+.TP 7
+S_MSG
+.RS
+A STREAMS signal message that contains the SIGPOLL signal has reached
+the front of the STREAM head read queue.
+.RE
+.TP 7
+S_ERROR
+.RS
+Notification of an error condition has reached the STREAM head.
+.RE
+.TP 7
+S_HANGUP
+.RS
+Notification of a hangup has reached the STREAM head.
+.RE
+.TP 7
+S_BANDURG
+.RS
+When used in conjunction with S_RDBAND, SIGURG is generated instead
+of SIGPOLL when a priority message reaches the front of the
+STREAM head read queue.
+.RE
+.sp
+.LP
+If \fIarg\fP is 0, the calling process shall be unregistered and shall
+not receive further SIGPOLL signals for the stream
+associated with \fIfildes\fP.
+.LP
+Processes that wish to receive SIGPOLL signals shall ensure that they
+explicitly register to receive them using I_SETSIG. If
+several processes register to receive this signal for the same event
+on the same STREAM, each process shall be signaled when the
+event occurs.
+.LP
+The \fIioctl\fP() function with the I_SETSIG command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+The value of \fIarg\fP is invalid.
+.RE
+.TP 7
+.B EINVAL
+.RS
+The value of \fIarg\fP is 0 and the calling process is not registered
+to receive the SIGPOLL signal.
+.RE
+.TP 7
+.B EAGAIN
+.RS
+There were insufficient resources to store the signal request.
+.RE
+.sp
+.TP 7
+I_GETSIG
+Returns the events for which the calling process is currently registered
+to be sent a SIGPOLL signal. The events are returned
+as a bitmask in an \fBint\fP pointed to by \fIarg\fP, where the events
+are those specified in the description of I_SETSIG above.
+.LP
+The \fIioctl\fP() function with the I_GETSIG command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+Process is not registered to receive the SIGPOLL signal.
+.RE
+.sp
+.TP 7
+I_FIND
+Compares the names of all modules currently present in the STREAM
+to the name pointed to by \fIarg\fP, and returns 1 if the
+named module is present in the STREAM, or returns 0 if the named module
+is not present.
+.LP
+The \fIioctl\fP() function with the I_FIND command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+\fIarg\fP does not contain a valid module name.
+.RE
+.sp
+.TP 7
+I_PEEK
+Retrieves the information in the first message on the STREAM head
+read queue without taking the message off the queue. It is
+analogous to \fIgetmsg\fP() except that this command does not remove
+the message from the
+queue. The \fIarg\fP argument points to a \fBstrpeek\fP structure.
+.LP
+The application shall ensure that the \fImaxlen\fP member in the \fBctlbuf\fP
+and \fBdatabuf strbuf\fP structures is set to
+the number of bytes of control information and/or data information,
+respectively, to retrieve. The \fIflags\fP member may be
+marked RS_HIPRI or 0, as described by \fIgetmsg\fP(). If the process
+sets \fIflags\fP to
+RS_HIPRI, for example, I_PEEK shall only look for a high-priority
+message on the STREAM head read queue.
+.LP
+I_PEEK returns 1 if a message was retrieved, and returns 0 if no message
+was found on the STREAM head read queue, or if the
+RS_HIPRI flag was set in \fIflags\fP and a high-priority message was
+not present on the STREAM head read queue. It does not wait
+for a message to arrive. On return, \fBctlbuf\fP specifies information
+in the control buffer, \fBdatabuf\fP specifies information
+in the data buffer, and \fIflags\fP contains the value RS_HIPRI or
+0.
+.TP 7
+I_SRDOPT
+Sets the read mode using the value of the argument \fIarg\fP. Read
+modes are described in \fIread\fP() . Valid \fIarg\fP flags are:
+.TP 7
+RNORM
+.RS
+Byte-stream mode, the default.
+.RE
+.TP 7
+RMSGD
+.RS
+Message-discard mode.
+.RE
+.TP 7
+RMSGN
+.RS
+Message-nondiscard mode.
+.RE
+.sp
+.LP
+The bitwise-inclusive OR of RMSGD and RMSGN shall return [EINVAL].
+The bitwise-inclusive OR of RNORM and either RMSGD or RMSGN
+shall result in the other flag overriding RNORM which is the default.
+.LP
+In addition, treatment of control messages by the STREAM head may
+be changed by setting any of the following flags in
+\fIarg\fP:
+.TP 7
+RPROTNORM
+.RS
+Fail \fIread\fP() with [EBADMSG] if a message containing a control
+part is at the front
+of the STREAM head read queue.
+.RE
+.TP 7
+RPROTDAT
+.RS
+Deliver the control part of a message as data when a process issues
+a \fIread\fP().
+.RE
+.TP 7
+RPROTDIS
+.RS
+Discard the control part of a message, delivering any data portion,
+when a process issues a \fIread\fP().
+.RE
+.sp
+.LP
+The \fIioctl\fP() function with the I_SRDOPT command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+The \fIarg\fP argument is not valid.
+.RE
+.sp
+.TP 7
+I_GRDOPT
+Returns the current read mode setting, as described above, in an \fBint\fP
+pointed to by the argument \fIarg\fP. Read modes
+are described in \fIread\fP() .
+.TP 7
+I_NREAD
+Counts the number of data bytes in the data part of the first message
+on the STREAM head read queue and places this value in
+the \fBint\fP pointed to by \fIarg\fP. The return value for the command
+shall be the number of messages on the STREAM head read
+queue. For example, if 0 is returned in \fIarg\fP, but the \fIioctl\fP()
+return value is greater than 0, this indicates that a
+zero-length message is next on the queue.
+.TP 7
+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. The \fIarg\fP argument points
+to a \fBstrfdinsert\fP structure.
+.LP
+The application shall ensure that the \fIlen\fP member in the \fBctlbuf
+strbuf\fP structure is set to the size of a
+\fBt_uscalar_t\fP plus the number of bytes of control information
+to be sent with the message. The \fIfildes\fP member specifies
+the file descriptor of the other STREAM, and the \fIoffset\fP member,
+which must be suitably aligned for use as a
+\fBt_uscalar_t\fP, specifies the offset from the start of the control
+buffer where I_FDINSERT shall store a \fBt_uscalar_t\fP
+whose interpretation is specific to the STREAM end. The application
+shall ensure that the \fIlen\fP member in the \fBdatabuf
+strbuf\fP structure is 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.
+.LP
+The \fIflags\fP member specifies the type of message to be created.
+A normal message is created if \fIflags\fP is set to 0,
+and a high-priority message is created if \fIflags\fP is set to RS_HIPRI.
+For non-priority messages, I_FDINSERT shall block if the
+STREAM write queue is full due to internal flow control conditions.
+For priority messages, I_FDINSERT does not block on this
+condition. For non-priority messages, I_FDINSERT does not block when
+the write queue is full and O_NONBLOCK is set. Instead, it
+fails and sets \fIerrno\fP to [EAGAIN].
+.LP
+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 O_NONBLOCK has been specified.
+No partial message is sent.
+.LP
+The \fIioctl\fP() function with the I_FDINSERT command shall fail
+if:
+.TP 7
+.B EAGAIN
+.RS
+A non-priority message is specified, the O_NONBLOCK flag is set, and
+the STREAM write queue is full due to internal flow
+control conditions.
+.RE
+.TP 7
+.B EAGAIN \fRor\fP ENOSR
+.RS
+.sp
+Buffers cannot be allocated for the message that is to be created.
+.RE
+.TP 7
+.B EINVAL
+.RS
+One of the following:
+.RS
+.IP " *" 3
+The \fIfildes\fP member of the \fBstrfdinsert\fP structure is not
+a valid, open STREAM file descriptor.
+.LP
+.IP " *" 3
+The size of a \fBt_uscalar_t\fP plus \fIoffset\fP is greater than
+the \fIlen\fP member for the buffer specified through
+\fBctlbuf\fP.
+.LP
+.IP " *" 3
+The \fIoffset\fP member does not specify a properly-aligned location
+in the data buffer.
+.LP
+.IP " *" 3
+An undefined value is stored in \fIflags\fP.
+.LP
+.RE
+.RE
+.TP 7
+.B ENXIO
+.RS
+Hangup received on the STREAM identified by either the \fIfildes\fP
+argument or the \fIfildes\fP member of the
+\fBstrfdinsert\fP structure.
+.RE
+.TP 7
+.B ERANGE
+.RS
+The \fIlen\fP member for the buffer specified through \fBdatabuf\fP
+does not fall within the range specified by the maximum
+and minimum packet sizes of the topmost STREAM module; or the \fIlen\fP
+member for the buffer specified through \fBdatabuf\fP is
+larger than the maximum configured size of the data part of a message;
+or the \fIlen\fP member for the buffer specified through
+\fBctlbuf\fP is larger than the maximum configured size of the control
+part of a message.
+.RE
+.sp
+.TP 7
+I_STR
+Constructs an internal STREAMS \fIioctl\fP() message from the data
+pointed to by \fIarg\fP, and sends that message
+downstream.
+.LP
+This mechanism is provided to send \fIioctl\fP() requests to downstream
+modules and drivers. It allows information to be sent
+with \fIioctl\fP(), and returns to the process any information sent
+upstream by the downstream recipient. I_STR shall block 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 shall fail with \fIerrno\fP set
+to [ETIME].
+.LP
+At most, one I_STR can be active on a STREAM. Further I_STR calls
+shall block until the active I_STR completes at the STREAM
+head. The default timeout interval for these requests is 15 seconds.
+The O_NONBLOCK flag has no effect on this call.
+.LP
+To send requests downstream, the application shall ensure that \fIarg\fP
+points to a \fBstrioctl\fP structure.
+.LP
+The \fIic_cmd\fP member is the internal \fIioctl\fP() command intended
+for a downstream module or driver and \fIic_timout\fP
+is the number of seconds (-1=infinite, 0=use implementation-defined
+timeout interval, >0=as specified) an I_STR request shall
+wait for acknowledgement before timing out. \fIic_len\fP is the number
+of bytes in the data argument, and \fIic_dp\fP is a
+pointer to the data argument. The \fIic_len\fP member 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 process (the buffer pointed to by
+\fIic_dp\fP should be large enough to contain the maximum amount of
+data that any module or the driver in the STREAM can
+return).
+.LP
+The STREAM head shall convert the information pointed to by the \fBstrioctl\fP
+structure to an internal \fIioctl\fP() command
+message and send it downstream.
+.LP
+The \fIioctl\fP() function with the I_STR command shall fail if:
+.TP 7
+.B EAGAIN \fRor\fP ENOSR
+.RS
+.sp
+Unable to allocate buffers for the \fIioctl\fP() message.
+.RE
+.TP 7
+.B EINVAL
+.RS
+The \fIic_len\fP member is less than 0 or larger than the maximum
+configured size of the data part of a message, or
+\fIic_timout\fP is less than -1.
+.RE
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.TP 7
+.B ETIME
+.RS
+A downstream \fIioctl\fP() timed out before acknowledgement was received.
+.RE
+.sp
+.LP
+An 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
+\fIioctl\fP() command sent downstream fails. For these cases, I_STR
+shall fail with \fIerrno\fP set to the value in the
+message.
+.TP 7
+I_SWROPT
+Sets the write mode using the value of the argument \fIarg\fP. Valid
+bit settings for \fIarg\fP are:
+.TP 7
+SNDZERO
+.RS
+Send a zero-length message downstream when a \fIwrite\fP() of 0 bytes
+occurs. To not
+send a zero-length message when a \fIwrite\fP() of 0 bytes occurs,
+the application shall
+ensure that this bit is not set in \fIarg\fP (for example, \fIarg\fP
+would be set to 0).
+.RE
+.sp
+.LP
+The \fIioctl\fP() function with the I_SWROPT command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+\fIarg\fP is not the above value.
+.RE
+.sp
+.TP 7
+I_GWROPT
+Returns the current write mode setting, as described above, in the
+\fBint\fP that is pointed to by the argument
+\fIarg\fP.
+.TP 7
+I_SENDFD
+Creates a new reference to the open file description associated with
+the file descriptor \fIarg\fP, and writes a message on
+the STREAMS-based pipe \fIfildes\fP containing this reference, together
+with the user ID and group ID of the calling process.
+.LP
+The \fIioctl\fP() function with the I_SENDFD command shall fail if:
+.TP 7
+.B EAGAIN
+.RS
+The sending STREAM is unable to allocate a message block to contain
+the file pointer; or the read queue of the receiving STREAM
+head is full and cannot accept the message sent by I_SENDFD.
+.RE
+.TP 7
+.B EBADF
+.RS
+The \fIarg\fP argument is not a valid, open file descriptor.
+.RE
+.TP 7
+.B EINVAL
+.RS
+The \fIfildes\fP argument is not connected to a STREAM pipe.
+.RE
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.sp
+.TP 7
+I_RECVFD
+Retrieves the reference to an open file description from a message
+written to a STREAMS-based pipe using the I_SENDFD command,
+and allocates a new file descriptor in the calling process that refers
+to this open file description. The \fIarg\fP argument is a
+pointer to a \fBstrrecvfd\fP data structure as defined in \fI<stropts.h>\fP.
+.LP
+The \fIfd\fP member is a file descriptor. The \fIuid\fP and \fIgid\fP
+members are the effective user ID and effective group
+ID, respectively, of the sending process.
+.LP
+If O_NONBLOCK is not set, I_RECVFD shall block until a message is
+present at the STREAM head. If O_NONBLOCK is set, I_RECVFD
+shall fail with \fIerrno\fP set to [EAGAIN] if no message is present
+at the STREAM head.
+.LP
+If the message at the STREAM head is a message sent by an I_SENDFD,
+a new file descriptor shall be allocated for the open file
+descriptor referenced in the message. The new file descriptor is placed
+in the \fIfd\fP member of the \fBstrrecvfd\fP structure
+pointed to by \fIarg\fP.
+.LP
+The \fIioctl\fP() function with the I_RECVFD command shall fail if:
+.TP 7
+.B EAGAIN
+.RS
+A message is not present at the STREAM head read queue and the O_NONBLOCK
+flag is set.
+.RE
+.TP 7
+.B EBADMSG
+.RS
+The message at the STREAM head read queue is not a message containing
+a passed file descriptor.
+.RE
+.TP 7
+.B EMFILE
+.RS
+The process has the maximum number of file descriptors currently open
+that it is allowed.
+.RE
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.sp
+.TP 7
+I_LIST
+Allows the process to list all the module names on the STREAM, up
+to and including the topmost driver name. If \fIarg\fP is a
+null pointer, the return value shall be the number of modules, including
+the driver, that are on the STREAM pointed to by
+\fIfildes\fP. This lets the process allocate enough space for the
+module names. Otherwise, it should point to a \fBstr_list\fP
+structure.
+.LP
+The \fIsl_nmods\fP member indicates the number of entries the process
+has allocated in the array. Upon return, the
+\fIsl_modlist\fP member of the \fBstr_list\fP structure shall contain
+the list of module names, and the number of entries that
+have been filled into the \fIsl_modlist\fP array is found in the \fIsl_nmods\fP
+member (the number includes the number of modules
+including the driver). The return value from \fIioctl\fP() shall be
+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 ( \fIsl_nmods\fP) is
+satisfied.
+.LP
+The \fIioctl\fP() function with the I_LIST command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+The \fIsl_nmods\fP member is less than 1.
+.RE
+.TP 7
+.B EAGAIN \fRor\fP ENOSR
+.RS
+.sp
+Unable to allocate buffers.
+.RE
+.sp
+.TP 7
+I_ATMARK
+Allows the process to see if the message at the head of the STREAM
+head read queue is marked by some module downstream. The
+\fIarg\fP argument determines how the checking is done when there
+may be multiple marked messages on the STREAM head read queue.
+It may take on the following values:
+.TP 7
+ANYMARK
+.RS
+Check if the message is marked.
+.RE
+.TP 7
+LASTMARK
+.RS
+Check if the message is the last one marked on the queue.
+.RE
+.sp
+.LP
+The bitwise-inclusive OR of the flags ANYMARK and LASTMARK is permitted.
+.LP
+The return value shall be 1 if the mark condition is satisfied; otherwise,
+the value shall be 0.
+.LP
+The \fIioctl\fP() function with the I_ATMARK command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+Invalid \fIarg\fP value.
+.RE
+.sp
+.TP 7
+I_CKBAND
+Checks if the message of a given priority band exists on the STREAM
+head read queue. This shall return 1 if a message of the
+given priority exists, 0 if no such message exists, or -1 on error.
+\fIarg\fP should be of type \fBint\fP.
+.LP
+The \fIioctl\fP() function with the I_CKBAND command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+Invalid \fIarg\fP value.
+.RE
+.sp
+.TP 7
+I_GETBAND
+Returns the priority band of the first message on the STREAM head
+read queue in the integer referenced by \fIarg\fP.
+.LP
+The \fIioctl\fP() function with the I_GETBAND command shall fail if:
+.TP 7
+.B ENODATA
+.RS
+No message on the STREAM head read queue.
+.RE
+.sp
+.TP 7
+I_CANPUT
+Checks if a certain band is writable. \fIarg\fP is set to the priority
+band in question. The return value shall be 0 if the
+band is flow-controlled, 1 if the band is writable, or -1 on error.
+.LP
+The \fIioctl\fP() function with the I_CANPUT command shall fail if:
+.TP 7
+.B EINVAL
+.RS
+Invalid \fIarg\fP value.
+.RE
+.sp
+.TP 7
+I_SETCLTIME
+This request allows the process to set the time the STREAM head shall
+delay when a STREAM is closing and there is data on the
+write queues. Before closing each module or driver, if there is data
+on its write queue, the STREAM head shall delay for the
+specified amount of time to allow the data to drain. If, after the
+delay, data is still present, it shall be flushed. The
+\fIarg\fP argument is a pointer to an integer specifying the number
+of milliseconds to delay, rounded up to the nearest valid
+value. If I_SETCLTIME is not performed on a STREAM, an implementation-defined
+default timeout interval is used.
+.LP
+The \fIioctl\fP() function with the I_SETCLTIME command shall fail
+if:
+.TP 7
+.B EINVAL
+.RS
+Invalid \fIarg\fP value.
+.RE
+.sp
+.TP 7
+I_GETCLTIME
+Returns the close time delay in the integer pointed to by \fIarg\fP.
+.sp
+.SS Multiplexed STREAMS Configurations
+.LP
+The following commands are used for connecting and disconnecting multiplexed
+STREAMS configurations. These commands use an
+implementation-defined default timeout interval.
+.TP 7
+I_LINK
+Connects two STREAMs, where \fIfildes\fP is the file descriptor of
+the STREAM connected to the multiplexing driver, and
+\fIarg\fP is the file descriptor of the STREAM connected to another
+driver. The STREAM designated by \fIarg\fP is connected below
+the multiplexing driver. I_LINK requires the multiplexing driver to
+send an acknowledgement message to the STREAM head regarding
+the connection. This call shall return a multiplexer ID number (an
+identifier used to disconnect the multiplexer; see I_UNLINK) on
+success, and -1 on failure.
+.LP
+The \fIioctl\fP() function with the I_LINK command shall fail if:
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.TP 7
+.B ETIME
+.RS
+Timeout before acknowledgement message was received at STREAM head.
+.RE
+.TP 7
+.B EAGAIN \fRor\fP ENOSR
+.RS
+.sp
+Unable to allocate STREAMS storage to perform the I_LINK.
+.RE
+.TP 7
+.B EBADF
+.RS
+The \fIarg\fP argument is not a valid, open file descriptor.
+.RE
+.TP 7
+.B EINVAL
+.RS
+The \fIfildes\fP argument does not support multiplexing; or \fIarg\fP
+is not a STREAM or is already connected downstream from
+a multiplexer; or the specified I_LINK operation would connect the
+STREAM head in more than one place in the multiplexed
+STREAM.
+.RE
+.sp
+.LP
+An I_LINK can also fail while waiting for the multiplexing driver
+to acknowledge the request, if a message indicating an error
+or a hangup is received at the STREAM head of \fIfildes\fP. In addition,
+an error code can be returned in the positive or negative
+acknowledgement message. For these cases, I_LINK fails with \fIerrno\fP
+set to the value in the message.
+.TP 7
+I_UNLINK
+Disconnects the two STREAMs specified by \fIfildes\fP and \fIarg\fP.
+\fIfildes\fP is the file descriptor of the STREAM
+connected to the multiplexing driver. The \fIarg\fP argument is the
+multiplexer ID number that was returned by the I_LINK
+\fIioctl\fP() command when a STREAM was connected downstream from
+the multiplexing driver. If \fIarg\fP is MUXID_ALL, then all
+STREAMs that were connected to \fIfildes\fP shall be disconnected.
+As in I_LINK, this command requires acknowledgement.
+.LP
+The \fIioctl\fP() function with the I_UNLINK command shall fail if:
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.TP 7
+.B ETIME
+.RS
+Timeout before acknowledgement message was received at STREAM head.
+.RE
+.TP 7
+.B EAGAIN \fRor\fP ENOSR
+.RS
+.sp
+Unable to allocate buffers for the acknowledgement message.
+.RE
+.TP 7
+.B EINVAL
+.RS
+Invalid multiplexer ID number.
+.RE
+.sp
+.LP
+An I_UNLINK can also fail while waiting for the multiplexing driver
+to acknowledge the request if a message indicating an error
+or a hangup is received at the STREAM head of \fIfildes\fP. In addition,
+an error code can be returned in the positive or negative
+acknowledgement message. For these cases, I_UNLINK shall fail with
+\fIerrno\fP set to the value in the message.
+.TP 7
+I_PLINK
+Creates a \fIpersistent connection\fP between two STREAMs, where \fIfildes\fP
+is the file descriptor of the STREAM connected
+to the multiplexing driver, and \fIarg\fP is the file descriptor of
+the STREAM connected to another driver. This call shall create
+a persistent connection which can exist even if the file descriptor
+\fIfildes\fP associated with the upper STREAM to the
+multiplexing driver is closed. The STREAM designated by \fIarg\fP
+gets connected via a persistent connection below the
+multiplexing driver. I_PLINK requires the multiplexing driver to send
+an acknowledgement message to the STREAM head. This call
+shall return a multiplexer ID number (an identifier that may be used
+to disconnect the multiplexer; see I_PUNLINK) on success, and
+-1 on failure.
+.LP
+The \fIioctl\fP() function with the I_PLINK command shall fail if:
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.TP 7
+.B ETIME
+.RS
+Timeout before acknowledgement message was received at STREAM head.
+.RE
+.TP 7
+.B EAGAIN \fRor\fP ENOSR
+.RS
+.sp
+Unable to allocate STREAMS storage to perform the I_PLINK.
+.RE
+.TP 7
+.B EBADF
+.RS
+The \fIarg\fP argument is not a valid, open file descriptor.
+.RE
+.TP 7
+.B EINVAL
+.RS
+The \fIfildes\fP argument does not support multiplexing; or \fIarg\fP
+is not a STREAM or is already connected downstream from
+a multiplexer; or the specified I_PLINK operation would connect the
+STREAM head in more than one place in the multiplexed
+STREAM.
+.RE
+.sp
+.LP
+An I_PLINK can also fail while waiting for the multiplexing driver
+to acknowledge the request, if a message indicating an error
+or a hangup is received at the STREAM head of \fIfildes\fP. In addition,
+an error code can be returned in the positive or negative
+acknowledgement message. For these cases, I_PLINK shall fail with
+\fIerrno\fP set to the value in the message.
+.TP 7
+I_PUNLINK
+Disconnects the two STREAMs specified by \fIfildes\fP and \fIarg\fP
+from a persistent connection. The \fIfildes\fP argument
+is the file descriptor of the STREAM connected to the multiplexing
+driver. The \fIarg\fP argument is the multiplexer ID number
+that was returned by the I_PLINK \fIioctl\fP() command when a STREAM
+was connected downstream from the multiplexing driver. If
+\fIarg\fP is MUXID_ALL, then all STREAMs which are persistent connections
+to \fIfildes\fP shall be disconnected. As in I_PLINK,
+this command requires the multiplexing driver to acknowledge the request.
+.LP
+The \fIioctl\fP() function with the I_PUNLINK command shall fail if:
+.TP 7
+.B ENXIO
+.RS
+Hangup received on \fIfildes\fP.
+.RE
+.TP 7
+.B ETIME
+.RS
+Timeout before acknowledgement message was received at STREAM head.
+.RE
+.TP 7
+.B EAGAIN \fRor\fP ENOSR
+.RS
+.sp
+Unable to allocate buffers for the acknowledgement message.
+.RE
+.TP 7
+.B EINVAL
+.RS
+Invalid multiplexer ID number.
+.RE
+.sp
+.LP
+An I_PUNLINK can also fail while waiting for the multiplexing driver
+to acknowledge the request if a message indicating an error
+or a hangup is received at the STREAM head of \fIfildes\fP. In addition,
+an error code can be returned in the positive or negative
+acknowledgement message. For these cases, I_PUNLINK shall fail with
+\fIerrno\fP set to the value in the message.
+.sp
+.SH RETURN VALUE
+.LP
+Upon successful completion, \fIioctl\fP() shall return a value other
+than -1 that depends upon the STREAMS device control
+function. Otherwise, it shall return -1 and set \fIerrno\fP to indicate
+the error.
+.SH ERRORS
+.LP
+Under the following general conditions, \fIioctl\fP() shall fail if:
+.TP 7
+.B EBADF
+The \fIfildes\fP argument is not a valid open file descriptor.
+.TP 7
+.B EINTR
+A signal was caught during the \fIioctl\fP() operation.
+.TP 7
+.B EINVAL
+The STREAM or multiplexer referenced by \fIfildes\fP is linked (directly
+or indirectly) downstream from a multiplexer.
+.sp
+.LP
+If an underlying device driver detects an error, then \fIioctl\fP()
+shall fail if:
+.TP 7
+.B EINVAL
+The \fIrequest\fP or \fIarg\fP argument is not valid for this device.
+.TP 7
+.B EIO
+Some physical I/O error has occurred.
+.TP 7
+.B ENOTTY
+The \fIfildes\fP argument is not associated with a STREAMS device
+that accepts control functions.
+.TP 7
+.B ENXIO
+The \fIrequest\fP and \fIarg\fP arguments are valid for this device
+driver, but the service requested cannot be performed on
+this particular sub-device.
+.TP 7
+.B ENODEV
+The \fIfildes\fP argument refers to a valid STREAMS device, but the
+corresponding device driver does not support the
+\fIioctl\fP() function.
+.sp
+.LP
+If a STREAM is connected downstream from a multiplexer, any \fIioctl\fP()
+command except I_UNLINK and I_PUNLINK shall set
+\fIerrno\fP to [EINVAL].
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+The implementation-defined timeout interval for STREAMS has historically
+been 15 seconds.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fISTREAMS\fP , \fIclose\fP() , \fIfcntl\fP() , \fIgetmsg\fP() , \fIopen\fP()
+, \fIpipe\fP() , \fIpoll\fP() , \fIputmsg\fP() , \fIread\fP() , \fIsigaction\fP()
+, \fIwrite\fP() , the
+Base Definitions volume of IEEE\ Std\ 1003.1-2001, \fI<stropts.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .