STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
NAME
streamio - STREAMS ioctl commands
SYNOPSIS
#include <stropts.h>
int ioctl fildes, command, arg)
int fildes, command;
DESCRIPTION
STREAMS [see intro(2)] ioctl commands are a subset of
ioctl(2) system calls which perform a variety of control
functions on streams. The arguments command and arg are
passed to the file designated by fildes and are interpreted
by the stream head. Certain combinations of these arguments
may be passed to a module or driver in the stream.
fildes is an open file descriptor that refers to a stream.
command determines the control function to be performed as
described below. arg represents additional information that
is needed by this command. The type of arg depends upon the
command, but it is generally an integer or a pointer to a
command-specific data structure.
Since these STREAMS commands are a subset of ioctl, they are
subject to the errors described there. In addition to those
errors, the call will fail with errno set to EINVAL, without
processing a control function, if the stream referenced by
fildes is linked below a multiplexer, or if command is not a
valid value for a stream.
Also, as described in ioctl, 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 system calls to fail with errno set
to this value.
COMMAND FUNCTIONS
The following ioctl commands, with error values indicated,
are applicable to all STREAMS files:
I_PUSH Pushes the module whose name is pointed to by
arg onto the top of the current stream, just
below the stream head. It then calls the open
routine of the newly-pushed module. On
failure, errno is set to one of the following
values:
[EINVAL] Invalid module name.
[EFAULT] arg points outside the allocated
address space.
[ENXIO] Open routine of new module failed.
Rev. Page 1
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
[ENXIO] Hangup received on fildes.
I_POP Removes the module just below the stream head
of the stream pointed to by fildes. arg should
be 0 in an I_POP request. On failure, errno is
set to one of the following values:
[EINVAL] No module present in the stream.
[ENXIO] Hangup received on fildes.
I_LOOK Retrieves the name of the module just below the
stream head of the stream pointed to by fildes,
and places it in a null terminated character
string pointed at by arg. The buffer pointed
to by arg should be at least FMNAMESZ+1 bytes
long. An [#include <sys/conf.h>] declaration
is required. On failure, errno is set to one
of the following values:
[EFAULT] arg points outside the allocated
address space.
[EINVAL] No module present in stream.
I_FLUSH This request flushes all input and/or output
queues, depending on the value of arg. Legal
arg values are:
FLUSHR Flush read queues.
FLUSHW Flush write queues.
FLUSHRW Flush read and write queues.
On failure, errno is set to one of the follow-
ing values:
[ENOSR] Unable to allocate buffers for
flush message due to insufficient
STREAMS memory resources.
[EINVAL] Invalid arg value.
[ENXIO] Hangup received on fildes.
I_SETSIG Informs the stream head that the user wishes
the kernel to issue the SIGPOLL signal [see
signal(2) and sigset(2)] when a particular
event has occurred on the stream associated
with fildes. I_SETSIG supports an asynchronous
processing capability in STREAMS. The value of
arg is a bitmask that specifies the events for
Rev. Page 2
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
which the user should be signaled. It is the
bitwise-OR of any combination of the following
constants:
S_INPUT A non-priority message has arrived
on a stream head read queue, and
no other messages existed on that
queue before this message was
placed there. This is set even if
the message is of zero length.
S_HIPRI A priority message is present on
the stream head read queue. This
is set even if the message is of
zero length.
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.
S_MSG A STREAMS signal message that con-
tains the SIGPOLL signal has
reached the front of the stream
head read queue.
A user process may choose to be signaled only
of priority messages by setting the arg bitmask
to the value S_HIPRI.
Processes that wish to receive SIGPOLL signals
must 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 will be signaled when
the event occurs.
If the value of arg is zero, the calling pro-
cess will be unregistered and will not receive
further SIGPOLL signals. On failure, errno is
set to one of the following values:
[EINVAL] arg value is invalid or arg is
zero and process is not registered
to receive the SIGPOLL signal.
[EAGAIN] Allocation of a data structure to
store the signal request failed.
I_GETSIG Returns the events for which the calling pro-
cess is currently registered to be sent a SIG-
POLL signal. The events are returned as a
Rev. Page 3
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
bitmask pointed to by arg, where the events are
those specified in the description of I_SETSIG
above. On failure, errno is set to one of the
following values:
[EINVAL] Process not registered to receive
the SIGPOLL signal.
[EFAULT] arg points outside the allocated
address space.
I_FIND Compares the names of all modules currently
present in the stream to the name pointed to by
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, errno
is set to one of the following values:
[EFAULT] arg points outside the allocated
address space.
[EINVAL] arg does not contain a valid
module name.
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. arg
points to a strpeek structure which contains
the following members:
struct strbufctlbuf;
struct strbufdatabuf;
long flags;
The maxlen field in the ctlbuf and databuf
strbuf structures [see getmsg(2)] must be set
to the number of bytes of control information
and/or data information, respectively, to
retrieve. If the user sets flags to RS_HIPRI,
I_PEEK will only look for a priority message on
the stream head read queue.
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 flags and a priority message was not
present on the stream head read queue. It does
not wait for a message to arrive. On return,
ctlbuf specifies information in the control
buffer, databuf specifies information in the
data buffer, and flags contains the value 0 or
RS_HIPRI. On failure, errno is set to one of
the following values:
[EFAULT] arg points, or the buffer area
Rev. Page 4
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
specified in ctlbuf or databuf is,
outside the allocated address
space.
[EBADMSG] Queued message to be read is not
valid for I_PEEK
I_SRDOPT Sets the read mode using the value of the argu-
ment arg. Legal arg values are:
RNORM Byte-stream mode, the default.
RMSGD Message-discard mode.
RMSGN Message-nondiscard mode.
Read modes are described in read(2). On
failure, errno is set to the following value:
[EINVAL] arg is not one of the above legal
values.
I_GRDOPT Returns the current read mode setting in an int
pointed to by the argument arg. Read modes are
described in read(2). On failure, errno is set
to the following value:
[EFAULT] arg points outside the allocated
address space.
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 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 arg, but the ioctl return value is
greater than zero, this indicates that a zero-
length message is next on the queue. On
failure, errno is set to the following value:
[EFAULT] arg points outside the allocated
address space.
I_FDINSERT Creates a message from user 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.
arg points to a strfdinsert structure which
Rev. Page 5
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
contains the following members:
struct strbufctlbuf;
struct strbufdatabuf;
long flags;
int fildes;
int offset;
The len field in the ctlbuf strbuf structure
[see putmsg(2)] must be set to the size of a
pointer plus the number of bytes of control
information to be sent with the message.
fildes in the strfdinsert structure specifies
the file descriptor of the other stream.
offset, which must be word-aligned, specifies
the number of bytes beyond the beginning of the
control buffer where I_FDINSERT will store a
pointer. This pointer will be the address of
the read queue structure of the driver for the
stream corresponding to fildes in the strfdin-
sert structure. The len field in the databuf
strbuf structure must be set to the number of
bytes of data information to be sent with the
message or zero if no data part is to be sent.
flags specifies the type of message to be
created. A non-priority message is created if
flags is set to 0, and a priority message is
created if flags is set to RS_HIPRI. For non-
priority messages, I_FDINSERT will 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_NDELAY
is set. Instead, it fails and sets errno to
EAGAIN.
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_NDELAY has
been specified. No partial message is sent.
On failure, errno is set to one of the follow-
ing values:
[EAGAIN] A non-priority message was speci-
fied, the O_NDELAY flag is set,
and the stream write queue is
full due to internal flow control
conditions.
[ENOSR] Buffers could not be allocated for
the message that was to be created
due to insufficient STREAMS memory
Rev. Page 6
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
resources.
[EFAULT] arg points, or the buffer area
specified in ctlbuf or databuf is,
outside the allocated address
space.
[EINVAL] One of the following: fildes in
the strfdinsert structure is not a
valid, open stream file descrip-
tor; the size of a pointer plus
offset is greater than the len
field for the buffer specified
through ctlptr; offset does not
specify a properly aligned loca-
tion in the data buffer; an unde-
fined value is stored in flags.
[ENXIO] Hangup received on fildes of the
ioctl call or fildes in the
strfdinsert structure.
[ERANGE] The len field for the buffer
specified through databuf does not
fall within the range specified by
the maximum and minimum packet
sizes of the topmost stream
module, or the len field for the
buffer specified through databuf
is larger than the maximum config-
ured size of the data part of a
message, or the len field for the
buffer specified through ctlbuf is
larger than the maximum configured
size of the control part of a mes-
sage.
I_FDINSERT can also fail if an error message
was received by the stream head of the stream
corresponding to fildes in the strfdinsert
structure. In this case, errno will be set to
the value in the message.
I_STR Constructs an internal STREAMS ioctl message
from the data pointed to by arg and sends that
message downstream.
This mechanism is provided to send user ioctl
requests to downstream modules and drivers. It
allows information to be sent with the ioctl
and will return to the user any information
sent upstream by the downstream recipient.
I_STR blocks until the system responds with
Rev. Page 7
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
either a positive or negative acknowledgment
message or until the request "times out" after
some period of time. If the request times out,
it fails with errno set to ETIME.
At most, one I_STR can be active on a stream.
Further I_STR calls will block until the active
I_STR completes at the stream head. The
default timeout interval for these requests is
15 seconds. The O_NDELAY [see open(2)] flag
has no effect on this call.
To send requests downstream, arg must point to
a strioctl structure which contains the follow-
ing members:
int ic_cmd; /* downstream command */
int ic_timout;/* ACK/NAK timeout */
int ic_len; /* length of data arg */
char *ic_dp; /* ptr to data arg */
ic_cmd is the internal ioctl command intended
for a downstream module or driver; and
ic_timout is the number of seconds (-1 = infin-
ite, 0 = use default, >0 = as specified) an
I_STR request will wait for acknowledgment
before timing out. ic_len is the number of
bytes in the data argument and ic_dp is a
pointer to the data argument. The 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 ic_dp should be large enough to
contain the maximum amount of data that any
module or the driver in the stream can return).
The stream head will convert the information
pointed to by the strioctl structure to an
internal ioctl command message and send it
downstream. On failure, errno is set to one of
the following values:
[ENOSR] Unable to allocate buffers for the
ioctl message due to insufficient
STREAMS memory resources.
[EFAULT] arg points, or the buffer area
specified by ic_dp and ic_len
(separately for data sent and data
returned) is, outside the allo-
cated address space.
[EINVAL] ic_len is less than 0 or ic_len is
Rev. Page 8
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
larger than the maximum configured
size of the data part of a message
or ic_timout is less than -1.
[ENXIO] Hangup received on fildes.
[ETIME] A downstream ioctl timed out
before acknowledgment was
received.
An I_STR can also fail while waiting for an
acknowledgment 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 acknowledgment message, in
the event the ioctl command sent downstream
fails. For these cases, I_STR will fail with
errno set to the value in the message.
I_SENDFD Requests the stream associated with 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 arg,
which must be an integer file descriptor.
I_SENDFD converts 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 intro(2)] of the stream head at the
other end of the stream pipe to which it is
connected. On failure, errno is set to one of
the following values:
[EAGAIN] The sending stream is unable to
allocate a message block to con-
tain the file pointer.
[EAGAIN] The read queue of the receiving
stream head is full and cannot
accept the message sent by
I_SENDFD.
[EBADF] arg is not a valid, open file
descriptor.
[EINVAL] fildes is not connected to a
stream pipe.
[ENXIO] Hangup received on fildes.
Rev. Page 9
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
I_RECVFD Retrieves the file descriptor associated with
the message sent by an I_SENDFD ioctl over a
stream pipe. arg is a pointer to a data buffer
large enough to hold an strrecvfd data struc-
ture containing the following members:
int fd;
unsigned short uid;
unsigned short gid;
char fill[8];
fd is an integer file descriptor. uid and gid
are the user id and group id, respectively, of
the sending stream.
If O_NDELAY is not set [see open(2)], I_RECVFD
will block until a message is present at the
stream head. If O_NDELAY is set, I_RECVFD will
fail with errno set to EAGAIN if no message is
present at the stream head.
If the message at the stream head is a message
sent by an 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 fd field of the strrecvfd structure.
The structure is copied into the user data
buffer pointed to by arg. On failure, errno is
set to one of the following values:
[EAGAIN] A message was not present at the
stream head read queue, and the
O_NDELAY flag is set.
[EBADMSG] The message at the stream head
read queue was not a message con-
taining a passed file descriptor.
[EFAULT] arg points outside the allocated
address space.
[EMFILE] NOFILES file descriptors are
currently open.
[ENXIO] Hangup received on fildes.
The following two commands are used for connecting and
disconnecting multiplexed STREAMS configurations.
I_LINK Connects two streams, where fildes is the file
descriptor of the stream connected to the mul-
tiplexing driver, and arg is the file descrip-
tor of the stream connected to another driver.
The stream designated by arg gets connected
Rev. Page 10
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
below the multiplexing driver. I_LINK requires
the multiplexing driver to send an acknowledg-
ment message to the stream head regarding the
linking operation. This call returns a multi-
plexer ID number (an identifier used to discon-
nect the multiplexer, see I_UNLINK) on success,
and a -1 on failure. On failure, errno is set
to one of the following values:
[ENXIO] Hangup received on fildes.
[ETIME] Time out before acknowledgment
message was received at stream
head.
[EAGAIN] Temporarily unable to allocate
storage to perform the I_LINK.
[ENOSR] Unable to allocate storage to per-
form the I_LINK due to insuffi-
cient STREAMS memory resources.
[EBADF] arg is not a valid, open file
descriptor.
[EINVAL] fildes stream does not support
multiplexing.
[EINVAL] arg is not a stream, or is already
linked under a multiplexer.
[EINVAL] The specified link operation would
cause a "cycle" in the resulting
configuration; that is, if a given
stream head is linked into a mul-
tiplexing configuration in more
than one place.
An 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
fildes. In addition, an error code can be
returned in the positive or negative ack-
nowledgment message. For these cases, I_LINK
will fail with errno set to the value in the
message.
I_UNLINK Disconnects the two streams specified by fildes
and arg. fildes is the file descriptor of the
stream connected to the multiplexing driver.
fildes must correspond to the stream on which
the ioctl I_LINK command was issued to link the
Rev. Page 11
STREAMIO(7) INTERACTIVE UNIX System STREAMIO(7)
stream below the multiplexing driver. arg is
the multiplexer ID number that was returned by
the I_LINK. If arg is -1, then all Streams
which were linked to fildes are disconnected.
As in I_LINK, this command requires the multi-
plexing driver to acknowledge the unlink. On
failure, errno is set to one of the following
values:
[ENXIO] Hangup received on fildes.
[ETIME] Time out before acknowledgment
message was received at stream
head.
[ENOSR] Unable to allocate storage to per-
form the I_UNLINK due to insuffi-
cient STREAMS memory resources.
[EINVAL] arg is an invalid multiplexer ID
number or fildes is not the stream
on which the I_LINK that returned
arg was performed.
An 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
fildes. In addition, an error code can be
returned in the positive or negative ack-
nowledgment message. For these cases, I_UNLINK
will fail with errno set to the value in the
message.
SEE ALSO
close(2), fcntl(2), intro(2), ioctl(2), open(2), read(2),
getmsg(2), poll(2), putmsg(2), signal(2), sigset(2),
write(2) in the INTERACTIVE SDS Guide and Programmer's
Reference Manual.
STREAMS Programmer's Guide.
STREAMS Primer.
DIAGNOSTICS
Unless specified otherwise above, the return value from
ioctl is 0 upon success and -1 upon failure with errno set
as indicated.
Rev. Page 12