Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ putmsg(2) — NEWS-os 5.0.1

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

getmsg(2)

intro(2)

poll(2)

putmsg(2)

read(2)

write(2)



putmsg(2)                 SYSTEM CALLS                  putmsg(2)



NAME
     putmsg - send a message on a stream

SYNOPSIS
     #include <stropts.h>

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

     int putpmsg(int fd, const struct strbuf *ctlptr,
                const struct strbuf *dataptr, int band, int flags);

DESCRIPTION
     putmsg creates a message from user-specified  buffer(s)  and
     sends  the  message to a STREAMS file.  The message may con-
     tain either a data part, a control part, or both.  The  data
     and  control parts to be sent are distinguished by placement
     in separate buffers, as described below.  The  semantics  of
     each part is defined by the STREAMS module that receives the
     message.

     The function putpmsg does the same thing as putmsg, but pro-
     vides  the  user  the  ability to send messages in different
     priority bands.  Except where noted,  all  information  per-
     taining to putmsg also pertains to putpmsg.

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

          int maxlen;     /* not used */
          int len;        /* length of data */
          void *buf;      /* ptr to buffer */

     ctlptr points to the structure describing the control  part,
     if any, to be included in the message.  The buf field in the
     strbuf structure points to  the  buffer  where  the  control
     information  resides, and the len field indicates the number
     of bytes to be sent.  The maxlen field is not used in putmsg
     [see getmsg(2)].  In a similar manner, dataptr specifies the
     data, if any, to be included in the  message.   flags  indi-
     cates  what  type of message should be sent and is described
     later.

     To send the data part of a message, dataptr must not be NULL
     and  the  len  field  of  dataptr  must have a value of 0 or
     greater.  To  send  the  control  part  of  a  message,  the
     corresponding  values must be set for ctlptr.  No data (con-
     trol) part is sent if either dataptr (ctlptr) is NULL or the
     len field of dataptr (ctlptr) is set to -1.





                                                                1





putmsg(2)                 SYSTEM CALLS                  putmsg(2)



     For putmsg(), if a control part is specified, and  flags  is
     set  to  RSHIPRI,  a  high priority message is sent.  If no
     control part is specified, and flags  is  set  to  RSHIPRI,
     putmsg  fails  and sets errno to EINVAL.  If flags is set to
     0, a normal (non-priority) message is sent.  If  no  control
     part  and no data part are specified, and flags is set to 0,
     no message is sent, and 0 is returned.

     The stream head guarantees that the control part of  a  mes-
     sage generated by putmsg is at least 64 bytes in length.

     For putpmsg, the flags are different.  flags  is  a  bitmask
     with   the   following   mutually-exclusive  flags  defined:
     MSGHIPRI and MSGBAND.  If flags is set to 0, putpmsg fails
     and  sets  errno  to EINVAL.  If a control part is specified
     and flags is set to MSGHIPRI and band is set to 0, a  high-
     priority  message is sent.  If flags is set to MSGHIPRI and
     either no control part is specified or  band  is  set  to  a
     non-zero  value,  putpmsg()  fails and sets errno to EINVAL.
     If flags is set to MSGBAND, then a message is sent  in  the
     priority band specified by band.  If a control part and data
     part are not specified and flags is set to MSGBAND, no mes-
     sage  is  sent  and  0 is returned.  Normally, putmsg() will
     block if the stream write queue is full due to internal flow
     control  conditions.   For  high-priority messages, putmsg()
     does not block  on  this  condition.   For  other  messages,
     putmsg()  does  not  block  when the write queue is full and
     ONDELAY or ONONBLOCK is set.  Instead, it fails  and  sets
     errno to EAGAIN.

     putmsg or putpmsg also blocks, unless prevented by  lack  of
     internal  resources, waiting for the availability of message
     blocks in the stream,  regardless  of  priority  or  whether
     ONDELAY  or ONONBLOCK has been specified.  No partial mes-
     sage is sent.

     putmsg fails if one or more of the following are true:

     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.

     EBADF        fd is not a  valid  file  descriptor  open  for
                  writing.

     EFAULT       ctlptr or dataptr points outside the  allocated
                  address space.

     EINTR        A signal was caught during  the  putmsg  system
                  call.




                                                                2





putmsg(2)                 SYSTEM CALLS                  putmsg(2)



     EINVAL       An undefined value was specified in  flags,  or
                  flags  is  set  to RSHIPRI and no control part
                  was supplied.

     EINVAL       The stream referenced by fd is linked  below  a
                  multiplexor.

     EINVAL       For putpmsg, if flags is set to  MSGHIPRI  and
                  band is nonzero.

     ENOSR        Buffers could not be allocated for the  message
                  that  was  to  be  created  due to insufficient
                  STREAMS memory resources.

     ENOSTR       A stream is not associated with fd.

     ENXIO        A hangup condition was generated downstream for
                  the  specified  stream, or the other end of the
                  pipe is closed.

     ERANGE       The size of the data part of the  message  does
                  not fall within the range specified by the max-
                  imum and minimum packet sizes  of  the  topmost
                  stream  module.  This value is also returned if
                  the control part of the message is larger  than
                  the maximum configured size of the control part
                  of a message, or if the data part of a  message
                  is  larger  than the maximum configured size of
                  the data part of a message.

     putmsg also fails if a STREAMS error message had  been  pro-
     cessed  by  the  stream head before the call to putmsg.  The
     error returned is the value contained in the  STREAMS  error
     message.

SEE ALSO
     getmsg(2), intro(2), poll(2), putmsg(2), read(2), write(2).
     Programmer's Guide: STREAMS.

DIAGNOSTICS
     Upon successful completion, a value of 0 is returned.   Oth-
     erwise,  a value of -1 is returned and errno is set to indi-
     cate the error.












                                                                3



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