Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ streamio(7) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

close(2)

fcntl(2)

getmsg(2)

ioctl(2)

open(2)

poll(2)

putmsg(2)

read(2)

signal(2)

write(2)

signal(5)

streamio(7)                                                     streamio(7)

NAME
     streamio - STREAMS ioctl commands

SYNOPSIS
     #include <sys/types.h>
     #include <stropts.h>

     int ioctl(int fildes, int command, ... /* arg */);

DESCRIPTION
     STREAMS ioctl commands are a subset of the ioctl(2) system calls which
     perform a variety of control functions on streams.

     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. The command
     and arg are interpreted by the stream head. Certain combinations of
     these arguments may be passed to a module or driver in the stream.

     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 func-
     tion, if the stream referenced by fildes is linked below a multi-
     plexer, 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 sys-
     tem calls to fail with errno set to this value.

COMMAND FUNCTIONS
     The following ioctl commands, with error values indicated, are appli-
     cable to all STREAMS files:

     IPUSH       Pushes the module whose name is pointed to by 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, 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.



Page 1                       Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

     IPOP        Removes the module just below the stream head of the
                  stream pointed to by fildes. To remove a module from a
                  pipe requires that the module was pushed on the side it
                  is being removed from. arg should be 0 in an IPOP
                  request. On failure, errno is set to one of the following
                  values:

                  EINVAL       No module present in the stream.

                  ENXIO        Hangup received on fildes.

     ILOOK       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 follow-
                  ing values:

                  EFAULT       arg points outside the allocated address
                               space.

                  EINVAL       No module present in stream.

     IFLUSH      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.

                  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 arg.

                  If FLUSHR is set and 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 fildes is a FIFO, both
                  queues are flushed.

                  If FLUSHW is set and 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 fildes is a FIFO, both queues of the FIFO are
                  flushed.

                  If 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.



Page 2                       Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  Correct flush handling of a pipe or FIFO with modules
                  pushed is achieved via the pipemod module. This module
                  should be the first module pushed onto a pipe so that it
                  is at the midpoint of the pipe itself.

                  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.

     IFLUSHBAND  Flushes a particular band of messages. arg points to a
                  bandinfo structure that has the following members:

                  unsigned char   bipri;
                  int             biflag;

                  The biflag field may be one of FLUSHR, FLUSHW, or
                  FLUSHRW as described earlier.

     ISETSIG     Informs the stream head that the user wishes the kernel
                  to issue the SIGPOLL signal [see signal(2)] when a par-
                  ticular event has occurred on the stream associated with
                  fildes. ISETSIG supports an asynchronous processing
                  capability in STREAMS. The value of arg is a bitmask that
                  specifies the events for which the user should be sig-
                  naled. It is the bitwise-OR of any combination of the
                  following constants:

                  SINPUT      Any message other than an MPCPROTO has
                               arrived in a stream head read queue. This
                               event is maintained for compatibility with
                               prior UNIX System V releases. This is set
                               even if the message is of zero length.

                  SRDNORM     An ordinary (non-priority) message has
                               arrived in a stream head read queue. This is
                               set even if the message is of zero length.

                  SRDBAND     A priority band message (band > 0) has
                               arrived in a stream head read queue. This is
                               set even if the message is of zero length.

                  SHIPRI      A high priority message is present in the
                               stream head read queue. This is set even if
                               the message is of zero length.




Page 3                       Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  SOUTPUT     The write queue just below the stream head
                               is no longer full. This notifies the user
                               that there is room in the queue for sending
                               (or writing) data downstream.

                  SWRNORM     This event is the same as SOUTPUT.

                  SWRBAND     A priority band greater than 0 of a queue
                               downstream exists and is writable. This
                               notifies the user that there is room in the
                               queue for sending (or writing) priority data
                               downstream.

                  SMSG        A STREAMS signal message that contains the
                               SIGPOLL signal has reached the front of the
                               stream head read queue.

                  SERROR      An MERROR message has reached the stream
                               head.

                  SHANGUP     An MHANGUP message has reached the stream
                               head.

                  SBANDURG    When used in conjunction with SRDBAND,
                               SIGURG is generated instead of SIGPOLL when
                               a priority message reaches the front of the
                               stream head read queue.

                  A user process may choose to be signaled only of high
                  priority messages by setting the arg bitmask to the value
                  SHIPRI.

                  Processes that wish to receive SIGPOLL signals must
                  explicitly register to receive them using ISETSIG. If
                  several processes register to receive this signal for the
                  same event on the same stream, each process will be sig-
                  naled when the event occurs.

                  If the value of arg is zero, the calling process will be
                  unregistered and will not receive further SIGPOLL sig-
                  nals. On failure, errno is set to one of the following
                  values:

                  EINVAL       arg value is invalid or arg is zero and pro-
                               cess is not registered to receive the
                               SIGPOLL signal.

                  EAGAIN       Allocation of a data structure to store the
                               signal request failed.





Page 4                       Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

     IGETSIG     Returns the events for which the calling process is
                  currently registered to be sent a SIGPOLL signal. The
                  events are returned as a bitmask pointed to by arg, where
                  the events are those specified in the description of
                  ISETSIG 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.

     IFIND       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.

     IPEEK       Allows a user to retrieve the information in the first
                  message in the stream head read queue without taking the
                  message off the queue. IPEEK is analogous to getmsg(2)
                  except that it does not remove the message from the
                  queue. arg points to a strpeek structure which contains
                  the following members:

                  struct strbuf   ctlbuf;
                  struct strbuf   databuf;
                  long    flags;

                  The maxlen field in the ctlbuf and databuf strbuf struc-
                  tures [see getmsg(2)] must be set to the number of bytes
                  of control information and/or data information, respec-
                  tively, to retrieve. flags may be set to RSHIPRI or 0.
                  If RSHIPRI is set, IPEEK will look for a high priority
                  message in the stream head read queue. Otherwise, IPEEK
                  will look for the first message on the stream head read
                  queue.

                  IPEEK returns 1 if a message was retrieved, and returns
                  0 if no message was found in 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 RSHIPRI or 0. On failure, errno
                  is set to the following value:



Page 5                       Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  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
                               IPEEK.

                  EINVAL       Illegal value for flags.

     ISRDOPT     Sets the read mode [see read(2)] 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.

                  In addition, treatment of control messages by the stream
                  head may be changed by setting the following flags in
                  arg:

                  RPROTNORM    Fail read() with EBADMSG if a control mes-
                               sage is at the front of the stream head read
                               queue.

                  RPROTDAT     Deliver the control portion of a message as
                               data when a user issues read(). This is the
                               default behavior.

                  RPROTDIS     Discard the control portion of a message,
                               delivering any data portion, when a user
                               issues a read().

                  On failure, errno is set to the following value:

                  EINVAL       arg is not one of the above legal values.

     IGRDOPT     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.

     INREAD      Counts the number of data bytes in data blocks in the
                  first message in 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 in 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 in the
                  queue. On failure, errno is set to the following value:


Page 6                       Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  EFAULT       arg points outside the allocated address
                               space.

     IFDINSERT   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 strbuf   ctlbuf;
                  struct strbuf   databuf;
                  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 speci-
                  fies 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
                  IFDINSERT 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 struc-
                  ture. 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. An
                  ordinary (non-priority) message is created if flags is
                  set to 0, a high priority message is created if flags is
                  set to RSHIPRI. For normal messages, IFDINSERT will
                  block if the stream write queue is full due to internal
                  flow control conditions. For high priority messages,
                  IFDINSERT does not block on this condition. For normal
                  messages, IFDINSERT does not block when the write queue
                  is full and ONDELAY or ONONBLOCK is set. Instead, it
                  fails and sets errno to EAGAIN.

                  IFDINSERT also blocks, unless prevented by lack of
                  internal resources, waiting for the availability of mes-
                  sage blocks, regardless of priority or whether ONDELAY
                  or ONONBLOCK has been specified. No partial message is
                  sent. On failure, errno is set to one of the following
                  values:



Page 7                       Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  EAGAIN       A non-priority message was specified, the
                               ONDELAY or ONONBLOCK flag is set, and the
                               stream write queue is full due to internal
                               flow control conditions.

                  ENOSR        Buffers could not be allocated for the mes-
                               sage that was to be created due to insuffi-
                               cient STREAMS memory 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 mes-
                               sage, or the len field for the buffer speci-
                               fied through ctlbuf is larger than the max-
                               imum configured size of the control part of
                               a message.

                  IFDINSERT 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.













Page 8                       Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

     ISTR        Constructs an internal STREAMS ioctl message from the
                  data pointed to by arg, and sends that message down-
                  stream.

                  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.
                  ISTR 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 ISTR can be active on a stream. Further
                  ISTR calls will block until the active ISTR completes
                  at the stream head. The default timeout interval for
                  these requests is 15 seconds. The ONDELAY and ONONBLOCK
                  [see open(2)] flags have no effect on this call.

                  To send requests downstream, arg must point to a strioctl
                  structure which contains the following members:

                  int     iccmd;
                  int     ictimout;
                  int     iclen;
                  char    *icdp;

                  iccmd is the internal ioctl command intended for a down-
                  stream module or driver and ictimout is the number of
                  seconds (-1 = infinite, 0 = use default, > 0 = as speci-
                  fied) an ISTR request will wait for acknowledgement
                  before timing out. The default timeout is infinite.
                  iclen is the number of bytes in the data argument and
                  icdp is a pointer to the data argument. The iclen 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 icdp 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.





Page 9                       Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  EFAULT       arg points, or the buffer area specified by
                               icdp and iclen (separately for data sent
                               and data returned) is, outside the allocated
                               address space.

                  EINVAL       iclen is less than 0 or iclen is larger
                               than the maximum configured size of the data
                               part of a message or ictimout is less than
                               -1.

                  ENXIO        Hangup received on fildes.

                  ETIME        A downstream ioctl timed out before ack-
                               nowledgement was received.

                  An ISTR can also fail while waiting for an acknowledge-
                  ment 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 acknowledge-
                  ment message, in the event the ioctl command sent down-
                  stream fails. For these cases, ISTR will fail with errno
                  set to the value in the message.

     ISWROPT     Sets the write mode using the value of the argument arg.
                  Legal bit settings for arg are:

                  SNDZERO      Send a zero-length message downstream when a
                               write of 0 bytes occurs.

                  To not send a zero-length message when a write of 0 bytes
                  occurs, this bit must not be set in arg.

                  On failure, errno may be set to the following value:

                  EINVAL       arg is the the above legal value.

     IGWROPT     Returns the current write mode setting, as described
                  above, in the int that is pointed to by the argument arg.

     ISENDFD     Requests the stream associated with fildes to send a mes-
                  sage, containing a file pointer, to the stream head at
                  the other end of a stream pipe. The file pointer corre-
                  sponds to arg, which must be an open file descriptor.

                  ISENDFD 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 asso-
                  ciated with the sending process are also inserted. This
                  message is placed directly in the read queue 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:


Page 10                      Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  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 ISENDFD.

                  EBADF        arg is not a valid, open file descriptor.

                  EINVAL       fildes is not connected to a stream pipe.

                  ENXIO        Hangup received on fildes.

     IRECVFD     Retrieves the file descriptor associated with the message
                  sent by an ISENDFD 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;
                  uidt uid;
                  gidt 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 ONDELAY and ONONBLOCK are clear [see open(2)],
                  IRECVFD will block until a message is present at the
                  stream head. If ONDELAY or ONONBLOCK is set, IRECVFD
                  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
                  ISENDFD, 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 is not present at the stream head
                               read queue, and the ONDELAY or ONONBLOCK
                               flag is set.

                  EBADMSG      The message at the stream head read queue is
                               not a message containing a passed file
                               descriptor.

                  EFAULT       arg points outside the allocated address
                               space.


Page 11                      Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  EMFILE       NOFILES file descriptors are currently open.

                  ENXIO        Hangup received on fildes.

                  EOVERFLOW    uid or gid is too large to be stored in the
                               structure pointed to by arg.

     ILIST       Allows the user to list all the module names on the
                  stream, up to and including the topmost driver name. If
                  arg is NULL, the return value is the number of modules,
                  including the driver, that are on the stream pointed to
                  by fildes. This allows the user to allocate enough space
                  for the module names. If arg is non-NULL, it should point
                  to an strlist structure that has the following members:

                  int slnmods;
                  struct strmlist   *slmodlist;

                  The strmlist structure has the following member:

                  char lname[FMNAMESZ+1];

                  slnmods indicates the number of entries the user has
                  allocated in the array and on return, slmodlist contains
                  the list of module names. The return value indicates the
                  number of entries that have been filled in. On failure,
                  errno may be set to one of the following values:

                  EINVAL       The slnmods member is less than 1.

                  EAGAIN       Unable to allocate buffers

     IATMARK     Allows the user to see if the current message in the
                  stream head read queue is "marked" by some module down-
                  stream. arg determines how the checking is done when
                  there may be multiple marked messages in the stream head
                  read queue. It may take the following values:

                  ANYMARK      Check if the message is marked.

                  LASTMARK     Check if the message is the last one marked
                               in the queue.

                  The return value is 1 if the mark condition is satisfied
                  and 0 otherwise. On failure, errno may be set to the fol-
                  lowing value:

                  EINVAL       Invalid arg value.






Page 12                      Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

     ICKBAND     Check if the message of a given priority band exists in
                  the stream head read queue. This returns 1 if a message
                  of a given priority exists, or -1 on error. arg should be
                  an integer containing the value of the priority band in
                  question. On failure, errno may be set to the following
                  value:

                  EINVAL       Invalid arg value.

     IGETBAND    Returns the priority band of the first message in the
                  stream head read queue in the integer referenced by arg.
                  On failure, errno may be set to the following value:

                  ENODATA      No message in the stream head read queue.

     ICANPUT     Check if a certain band is writable. arg is set to the
                  priority band in question. The return value is 0 if the
                  priority band arg is flow controlled, 1 if the band is
                  writable, or -1 on error. On failure, errno may be set to
                  the following value:

                  EINVAL       Invalid arg value.

     ISETCLTIME  Allows the user to set the time the stream head will
                  delay when a stream is closing and there is data in 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. If, after the delay, there is
                  still data present, it will be flushed. arg is the number
                  of milliseconds to delay, rounded up to the nearest legal
                  value on the system. The default is fifteen seconds. On
                  failure, errno may be set to the following value:

                  EINVAL       Invalid arg value.

     IGETCLTIME  Returns the close time delay in the integer pointed by
                  arg.

     The following four commands are used for connecting and disconnecting
     multiplexed STREAMS configurations.

     ILINK       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 con-
                  nected below the multiplexing driver. ILINK requires the
                  multiplexing driver to send an acknowledgement message to
                  the stream head regarding the linking operation. This
                  call returns a multiplexer ID number (an identifier used
                  to disconnect the multiplexer, see IUNLINK) on success,
                  and a -1 on failure. On failure, errno is set to one of
                  the following values:


Page 13                      Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  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 ILINK.

                  ENOSR        Unable to allocate storage to perform the
                               ILINK due to insufficient 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 driver is linked into a multi-
                               plexing configuration in more than one place.

                  EINVAL       fildes is the file descriptor of a pipe or
                               FIFO.

                  An ILINK can also fail while waiting for the multiplex-
                  ing 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 mes-
                  sage. For these cases, ILINK will fail with errno set to
                  the value in the message.

     IUNLINK     Disconnects the two streams specified by fildes and arg.
                  fildes is the file descriptor of the stream connected to
                  the multiplexing driver. arg is the multiplexer ID number
                  that was returned by the ILINK. If arg is -1, then all
                  streams which were linked to fildes are disconnected. As
                  in ILINK, 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 message was
                               received at stream head.

                  ENOSR        Unable to allocate storage to perform the
                               IUNLINK due to insufficient STREAMS memory
                               resources.


Page 14                      Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  EINVAL       arg is an invalid multiplexer ID number or
                               fildes is not the stream on which the ILINK
                               that returned arg was performed.

                  EINVAL       fildes is the file descriptor of a pipe or
                               FIFO.

                  An IUNLINK can also fail while waiting for the multi-
                  plexing driver to acknowledge the link request, if a mes-
                  sage 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 mes-
                  sage. For these cases, IUNLINK will fail with errno set
                  to the value in the message.

     IPLINK      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 is connected
                  via a persistent link below the multiplexing driver.
                  IPLINK requires the multiplexing driver to send an ack-
                  nowledgement message to the stream head regarding the
                  linking operation. This call creates a persistent link
                  which can exist even if the file descriptor fildes asso-
                  ciated with the upper stream to the multiplexing driver
                  is closed. This call returns a multiplexer ID number (an
                  identifier that may be used to disconnect the multi-
                  plexer, see IPUNLINK) on success, and a -1 on failure.
                  On failure, errno may be set to one of the following
                  values:

                  ENXIO        Hangup received on fildes.

                  ETIME        Time out before acknowledgement message was
                               received at the stream head.

                  EAGAIN       Unable to allocate STREAMS storage to per-
                               form the IPLINK.

                  EBADF        arg is not a valid, open file descriptor.

                  EINVAL       fildes 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
                               multiplexing configuration in more than one
                               place.



Page 15                      Reliant UNIX 5.44                Printed 11/98

streamio(7)                                                     streamio(7)

                  EINVAL       fildes is the file descriptor of a pipe or
                               FIFO.

                  An IPLINK can also fail while waiting for the multiplex-
                  ing driver to acknowledge the link request, if a message
                  indicating an error on a hangup is received at the stream
                  head of fildes. In addition, an error code can be
                  returned in the positive or negative acknowledgement mes-
                  sage. For these cases, IPLINK will fail with errno set
                  to the value in the message.

     IPUNLINK    Disconnects the two streams specified by fildes and arg
                  that are connected with a persistent link. fildes is the
                  file descriptor of the stream connected to the multiplex-
                  ing driver. arg is the multiplexer ID number that was
                  returned by IPLINK when a stream was linked below the
                  multiplexing driver. If arg is MUXIDALL then all streams
                  which are persistent links to fildes are disconnected. As
                  in IPLINK, this command requires the multiplexing driver
                  to acknowledge the unlink. On failure, errno may be set
                  to one of the following values:

                  ENXIO        Hangup received on fildes.

                  ETIME        Time out before acknowledgement message was
                               received at the stream head.

                  EAGAIN       Unable to allocate buffers for the ack-
                               nowledgement message.

                  EINVAL       Invalid multiplexer ID number.

                  EINVAL       fildes is the file descriptor of a pipe or
                               FIFO.

                  An IPUNLINK can also fail while waiting for the multi-
                  plexing driver to acknowledge the link request if a mes-
                  sage 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 mes-
                  sage. For these cases, IPUNLINK will fail with errno set
                  to the value in the message.

DIAGNOSTICS
     Unless specified otherwise above, the return value from ioctl is 0
     upon success and -1 upon failure with errno set as indicated.

SEE ALSO
     close(2), fcntl(2), getmsg(2), introprm2(2), ioctl(2), open(2),
     poll(2), putmsg(2), read(2), signal(2), write(2), signal(5).

     Programmer's Guide: STREAMS


Page 16                      Reliant UNIX 5.44                Printed 11/98

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