COHERENT manpages
This page displays the COHERENT manpage for putmsg() [Place a message onto a stream].
List of available manpages
Index
putmsg() -- System Call (libc)
Place a message onto a stream
#include <stropts.h>
int putmsg (fd, ctlptr, dataptr, flags)
int fd, flags; const struct strbuf *ctlptr, *dataptr;
putmsg() creates a message from user-specified buffer (or buffers), and
sends the message to a STREAMS file. The message can contain either a data
part, a control part, or both. The data and control parts to be sent are
distinguished by being placed in separate buffers, as described below. The
semantics of each part are defined by the STREAMS module that receives the
message.
fd gives a file descriptor that identifies an open stream. ctlptr and
dataptr each point to a structure of tyupe strbuf, which contains the
following members:
int len; /* Length of data */
void *buf; /* Pointer to buffer */
ctlptr points to the structure that describes the control part (if any) to
be included in the message: buf points to the buffer wherein the control
information resides, and len gives the number of bytes to be sent.
Likewise, dataptr specifies the data (if any) to be included in the
message. flags gives the message's type; it is described in detail below.
To send the data part of a message, dataptr must not be NULL, and the value
of dataptr.len must be no less than zero. To send the control part of a
message, the corresponding values must be set for ctlptr. putmsg() does not
send the data portion of the message if dataptr is set to NULL or
dataptr.len equals -1; likewise, putmsg() does not send the control portion
of the message if ctlptr is NULL or ctrlptr.len equals -1.
If a control part is specified and flags equals RS_HIPRI, putmsg() sends a
high-priority message. If no control part is specified and flags equals
RS_HIPRI, putmsg() fails and sets errno to EINVAL. If flags is set to zero,
putmsg() sends a message of normal priority. If neither the control part
nor the data part is specified, and if flags is set to zero, putmsg() sends
no message and returns zero.
The stream head guarantees that the control part of a message generated by
putmsg() is at least 64 bytes long.
putmsg() usually blocks if the stream head's 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 you have set the mode on fd to
O_NDELAY or O_NONBLOCK. putmsg() never sends a partial message. For
details on O_NDELAY and O_NONBLOCK, see the Lexicon entry for open().
Upon successful completion, putmsg() returns zero. If something goes
wrong, putmsg() returns -1 and sets errno to an appropriate value.
putmsg() fails if any of the following conditions is true:
-> A non-priority message was specified, the mode on fd was set to O_NDELAY
or O_NONBLOCK, and the stream-write queue is full due to internal flow-
control conditions. putmsg() sets errno to EAGAIN.
-> fd is not a valid file descriptor. putmsg() sets errno to EBADF.
-> ctlptr or dataptr contains an illegal address. putmsg() sets errno to
EFAULT.
-> Your application caught a signal while it was executing putmsg().
putmsg() sets errno to EINTR.
-> flags contains an undefined value, or you set flags RS_HIPRI but did not
supply a control part. putmsg() sets errno to EINVAL.
-> The stream referenced by fd is linked below a multiplexor. putmsg()
sets errno to EINVAL.
-> putmsg() could not allocate buffers for the message it was to send due
to insufficient STREAMS memory resources. putmsg() sets errno to ENOSR.
-> fd does not identify a stream. putmsg() sets errno to ENOSTR.
-> A hangup condition was generated downstream for the specified stream, or
the other end of the pipe is closed. putmsg() sets errno to ENXIO.
-> The size of the message's data portion does not fall within range of
legal packet sizes set by topmost stream module, or its control portion
exceeds the maximum configured size. putmsg() sets errno to ERANGE.
putmsg() also fails if a STREAMS error message had been processed by the
stream head before the call to putmsg() was executed. putmsg() returns the
the value contained in the STREAMS error message.
See Also
getmsg(),
libc,
STREAMS