Linux and UNIX Man Pages

Linux & Unix Commands - Search Man Pages

mcopyout(9f) [opensolaris man page]

mcopyout(9F)						   Kernel Functions for Drivers 					      mcopyout(9F)

NAME
mcopyout - Convert an M_IOCTL or M_IOCDATA message to an M_COPYOUT SYNOPSIS
#include <sys/stream.h> #include <sys/strsun.h> void mcopyout(mblk_t *mp, void *private, size_t size, void *useraddr, mblk_t *dp); INTERFACE LEVEL
Solaris DDI specific (Solaris DDI). PARAMETERS
mp M_IOCTL or M_IOCDATA message. private Value to set the cq_private field of the copyreq(9S) to. size Value to set the cq_size field of the copyreq(9S) to. useraddr Optionally, the value to set the cq_addr field of the copyreq(9S) to. dp Optionally, the payload to copy out. DESCRIPTION
The mcopyout() function converts an M_IOCTL or M_IOCDATA message into an M_COPYOUT message using the supplied arguments. To convert the message, mcopyout() changes the message type to M_COPYOUT, and its payload from a iocblk(9S) to a copyreq(9S). Since the iocblk(9S) and copyreq(9S) are designed to overlay one another, the only fields which must be updated are cq_private, cq_size, and cq_addr, which are set to the supplied values. If useraddr is passed as NULL, the M_IOCTL must be transparent and cq_addr is assigned the pointer- sized quantity found at mp->b_cont->b_rptr. If dp is not NULL, any trailing message blocks associated with mp are freed, mp->b_cont is reset to dp and dp->b_wptr is set to dp->b_rptr + size. Otherwise, any trailing message blocks are unaffected. RETURN VALUES
None. CONTEXT
This function can be called from user, kernel or interrupt context. SEE ALSO
mcopyin(9F), copyreq(9S), iocblk(9S) STREAMS Programming Guide SunOS 5.11 9 June 2004 mcopyout(9F)

Check Out this Related Man Page

mkiocb(9F)						   Kernel Functions for Drivers 						mkiocb(9F)

NAME
mkiocb - allocates a STREAMS ioctl block for M_IOCTL messages in the kernel. SYNOPSIS
#include <sys/stream.h> mblk_t *mkiocb(uint_t command); INTERFACE LEVEL
Solaris DDI specific (Solaris DDI). PARAMETERS
command ioctl command for the ioc_cmd field. DESCRIPTION
STREAMS modules or drivers might need to issue an ioctl to a lower module or driver. The mkiocb() function tries to allocate (using allocb(9F)) a STREAMS M_IOCTL message block (iocblk(9S)). Buffer allocation fails only when the system is out of memory. If no buffer is available, the qbufcall(9F) function can help a module recover from an allocation failure. The mkiocb function returns a mblk_t structure which is large enough to hold any of the ioctl messages (iocblk(9S), copyreq(9S) or copy- resp(9S)), and has the following special properties: b_wptr Set to b_rptr + sizeof(struct iocblk). b_cont Set to NULL.. b_datap->db_type Set to M_IOCTL. The fields in the iocblk structure are initialized as follows: ioc_cmd Set to the command value passed in. ioc_id Set to a unique identifier. ioc_cr Set to point to a credential structure encoding the maximum system privilege and which does not need to be freed in any fash- ion. ioc_count Set to 0. ioc_rval Set to 0. ioc_error Set to 0. ioc_flags Set to IOC_NATIVE to reflect that this is native to the running kernel. RETURN VALUES
Upon success, the mkiocb() function returns a pointer to the allocated mblk_t of type M_IOCTL. On failure, it returns a null pointer. CONTEXT
The mkiocb() function can be called from user, interrupt, or kernel context. EXAMPLES
Example 1 M_IOCTL Allocation The first example shows an M_IOCTL allocation with the ioctl command TEST_CMD. If the iocblk(9S) cannot be allocated, NULL is returned, indicating an allocation failure (line 5). In line 11, the putnext(9F) function is used to send the message downstream. 1 test_function(queue_t *q, test_info_t *testinfo) 2 { 3 mblk_t *mp; 4 5 if ((mp = mkiocb(TEST_CMD)) == NULL) 6 return(0); 7 8 /* save off ioctl ID value */ 9 testinfo->xx_iocid = ((struct iocblk *)mp->b_rptr)->ioc_id; 10 11 putnext(q, mp); /* send message downstream */ 12 return(1); 13 } Example 2 The ioctl ID Value During the read service routine, the ioctl ID value for M_IOCACK or M_IOCNAK should equal the ioctl that was previously sent by this module before processing. 1 test_lrsrv(queue_t *q) 2 { 3 ... 4 5 switch (DB_TYPE(mp)) { 6 case M_IOCACK: 7 case M_IOCNAK: 8 /* Does this match the ioctl that this module sent */ 9 ioc = (struct iocblk*)mp->b_rptr; 10 if (ioc->ioc_id == testinfo->xx_iocid) { 11 /* matches, so process the message */ 12 ... 13 freemsg(mp); 14 } 15 break; 16 } 17 ... 18 } Example 3 An iocblk Allocation Which Fails The next example shows an iocblk allocation which fails. Since the open routine is in user context, the caller may block using qbufcall(9F) until memory is available. 1 test_open(queue_t *q, dev_t devp, int oflag, int sflag, cred_t *credp) 2 { 3 while ((mp = mkiocb(TEST_IOCTL)) == NULL) { 4 int id; 5 6 id = qbufcall(q, sizeof (union ioctypes), BPRI_HI, 7 dummy_callback, 0); 8 /* Handle interrupts */ 9 if (!qwait_sig(q)) { 10 qunbufcall(q, id); 11 return (EINTR); 12 } 13 } 14 putnext(q, mp); 15 } SEE ALSO
allocb(9F), putnext(9F), qbufcall(9F), qwait_sig(9F), copyreq(9S), copyresp(9S), iocblk(9S) Writing Device Drivers STREAMS Programming Guide WARNINGS
It is the module's responsibility to remember the ID value of the M_IOCTL that was allocated. This will ensure proper cleanup and ID match- ing when the M_IOCACK or M_IOCNAK is received. SunOS 5.11 16 Jan 2006 mkiocb(9F)
Man Page