putnextctl(D3DK) —
.IX \f4putnextctl\fP(D3DK)
NAME
putnextctl − send a control message to a queue
SYNOPSIS
#include <sys/stream.h>
int putnextctl(queue_t ∗q, int type);
ARGUMENTS
qPointer to the queue from which the message is to be sent.
typeMessage type (must be control type).
DESCRIPTION
putnextctl tests the type argument to make sure a data type has not been specified, and then attempts to allocate a message block. putnextctl fails if type is M_DATA, M_PROTO, or M_PCPROTO, or if a message block cannot be allocated. If successful, putnextctl calls the put(D2DK) procedure of the queue pointed to by q->q_next, passing it the allocated message.
RETURN VALUE
Upon successful completion, putnextctl returns 1. If type is a data type, or if a message block cannot be allocated, 0 is returned.
LEVEL
Base or Interrupt.
NOTES
Does not sleep.
Driver defined basic locks, read/write locks, and sleep locks may not be held across calls to this function.
The q argument to putctl(D3DK) and putnextctl may not reference q_next (for example, an argument of q->q_next is erroneous on a multiprocessor and is disallowed by the DDI/DKI). putnextctl(q, type) is provided as a multiprocessor-safe equivalent to the common call putctl(q->q_next, type), which is no longer allowed.
SEE ALSO
put(D2DK), put(D3DK), putctl(D3DK), putctl1(D3DK), putnextctl1(D3DK)
EXAMPLE
The send_ctl routine is used to pass control messages downstream. M_BREAK messages are handled with putnextctl (line 9). putnextctl1 (line 11) is used for M_DELAY messages, so that param can be used to specify the length of the delay. If an invalid message type is detected, send_ctl returns 0, indicating failure (line 13).
1 int
2 send_ctl(wrq, type, param)
3queue_t ∗wrq;
4uchar_t type;
5uchar_t param;
6 {
7switch (type) {
8case M_BREAK:
9return(putnextctl(wrq, M_BREAK));
10case M_DELAY:
11return(putnextctl1(wrq, M_DELAY, param));
12default:
13return(0);
14}
15 }
.IX \f4putnextctl\fP(D3DK), example
.IX \f4putnextctl1\fP(D3DK), example
DDI/DKI — STREAMS