Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ () — Motorola System V 88k Release 3.2 Version 1.2C

Media Vault

Software Library

Restoration Projects

Artifacts Sought



  STREAMIO(7)                                           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 multiplexor, 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:



  Page 1                                                   May 1989


















  STREAMIO(7)                                           STREAMIO(7)



       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.

                    [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


  Page 2                                                   May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                    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
                    following 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
                    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


  Page 3                                                   May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                                 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
                                 contains 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
                    process 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
                    process is currently registered to be sent a
                    SIGPOLL signal.  The events are returned as a


  Page 4                                                   May 1989


















  STREAMIO(7)                                           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.



  Page 5                                                   May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                    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 the
                    following value:

                    [EFAULT]     arg points, or the buffer area
                                 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
                    argument 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:



  Page 6                                                   May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                    [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
                    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


  Page 7                                                   May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                    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
                    strfdinsert 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
                    following values:

                    [EAGAIN]     A non-priority message was
                                 specified, 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


  Page 8                                                   May 1989


















  STREAMIO(7)                                           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
                                 descriptor; 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
                                 location in the data buffer; an
                                 undefined 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
                                 configured 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 message.

                    I_FDINSERT can also fail if an error message
                    was received by the stream head of the stream


  Page 9                                                   May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                    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
                    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 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
                    following 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 = infinite, 0 =
                    use default, >0 = as specified) an I_STR
                    request will wait for acknowledgement before
                    timing out.  ic_len is the number of bytes in


  Page 10                                                  May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                    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
                                 allocated address space.

                    [EINVAL]     ic_len is less than 0 or ic_len is
                                 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 acknowledgement was
                                 received.

                    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


  Page 11                                                  May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                    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, 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
                                 contain 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.


  Page 12                                                  May 1989


















  STREAMIO(7)                                           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
                    structure 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
                                 containing a passed file
                                 descriptor.

                    [EFAULT]     arg points outside the allocated
                                 address space.


  Page 13                                                  May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                    [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
                    multiplexing driver, and arg is the file
                    descriptor of the stream connected to another
                    driver.  The stream designated by arg gets
                    connected below the multiplexing driver.
                    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
                    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 acknowledgement
                                 message was received at stream
                                 head.

                    [EAGAIN]     Temporarily unable to allocate
                                 storage to perform the I_LINK.

                    [ENOSR]      Unable to allocate storage to
                                 perform the I_LINK due to
                                 insufficient STREAMS memory
                                 resources.

                    [EBADF]      arg is not a valid, open file
                                 descriptor.



  Page 14                                                  May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                    [EINVAL]     fildes stream does not support
                                 multiplexing.

                    [EINVAL]     arg is not a stream, or is already
                                 linked under a multiplexor.

                    [EINVAL]     The specified link operation would
                                 cause a "cycle" in the resulting
                                 configuration; that is, if a given
                                 stream head is linked into a
                                 multiplexing 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
                    acknowledgement 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
                    stream below the multiplexing driver.  arg is
                    the multiplexor 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
                    multiplexing 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 acknowledgement


  Page 15                                                  May 1989


















  STREAMIO(7)                                           STREAMIO(7)



                                 message was received at stream
                                 head.

                    [ENOSR]      Unable to allocate storage to
                                 perform the I_UNLINK due to
                                 insufficient STREAMS memory
                                 resources.

                    [EINVAL]     arg is an invalid multiplexor 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
                    acknowledgement 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 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.








  Page 16                                                  May 1989
















Typewritten Software • bear@typewritten.org • Edmonds, WA 98026