Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

intro(2)

read(2)

poll(2)

putmsg(2)

write(2)

GETMSG(2)                            SysV                            GETMSG(2)



NAME
     getmsg - get next message off a Stream

SYNOPSIS
     #include <stropts.h>

     int getmsg(fd, ctlptr, dataptr, flags)
     int fd;
     struct strbuf *ctlptr;
     struct strbuf *dataptr;
     int *flags;

DESCRIPTION
     getmsg retrieves the contents of a message (see intro(2)) located at the
     Stream head read queue from a STREAMS file and places the contents into
     user-specified buffer(s).  The message must contain either a data part, a
     control part, or both.  The data and control parts of the message are
     placed into separate buffers, as described below.  The semantics of each
     part is defined by the STREAMS module that generated the message.

     fd specifies a file descriptor referencing an open Stream.  ctlptr and
     dataptr each point to a strbuf structure that contains the following
     members:

          struct strbuf {
               int  maxlen;   /* no. of bytes in buffer */
               int  len; /* no. of bytes returned */
               char *buf;     /* pointer to data */
          };

     where buf points to a buffer in which the data or control information is
     to be placed, and maxlen indicates the maximum number of bytes this
     buffer can hold.  On return, len contains the number of bytes of data or
     control information actually received, or is 0 if there is a zero-length
     control or data part, or is -1 if no data or control information is
     present in the message.  flags may be set to the values 0 or RS_HIPRI and
     is used  as described below.

     ctlptr is used to hold the control part from the message, and dataptr is
     used to hold the data part from the message.  If ctlptr (or dataptr) is
     NULL or the maxlen field is -1, the control (or data) part of the message
     is not processed and is left on the Stream head read queue and len is set
     to -1.  If the maxlen field is set to 0 and there is a zero-length
     control (or data) part, that zero-length part is removed from the read
     queue and len is set to 0.  If the maxlen field is set to 0 and there are
     more than zero bytes of control (or data) information, that information
     is left on the read queue and len is set to 0.  If the maxlen field in
     ctlptr or dataptr is less than, respectively, the control or data part of
     the message, maxlen bytes are retrieved.  In this case, the remainder of
     the message is left on the Stream head read queue and a nonzero return
     value is provided, as described under "RETURN VALUE." If information is
     retrieved from a priority message, flags is set to RS_HIPRI on return.

     By default, getmsg processes the first priority or non-priority message
     available on the Stream head read queue.  However, a user may choose to
     retrieve only priority messages by setting flags to RS_HIPRI.  In this
     case, getmsg will only process the next message if it is a priority
     message.

     If O_NDELAY has not been set, getmsg blocks until a message, of the
     type(s) specified by flags (priority or either), is available on the
     Stream head read queue.  If O_NDELAY has been set and a message of the
     specified type(s) is not present on the read queue, getmsg fails and sets
     errno to EAGAIN.

     If a hangup occurs on the Stream from which messages are to be retrieved,
     getmsg will continue to operate normally, as described above, until the
     Stream head read queue is empty.  Thereafter, it will return 0 in the len
     fields of ctlptr and dataptr.

ERRORS
     getmsg fails if one or more of the following are true:

     [EAGAIN]    The O_NDELAY flag is set, and no messages are available.

     [EBADF]     fd is not a valid file descriptor open for reading.

     [EBADMSG]   Queued message to be read is not valid for getmsg.

     [EFAULT]    ctlptr, dataptr, or flags points to a location outside the
                 allocated address space.

     [EINTR]     A signal was caught during the getmsg system call.

     [EINVAL]    An illegal value was specified in flags, or the Stream
                 referenced by fd is linked under a multiplexor.

     [ENOSTR]    A Stream is not associated with fd.

     A getmsg can also fail if a STREAMS error message had been received at
     the Stream head before the call to getmsg.  The error returned is the
     value contained in the STREAMS error message.

SEE ALSO
     intro(2), read(2), poll(2), putmsg(2), write(2).
     Getting Started with SysV STREAMS, Programming with SysV STREAMS.

DIAGNOSTICS
     Upon successful completion, a non-negative value is returned.  A value of
     0 indicates that a full message was read successfully.  A return value of
     MORECTL indicates that more control information is waiting for retrieval.
     A return value of MOREDATA indicates that more data is waiting for
     retrieval.  A return value of MORECTL|MOREDATA indicates that both types
     of information remain.  Subsequent getmsg calls will retrieve the
     remainder of the message.

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