PUT(9E) Driver Entry Points PUT(9E)
NAME
put - receive messages from the preceding queue
SYNOPSIS
#include <sys/types.h>
#include <sys/stream.h>
#include <sys/stropts.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
int prefixrput(
queue_t *q,
mblk_t *mp); /* read side */
int prefixwput(
queue_t *q,
mblk_t *mp); /* write side */
INTERFACE LEVEL
Architecture independent level 1 (DDI/DKI). This entry point is
required for
STREAMS.ARGUMENTS
q Pointer to the
queue(9S) structure.
mp Pointer to the message block.
DESCRIPTION
The primary task of the
put() routine is to coordinate the passing of
messages from one queue to the next in a stream. The
put() routine is
called by the preceding stream component (stream module, driver, or
stream head).
put() routines are designated ``write'' or ``read''
depending on the direction of message flow.
With few exceptions, a streams module or driver must have a
put() routine. One exception is the read side of a driver, which does not
need a
put() routine because there is no component downstream to call
it. The
put() routine is always called before the component's
corresponding
srv(9E) (service) routine, and so
put() should be used
for the immediate processing of messages.
A
put() routine must do at least one of the following when it
receives a message:
o pass the message to the next component on the stream by
calling the
putnext(9F) function;
o process the message, if immediate processing is required
(for example, to handle high priority messages); or
o enqueue the message (with the
putq(9F) function) for
deferred processing by the service
srv(9E) routine.
Typically, a
put() routine will switch on message type, which is
contained in the
db_type member of the
datab structure pointed to by
mp. The action taken by the
put() routine depends on the message
type. For example, a
put() routine might process high priority
messages, enqueue normal messages, and handle an unrecognized
M_IOCTL message by changing its type to
M_IOCNAK (negative acknowledgement)
and sending it back to the stream head using the
qreply(9F) function.
The
putq(9F) function can be used as a module's
put() routine when no
special processing is required and all messages are to be enqueued
for the
srv(9E) routine.
RETURN VALUES
Ignored.
CONTEXT
put() routines do not have user context.
SEE ALSO
srv(9E),
putctl(9F),
putctl1(9F),
putnext(9F),
putnextctl(9F),
putnextctl1(9F),
putq(9F),
qreply(9F),
queue(9S),
streamtab(9S) Writing Device Drivers STREAMS Programming Guide March 21, 2019 PUT(9E)