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)