PUTMSG(2-SVR4) RISC/os Reference Manual PUTMSG(2-SVR4)
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.
Printed 11/19/92 Page 1
PUTMSG(2-SVR4) RISC/os Reference Manual PUTMSG(2-SVR4)
For putmsg(), if a control part is specified, and flags is
set to RS_HIPRI, a high priority message is sent. If no
control part is specified, and flags is set to RS_HIPRI,
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:
MSG_HIPRI and MSG_BAND. If flags is set to 0, putpmsg fails
and sets errno to EINVAL. If a control part is specified and
flags is set to MSG_HIPRI and band is set to 0, a high-
priority message is sent. If flags is set to MSG_HIPRI and
either no control part specified or band is set to a non-
zero value, putpmsg() fails and sets errno to EINVAL. If
flags is set to MSG_BAND, 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 MSG_BAND, 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 condi-
tion. For other messages, putmsg() does not block when the
write queue is full and O_NDELAY or O_NONBLOCK 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
O_NDELAY or O_NONBLOCK 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
O_NDELAY or O_NONBLOCK 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.
Page 2 Printed 11/19/92
PUTMSG(2-SVR4) RISC/os Reference Manual PUTMSG(2-SVR4)
EINVAL An undefined value was specified in flags, or
flags is set to RS_HIPRI 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 MSG_HIPRI 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.
Printed 11/19/92 Page 3