mkiocb man page on SmartOS

Man page or keyword search:  
man Server   16655 pages
apropos Keyword Search (all sections)
Output format
SmartOS logo
[printable version]

MKIOCB(9F)							    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 mod‐
       ule   or	 driver.  The  mkiocb()	 function  tries  to  allocate	(using
       allocb(9F)) a STREAMS M_IOCTL message block (iocblk(9S)). Buffer	 allo‐
       cation  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 maxi‐
		    mum system privilege and which does not need to  be	 freed
		    in any fashion.

       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
       matching when the M_IOCACK or M_IOCNAK is received.

				 Jan 16, 2006			    MKIOCB(9F)
[top]

List of man pages available for SmartOS

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net