Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > 87b89b73c41f4440bb86afd421c7548f > files > 123

libnl-devel-1.1-14.fc14.x86_64.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libnl: Callbacks/Customization</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.3 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">libnl&#160;<span id="projectnumber">1.1</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="summary">
<a href="#enum-members">Enumerations</a>  </div>
  <div class="headertitle">
<h1>Callbacks/Customization</h1>  </div>
<div class="ingroups"><a class="el" href="group__nl.html">Core Netlink API</a></div></div>
<div class="contents">

<p>Callbacks and overwriting capabilities are provided to take influence in various control flows inside the library.  
<a href="#_details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="enum-members"></a>
Enumerations</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#ga0c50cb29c507b3d7e8bc7d76c74675f8">nl_cb_action</a> { <a class="el" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0">NL_OK</a>, 
<a class="el" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8af77d78aac004c6d4bee57741d3a295ae">NL_SKIP</a>, 
<a class="el" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b">NL_STOP</a>
 }</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Callback actions. </p>
 <a href="group__cb.html#ga0c50cb29c507b3d7e8bc7d76c74675f8">More...</a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a> { <br/>
&#160;&#160;<a class="el" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da07baae9c246d899cffd1ad49d7c001ce">NL_CB_DEFAULT</a>, 
<a class="el" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14dab2756e6194ec2c53efe5d111093b4375">NL_CB_VERBOSE</a>, 
<a class="el" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14dad2ef3f2dbf45519610f72b3747eacd18">NL_CB_DEBUG</a>, 
<a class="el" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da22448271a402b4c4a55733ef4884c038">NL_CB_CUSTOM</a>, 
<br/>
&#160;&#160;<b>__NL_CB_KIND_MAX</b>
<br/>
 }</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Callback kinds. </p>
 <a href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">More...</a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#ga3f60f4515ada826d2bf16395ee722363">nl_cb_type</a> { <br/>
&#160;&#160;<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a6e1f371d16186a460f25ea9bb1306c47">NL_CB_VALID</a>, 
<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a044400d11ee451b692333a0d95cf3d32">NL_CB_FINISH</a>, 
<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a25c8376dc758b16bcaeb76c329719dae">NL_CB_OVERRUN</a>, 
<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a034ec83d5ba891deb3d3e54f9e15d3a0">NL_CB_SKIPPED</a>, 
<br/>
&#160;&#160;<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a8295b387c07bd076ccdee45b555f1134">NL_CB_ACK</a>, 
<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a160d69995bab2c325bd25d7ee2d5292d">NL_CB_MSG_IN</a>, 
<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a0b43ab5eccae67470bb8ed0b09e2f650">NL_CB_MSG_OUT</a>, 
<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363af5b5448bf122561db88d510e5d153a8a">NL_CB_INVALID</a>, 
<br/>
&#160;&#160;<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363ae73e906b997f00e8911b09e0f254364d">NL_CB_SEQ_CHECK</a>, 
<a class="el" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363af2930b7775d1444c359cd11d7ce2cd02">NL_CB_SEND_ACK</a>, 
<b>__NL_CB_TYPE_MAX</b>
<br/>
 }</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><p>Callback types. </p>
 <a href="group__cb.html#ga3f60f4515ada826d2bf16395ee722363">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="member-group"></a>
Callback Handle Management</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct nl_cb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#gaea2e77b9e3c0c875f44aec236d9a1009">nl_cb_alloc</a> (enum <a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a> kind)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocate a new callback handle.  <a href="#gaea2e77b9e3c0c875f44aec236d9a1009"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct nl_cb *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#gad438f32bb0f83bd1d15f53e9525f1f65">nl_cb_clone</a> (struct nl_cb *orig)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Clone an existing callback handle.  <a href="#gad438f32bb0f83bd1d15f53e9525f1f65"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="gaff3ed772b1fa8520d72c6192428dca89"></a><!-- doxytag: member="cb::nl_cb_get" ref="gaff3ed772b1fa8520d72c6192428dca89" args="(struct nl_cb *cb)" -->
struct nl_cb *&#160;</td><td class="memItemRight" valign="bottom"><b>nl_cb_get</b> (struct nl_cb *cb)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ga4b655d12f8c8e5516b114dc3075ec2b8"></a><!-- doxytag: member="cb::nl_cb_put" ref="ga4b655d12f8c8e5516b114dc3075ec2b8" args="(struct nl_cb *cb)" -->
void&#160;</td><td class="memItemRight" valign="bottom"><b>nl_cb_put</b> (struct nl_cb *cb)</td></tr>
<tr><td colspan="2"><h2><a name="member-group"></a>
Callback Setup</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#gabe7b2516f28fbb8bb9c5b1ea2dfaf1d3">nl_cb_set</a> (struct nl_cb *cb, enum <a class="el" href="group__cb.html#ga3f60f4515ada826d2bf16395ee722363">nl_cb_type</a> type, enum <a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a> kind, <a class="el" href="group__cb.html#ga1bf04ce17ab1b5867017556a6b4ba729">nl_recvmsg_msg_cb_t</a> func, void *arg)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set up a callback.  <a href="#gabe7b2516f28fbb8bb9c5b1ea2dfaf1d3"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#gad6be5a06f81ed1a411560732c7f3f698">nl_cb_set_all</a> (struct nl_cb *cb, enum <a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a> kind, <a class="el" href="group__cb.html#ga1bf04ce17ab1b5867017556a6b4ba729">nl_recvmsg_msg_cb_t</a> func, void *arg)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set up a all callbacks.  <a href="#gad6be5a06f81ed1a411560732c7f3f698"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#gafeb5477254d93d0a8a8c991f3dbacd77">nl_cb_err</a> (struct nl_cb *cb, enum <a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a> kind, <a class="el" href="group__cb.html#ga2eb817b53fffe9103030c692c73b94df">nl_recvmsg_err_cb_t</a> func, void *arg)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set up an error callback.  <a href="#gafeb5477254d93d0a8a8c991f3dbacd77"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="member-group"></a>
Overwriting</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#gaf3ce421f4b00617510d6e565207d147a">nl_cb_overwrite_recvmsgs</a> (struct nl_cb *cb, int(*func)(struct nl_handle *, struct nl_cb *))</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Overwrite internal calls to <a class="el" href="group__nl.html#ga1bb066e1772b89f79fe1d76a4ef243a6" title="Receive a set of messages from a netlink socket.">nl_recvmsgs()</a>  <a href="#gaf3ce421f4b00617510d6e565207d147a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#ga0d2f92ed95a6d7a5f915e128d1643e24">nl_cb_overwrite_recv</a> (struct nl_cb *cb, int(*func)(struct nl_handle *, struct <a class="el" href="structsockaddr__nl.html">sockaddr_nl</a> *, unsigned char **, struct ucred **))</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Overwrite internal calls to <a class="el" href="group__nl.html#ga060acc8371fdb242c5ae3d5b761d28e1" title="Receive data from netlink socket.">nl_recv()</a>  <a href="#ga0d2f92ed95a6d7a5f915e128d1643e24"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#gaba43d04d5b6419e4e5563c8c64856a39">nl_cb_overwrite_send</a> (struct nl_cb *cb, int(*func)(struct nl_handle *, struct nl_msg *))</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Overwrite internal calls to <a class="el" href="group__nl.html#ga5f3fff85c39f18946100c85f09d2c41c" title="Send netlink message.">nl_send()</a>  <a href="#gaba43d04d5b6419e4e5563c8c64856a39"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="member-group"></a>
Callback Typedefs</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef int(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#ga1bf04ce17ab1b5867017556a6b4ba729">nl_recvmsg_msg_cb_t</a> )(struct nl_msg *msg, void *arg)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="group__nl.html#ga1bb066e1772b89f79fe1d76a4ef243a6" title="Receive a set of messages from a netlink socket.">nl_recvmsgs()</a> callback for message processing customization  <a href="#ga1bf04ce17ab1b5867017556a6b4ba729"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef int(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#ga2eb817b53fffe9103030c692c73b94df">nl_recvmsg_err_cb_t</a> )(struct <a class="el" href="structsockaddr__nl.html">sockaddr_nl</a> *nla, struct <a class="el" href="structnlmsgerr.html">nlmsgerr</a> *nlerr, void *arg)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="group__nl.html#ga1bb066e1772b89f79fe1d76a4ef243a6" title="Receive a set of messages from a netlink socket.">nl_recvmsgs()</a> callback for error message processing customization  <a href="#ga2eb817b53fffe9103030c692c73b94df"></a><br/></td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<p>All callbacks are packed together in struct nl_cb which is then attached to a netlink socket or passed on to the respective functions directly.</p>
<p>Callbacks can control the flow of the underlying layer by returning the appropriate error codes: </p>
<div class="fragment"><pre class="fragment"> Action ID        | Description
 -----------------+-------------------------------------------------------
 <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0" title="Proceed with wathever would come next.">NL_OK</a>       | Proceed with whatever comes next.
 <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8af77d78aac004c6d4bee57741d3a295ae" title="Skip this message.">NL_SKIP</a>          | Skip message currently being processed and <span class="keywordflow">continue</span>
                  | with next message.
 <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b" title="Stop parsing altogether and discard remaining messages.">NL_STOP</a>          | Stop parsing and discard all remaining messages in
                  | <span class="keyword">this</span> <span class="keyword">set</span> of messages.
</pre></div><p>All callbacks are optional and a default action is performed if no application specific implementation is provided:</p>
<div class="fragment"><pre class="fragment"> Callback ID       | Default Return Value
 ------------------+----------------------
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a6e1f371d16186a460f25ea9bb1306c47" title="Message is valid.">NL_CB_VALID</a>       | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0" title="Proceed with wathever would come next.">NL_OK</a>
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a044400d11ee451b692333a0d95cf3d32" title="Last message in a series of multi part messages received.">NL_CB_FINISH</a>      | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b" title="Stop parsing altogether and discard remaining messages.">NL_STOP</a>
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a25c8376dc758b16bcaeb76c329719dae" title="Report received that data was lost.">NL_CB_OVERRUN</a>     | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b" title="Stop parsing altogether and discard remaining messages.">NL_STOP</a>
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a034ec83d5ba891deb3d3e54f9e15d3a0" title="Message wants to be skipped.">NL_CB_SKIPPED</a>     | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8af77d78aac004c6d4bee57741d3a295ae" title="Skip this message.">NL_SKIP</a>
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a8295b387c07bd076ccdee45b555f1134" title="Message is an acknowledge.">NL_CB_ACK</a>         | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b" title="Stop parsing altogether and discard remaining messages.">NL_STOP</a>
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a160d69995bab2c325bd25d7ee2d5292d" title="Called for every message received.">NL_CB_MSG_IN</a>      | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0" title="Proceed with wathever would come next.">NL_OK</a>
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a0b43ab5eccae67470bb8ed0b09e2f650" title="Called for every message sent out except for nl_sendto()">NL_CB_MSG_OUT</a>     | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0" title="Proceed with wathever would come next.">NL_OK</a>
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363af5b5448bf122561db88d510e5d153a8a" title="Message is malformed and invalid.">NL_CB_INVALID</a>     | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b" title="Stop parsing altogether and discard remaining messages.">NL_STOP</a>
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363ae73e906b997f00e8911b09e0f254364d" title="Called instead of internal sequence number checking.">NL_CB_SEQ_CHECK</a>   | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0" title="Proceed with wathever would come next.">NL_OK</a>
 <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363af2930b7775d1444c359cd11d7ce2cd02" title="Sending of an acknowledge message has been requested.">NL_CB_SEND_ACK</a>    | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0" title="Proceed with wathever would come next.">NL_OK</a>
                   |
 Error Callback    | <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b" title="Stop parsing altogether and discard remaining messages.">NL_STOP</a>
</pre></div><p>In order to simplify typical usages of the library, different sets of default callback implementations exist: </p>
<div class="fragment"><pre class="fragment"> <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da07baae9c246d899cffd1ad49d7c001ce" title="Default handlers (quiet)">NL_CB_DEFAULT</a>: No additional actions
 <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14dab2756e6194ec2c53efe5d111093b4375" title="Verbose default handlers (error messages printed)">NL_CB_VERBOSE</a>: Automatically print warning and error messages to a file
                descriptor as appropriate. This is useful <span class="keywordflow">for</span> CLI based
                applications.
 <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14dad2ef3f2dbf45519610f72b3747eacd18" title="Debug handlers for debugging.">NL_CB_DEBUG</a>:   Print informal debugging information <span class="keywordflow">for each</span> message
                received. This will result in every message beint sent or
                received to be printed to the screen in a decoded,
                human-readable format.
</pre></div><dl class="user"><dt><b>1) Setting up a callback set</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="comment">// Allocate a callback set and initialize it to the verbose default set</span>
 <span class="keyword">struct </span>nl_cb *cb = <a class="code" href="group__cb.html#gaea2e77b9e3c0c875f44aec236d9a1009" title="Allocate a new callback handle.">nl_cb_alloc</a>(<a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14dab2756e6194ec2c53efe5d111093b4375" title="Verbose default handlers (error messages printed)">NL_CB_VERBOSE</a>);

 <span class="comment">// Modify the set to call my_func() for all valid messages</span>
 <a class="code" href="group__cb.html#gabe7b2516f28fbb8bb9c5b1ea2dfaf1d3" title="Set up a callback.">nl_cb_set</a>(cb, <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a6e1f371d16186a460f25ea9bb1306c47" title="Message is valid.">NL_CB_VALID</a>, <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da22448271a402b4c4a55733ef4884c038" title="Customized handler specified by the user.">NL_CB_CUSTOM</a>, my_func, NULL);

 <span class="comment">// Set the error message handler to the verbose default implementation</span>
 <span class="comment">// and direct it to print all errors to the given file descriptor.</span>
 FILE *file = fopen(...);
 <a class="code" href="group__cb.html#gafeb5477254d93d0a8a8c991f3dbacd77" title="Set up an error callback.">nl_cb_err</a>(cb, <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14dab2756e6194ec2c53efe5d111093b4375" title="Verbose default handlers (error messages printed)">NL_CB_VERBOSE</a>, NULL, file);
</pre></div> </dd></dl>
<hr/><h2>Typedef Documentation</h2>
<a class="anchor" id="ga1bf04ce17ab1b5867017556a6b4ba729"></a><!-- doxytag: member="handlers.h::nl_recvmsg_msg_cb_t" ref="ga1bf04ce17ab1b5867017556a6b4ba729" args=")(struct nl_msg *msg, void *arg)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">typedef int(* <a class="el" href="group__cb.html#ga1bf04ce17ab1b5867017556a6b4ba729">nl_recvmsg_msg_cb_t</a>)(struct nl_msg *msg, void *arg)</td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">msg</td><td>netlink message being processed </td></tr>
    <tr><td class="paramname">arg</td><td>argument passwd on through caller </td></tr>
  </table>
  </dd>
</dl>

<p>Definition at line <a class="el" href="handlers_8h_source.html#l00040">40</a> of file <a class="el" href="handlers_8h_source.html">handlers.h</a>.</p>

</div>
</div>
<a class="anchor" id="ga2eb817b53fffe9103030c692c73b94df"></a><!-- doxytag: member="handlers.h::nl_recvmsg_err_cb_t" ref="ga2eb817b53fffe9103030c692c73b94df" args=")(struct sockaddr_nl *nla, struct nlmsgerr *nlerr, void *arg)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">typedef int(* <a class="el" href="group__cb.html#ga2eb817b53fffe9103030c692c73b94df">nl_recvmsg_err_cb_t</a>)(struct <a class="el" href="structsockaddr__nl.html">sockaddr_nl</a> *nla, struct <a class="el" href="structnlmsgerr.html">nlmsgerr</a> *nlerr, void *arg)</td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">nla</td><td>netlink address of the peer </td></tr>
    <tr><td class="paramname">nlerr</td><td>netlink error message being processed </td></tr>
    <tr><td class="paramname">arg</td><td>argument passed on through caller </td></tr>
  </table>
  </dd>
</dl>

<p>Definition at line <a class="el" href="handlers_8h_source.html#l00049">49</a> of file <a class="el" href="handlers_8h_source.html">handlers.h</a>.</p>

</div>
</div>
<hr/><h2>Enumeration Type Documentation</h2>
<a class="anchor" id="ga0c50cb29c507b3d7e8bc7d76c74675f8"></a><!-- doxytag: member="handlers.h::nl_cb_action" ref="ga0c50cb29c507b3d7e8bc7d76c74675f8" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">enum <a class="el" href="group__cb.html#ga0c50cb29c507b3d7e8bc7d76c74675f8">nl_cb_action</a></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><em><a class="anchor" id="gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0"></a><!-- doxytag: member="NL_OK" ref="gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0" args="" -->NL_OK</em>&nbsp;</td><td>
<p>Proceed with wathever would come next. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga0c50cb29c507b3d7e8bc7d76c74675f8af77d78aac004c6d4bee57741d3a295ae"></a><!-- doxytag: member="NL_SKIP" ref="gga0c50cb29c507b3d7e8bc7d76c74675f8af77d78aac004c6d4bee57741d3a295ae" args="" -->NL_SKIP</em>&nbsp;</td><td>
<p>Skip this message. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b"></a><!-- doxytag: member="NL_STOP" ref="gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b" args="" -->NL_STOP</em>&nbsp;</td><td>
<p>Stop parsing altogether and discard remaining messages. </p>
</td></tr>
</table>
</dd>
</dl>

<p>Definition at line <a class="el" href="handlers_8h_source.html#l00058">58</a> of file <a class="el" href="handlers_8h_source.html">handlers.h</a>.</p>
<div class="fragment"><pre class="fragment">                  {<span class="comment"></span>
<span class="comment">        /** Proceed with wathever would come next */</span>
        <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8abce22d25ef3e2fed30f22f8bc27fc8f0" title="Proceed with wathever would come next.">NL_OK</a>,<span class="comment"></span>
<span class="comment">        /** Skip this message */</span>
        <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8af77d78aac004c6d4bee57741d3a295ae" title="Skip this message.">NL_SKIP</a>,<span class="comment"></span>
<span class="comment">        /** Stop parsing altogether and discard remaining messages */</span>
        <a class="code" href="group__cb.html#gga0c50cb29c507b3d7e8bc7d76c74675f8aa87c4bfa1b41e2e06286a412dc2bc17b" title="Stop parsing altogether and discard remaining messages.">NL_STOP</a>,
};
</pre></div>
</div>
</div>
<a class="anchor" id="gaba3fabad0c62db483941101e1a18d14d"></a><!-- doxytag: member="handlers.h::nl_cb_kind" ref="gaba3fabad0c62db483941101e1a18d14d" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">enum <a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><em><a class="anchor" id="ggaba3fabad0c62db483941101e1a18d14da07baae9c246d899cffd1ad49d7c001ce"></a><!-- doxytag: member="NL_CB_DEFAULT" ref="ggaba3fabad0c62db483941101e1a18d14da07baae9c246d899cffd1ad49d7c001ce" args="" -->NL_CB_DEFAULT</em>&nbsp;</td><td>
<p>Default handlers (quiet) </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="ggaba3fabad0c62db483941101e1a18d14dab2756e6194ec2c53efe5d111093b4375"></a><!-- doxytag: member="NL_CB_VERBOSE" ref="ggaba3fabad0c62db483941101e1a18d14dab2756e6194ec2c53efe5d111093b4375" args="" -->NL_CB_VERBOSE</em>&nbsp;</td><td>
<p>Verbose default handlers (error messages printed) </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="ggaba3fabad0c62db483941101e1a18d14dad2ef3f2dbf45519610f72b3747eacd18"></a><!-- doxytag: member="NL_CB_DEBUG" ref="ggaba3fabad0c62db483941101e1a18d14dad2ef3f2dbf45519610f72b3747eacd18" args="" -->NL_CB_DEBUG</em>&nbsp;</td><td>
<p>Debug handlers for debugging. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="ggaba3fabad0c62db483941101e1a18d14da22448271a402b4c4a55733ef4884c038"></a><!-- doxytag: member="NL_CB_CUSTOM" ref="ggaba3fabad0c62db483941101e1a18d14da22448271a402b4c4a55733ef4884c038" args="" -->NL_CB_CUSTOM</em>&nbsp;</td><td>
<p>Customized handler specified by the user. </p>
</td></tr>
</table>
</dd>
</dl>

<p>Definition at line <a class="el" href="handlers_8h_source.html#l00075">75</a> of file <a class="el" href="handlers_8h_source.html">handlers.h</a>.</p>
<div class="fragment"><pre class="fragment">                {<span class="comment"></span>
<span class="comment">        /** Default handlers (quiet) */</span>
        <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da07baae9c246d899cffd1ad49d7c001ce" title="Default handlers (quiet)">NL_CB_DEFAULT</a>,<span class="comment"></span>
<span class="comment">        /** Verbose default handlers (error messages printed) */</span>
        <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14dab2756e6194ec2c53efe5d111093b4375" title="Verbose default handlers (error messages printed)">NL_CB_VERBOSE</a>,<span class="comment"></span>
<span class="comment">        /** Debug handlers for debugging */</span>
        <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14dad2ef3f2dbf45519610f72b3747eacd18" title="Debug handlers for debugging.">NL_CB_DEBUG</a>,<span class="comment"></span>
<span class="comment">        /** Customized handler specified by the user */</span>
        <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da22448271a402b4c4a55733ef4884c038" title="Customized handler specified by the user.">NL_CB_CUSTOM</a>,
        __NL_CB_KIND_MAX,
};
</pre></div>
</div>
</div>
<a class="anchor" id="ga3f60f4515ada826d2bf16395ee722363"></a><!-- doxytag: member="handlers.h::nl_cb_type" ref="ga3f60f4515ada826d2bf16395ee722363" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">enum <a class="el" href="group__cb.html#ga3f60f4515ada826d2bf16395ee722363">nl_cb_type</a></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363a6e1f371d16186a460f25ea9bb1306c47"></a><!-- doxytag: member="NL_CB_VALID" ref="gga3f60f4515ada826d2bf16395ee722363a6e1f371d16186a460f25ea9bb1306c47" args="" -->NL_CB_VALID</em>&nbsp;</td><td>
<p>Message is valid. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363a044400d11ee451b692333a0d95cf3d32"></a><!-- doxytag: member="NL_CB_FINISH" ref="gga3f60f4515ada826d2bf16395ee722363a044400d11ee451b692333a0d95cf3d32" args="" -->NL_CB_FINISH</em>&nbsp;</td><td>
<p>Last message in a series of multi part messages received. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363a25c8376dc758b16bcaeb76c329719dae"></a><!-- doxytag: member="NL_CB_OVERRUN" ref="gga3f60f4515ada826d2bf16395ee722363a25c8376dc758b16bcaeb76c329719dae" args="" -->NL_CB_OVERRUN</em>&nbsp;</td><td>
<p>Report received that data was lost. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363a034ec83d5ba891deb3d3e54f9e15d3a0"></a><!-- doxytag: member="NL_CB_SKIPPED" ref="gga3f60f4515ada826d2bf16395ee722363a034ec83d5ba891deb3d3e54f9e15d3a0" args="" -->NL_CB_SKIPPED</em>&nbsp;</td><td>
<p>Message wants to be skipped. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363a8295b387c07bd076ccdee45b555f1134"></a><!-- doxytag: member="NL_CB_ACK" ref="gga3f60f4515ada826d2bf16395ee722363a8295b387c07bd076ccdee45b555f1134" args="" -->NL_CB_ACK</em>&nbsp;</td><td>
<p>Message is an acknowledge. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363a160d69995bab2c325bd25d7ee2d5292d"></a><!-- doxytag: member="NL_CB_MSG_IN" ref="gga3f60f4515ada826d2bf16395ee722363a160d69995bab2c325bd25d7ee2d5292d" args="" -->NL_CB_MSG_IN</em>&nbsp;</td><td>
<p>Called for every message received. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363a0b43ab5eccae67470bb8ed0b09e2f650"></a><!-- doxytag: member="NL_CB_MSG_OUT" ref="gga3f60f4515ada826d2bf16395ee722363a0b43ab5eccae67470bb8ed0b09e2f650" args="" -->NL_CB_MSG_OUT</em>&nbsp;</td><td>
<p>Called for every message sent out except for <a class="el" href="group__nl.html#ga53ee384f123fa3c354ad43adb6cf647d" title="Send raw data over netlink socket.">nl_sendto()</a> </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363af5b5448bf122561db88d510e5d153a8a"></a><!-- doxytag: member="NL_CB_INVALID" ref="gga3f60f4515ada826d2bf16395ee722363af5b5448bf122561db88d510e5d153a8a" args="" -->NL_CB_INVALID</em>&nbsp;</td><td>
<p>Message is malformed and invalid. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363ae73e906b997f00e8911b09e0f254364d"></a><!-- doxytag: member="NL_CB_SEQ_CHECK" ref="gga3f60f4515ada826d2bf16395ee722363ae73e906b997f00e8911b09e0f254364d" args="" -->NL_CB_SEQ_CHECK</em>&nbsp;</td><td>
<p>Called instead of internal sequence number checking. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="gga3f60f4515ada826d2bf16395ee722363af2930b7775d1444c359cd11d7ce2cd02"></a><!-- doxytag: member="NL_CB_SEND_ACK" ref="gga3f60f4515ada826d2bf16395ee722363af2930b7775d1444c359cd11d7ce2cd02" args="" -->NL_CB_SEND_ACK</em>&nbsp;</td><td>
<p>Sending of an acknowledge message has been requested. </p>
</td></tr>
</table>
</dd>
</dl>

<p>Definition at line <a class="el" href="handlers_8h_source.html#l00093">93</a> of file <a class="el" href="handlers_8h_source.html">handlers.h</a>.</p>
<div class="fragment"><pre class="fragment">                {<span class="comment"></span>
<span class="comment">        /** Message is valid */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a6e1f371d16186a460f25ea9bb1306c47" title="Message is valid.">NL_CB_VALID</a>,<span class="comment"></span>
<span class="comment">        /** Last message in a series of multi part messages received */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a044400d11ee451b692333a0d95cf3d32" title="Last message in a series of multi part messages received.">NL_CB_FINISH</a>,<span class="comment"></span>
<span class="comment">        /** Report received that data was lost */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a25c8376dc758b16bcaeb76c329719dae" title="Report received that data was lost.">NL_CB_OVERRUN</a>,<span class="comment"></span>
<span class="comment">        /** Message wants to be skipped */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a034ec83d5ba891deb3d3e54f9e15d3a0" title="Message wants to be skipped.">NL_CB_SKIPPED</a>,<span class="comment"></span>
<span class="comment">        /** Message is an acknowledge */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a8295b387c07bd076ccdee45b555f1134" title="Message is an acknowledge.">NL_CB_ACK</a>,<span class="comment"></span>
<span class="comment">        /** Called for every message received */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a160d69995bab2c325bd25d7ee2d5292d" title="Called for every message received.">NL_CB_MSG_IN</a>,<span class="comment"></span>
<span class="comment">        /** Called for every message sent out except for nl_sendto() */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363a0b43ab5eccae67470bb8ed0b09e2f650" title="Called for every message sent out except for nl_sendto()">NL_CB_MSG_OUT</a>,<span class="comment"></span>
<span class="comment">        /** Message is malformed and invalid */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363af5b5448bf122561db88d510e5d153a8a" title="Message is malformed and invalid.">NL_CB_INVALID</a>,<span class="comment"></span>
<span class="comment">        /** Called instead of internal sequence number checking */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363ae73e906b997f00e8911b09e0f254364d" title="Called instead of internal sequence number checking.">NL_CB_SEQ_CHECK</a>,<span class="comment"></span>
<span class="comment">        /** Sending of an acknowledge message has been requested */</span>
        <a class="code" href="group__cb.html#gga3f60f4515ada826d2bf16395ee722363af2930b7775d1444c359cd11d7ce2cd02" title="Sending of an acknowledge message has been requested.">NL_CB_SEND_ACK</a>,
        __NL_CB_TYPE_MAX,
};
</pre></div>
</div>
</div>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="gaea2e77b9e3c0c875f44aec236d9a1009"></a><!-- doxytag: member="handlers.c::nl_cb_alloc" ref="gaea2e77b9e3c0c875f44aec236d9a1009" args="(enum nl_cb_kind kind)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">struct nl_cb* nl_cb_alloc </td>
          <td>(</td>
          <td class="paramtype">enum <a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a>&#160;</td>
          <td class="paramname"><em>kind</em></td><td>)</td>
          <td><code> [read]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">kind</td><td>callback kind to be used for initialization </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated callback handle or NULL </dd></dl>

<p>Definition at line <a class="el" href="handlers_8c_source.html#l00255">255</a> of file <a class="el" href="handlers_8c_source.html">handlers.c</a>.</p>

<p>References <a class="el" href="handlers_8c_source.html#l00387">nl_cb_err()</a>, and <a class="el" href="handlers_8c_source.html#l00337">nl_cb_set()</a>.</p>

<p>Referenced by <a class="el" href="handlers_8c_source.html#l00285">nl_cb_clone()</a>, and <a class="el" href="socket_8c_source.html#l00206">nl_handle_alloc()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keywordtype">int</span> i;
        <span class="keyword">struct </span>nl_cb *cb;

        <span class="keywordflow">if</span> (kind &lt; 0 || kind &gt; NL_CB_KIND_MAX)
                <span class="keywordflow">return</span> NULL;

        cb = calloc(1, <span class="keyword">sizeof</span>(*cb));
        <span class="keywordflow">if</span> (!cb) {
                nl_errno(ENOMEM);
                <span class="keywordflow">return</span> NULL;
        }

        cb-&gt;cb_refcnt = 1;

        <span class="keywordflow">for</span> (i = 0; i &lt;= NL_CB_TYPE_MAX; i++)
                <a class="code" href="group__cb.html#gabe7b2516f28fbb8bb9c5b1ea2dfaf1d3" title="Set up a callback.">nl_cb_set</a>(cb, i, kind, NULL, NULL);

        <a class="code" href="group__cb.html#gafeb5477254d93d0a8a8c991f3dbacd77" title="Set up an error callback.">nl_cb_err</a>(cb, kind, NULL, NULL);

        <span class="keywordflow">return</span> cb;
}
</pre></div>
</div>
</div>
<a class="anchor" id="gad438f32bb0f83bd1d15f53e9525f1f65"></a><!-- doxytag: member="handlers.c::nl_cb_clone" ref="gad438f32bb0f83bd1d15f53e9525f1f65" args="(struct nl_cb *orig)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">struct nl_cb* nl_cb_clone </td>
          <td>(</td>
          <td class="paramtype">struct nl_cb *&#160;</td>
          <td class="paramname"><em>orig</em></td><td>)</td>
          <td><code> [read]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">orig</td><td>original callback handle </td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated callback handle being a duplicate of orig or NULL </dd></dl>

<p>Definition at line <a class="el" href="handlers_8c_source.html#l00285">285</a> of file <a class="el" href="handlers_8c_source.html">handlers.c</a>.</p>

<p>References <a class="el" href="handlers_8c_source.html#l00255">nl_cb_alloc()</a>, and <a class="el" href="handlers_8h_source.html#l00077">NL_CB_DEFAULT</a>.</p>

<p>Referenced by <a class="el" href="nl_8c_source.html#l00800">nl_wait_for_ack()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keyword">struct </span>nl_cb *cb;
        
        cb = <a class="code" href="group__cb.html#gaea2e77b9e3c0c875f44aec236d9a1009" title="Allocate a new callback handle.">nl_cb_alloc</a>(<a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da07baae9c246d899cffd1ad49d7c001ce" title="Default handlers (quiet)">NL_CB_DEFAULT</a>);
        <span class="keywordflow">if</span> (!cb)
                <span class="keywordflow">return</span> NULL;

        memcpy(cb, orig, <span class="keyword">sizeof</span>(*orig));
        cb-&gt;cb_refcnt = 1;

        <span class="keywordflow">return</span> cb;
}
</pre></div>
</div>
</div>
<a class="anchor" id="gabe7b2516f28fbb8bb9c5b1ea2dfaf1d3"></a><!-- doxytag: member="handlers.c::nl_cb_set" ref="gabe7b2516f28fbb8bb9c5b1ea2dfaf1d3" args="(struct nl_cb *cb, enum nl_cb_type type, enum nl_cb_kind kind, nl_recvmsg_msg_cb_t func, void *arg)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int nl_cb_set </td>
          <td>(</td>
          <td class="paramtype">struct nl_cb *&#160;</td>
          <td class="paramname"><em>cb</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">enum <a class="el" href="group__cb.html#ga3f60f4515ada826d2bf16395ee722363">nl_cb_type</a>&#160;</td>
          <td class="paramname"><em>type</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">enum <a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a>&#160;</td>
          <td class="paramname"><em>kind</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__cb.html#ga1bf04ce17ab1b5867017556a6b4ba729">nl_recvmsg_msg_cb_t</a>&#160;</td>
          <td class="paramname"><em>func</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&#160;</td>
          <td class="paramname"><em>arg</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">cb</td><td>callback set </td></tr>
    <tr><td class="paramname">type</td><td>callback to modify </td></tr>
    <tr><td class="paramname">kind</td><td>kind of implementation </td></tr>
    <tr><td class="paramname">func</td><td>callback function (NL_CB_CUSTOM) </td></tr>
    <tr><td class="paramname">arg</td><td>argument passed to callback</td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on success or a negative error code </dd></dl>

<p>Definition at line <a class="el" href="handlers_8c_source.html#l00337">337</a> of file <a class="el" href="handlers_8c_source.html">handlers.c</a>.</p>

<p>References <a class="el" href="handlers_8h_source.html#l00083">NL_CB_CUSTOM</a>.</p>

<p>Referenced by <a class="el" href="handlers_8c_source.html#l00255">nl_cb_alloc()</a>, <a class="el" href="handlers_8c_source.html#l00366">nl_cb_set_all()</a>, <a class="el" href="socket_8c_source.html#l00279">nl_disable_sequence_check()</a>, <a class="el" href="socket_8c_source.html#l00505">nl_socket_modify_cb()</a>, and <a class="el" href="nl_8c_source.html#l00800">nl_wait_for_ack()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keywordflow">if</span> (type &lt; 0 || type &gt; NL_CB_TYPE_MAX)
                <span class="keywordflow">return</span> nl_error(ERANGE, <span class="stringliteral">&quot;Callback type out of range&quot;</span>);

        <span class="keywordflow">if</span> (kind &lt; 0 || kind &gt; NL_CB_KIND_MAX)
                <span class="keywordflow">return</span> nl_error(ERANGE, <span class="stringliteral">&quot;Callback kind out of range&quot;</span>);

        <span class="keywordflow">if</span> (kind == <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da22448271a402b4c4a55733ef4884c038" title="Customized handler specified by the user.">NL_CB_CUSTOM</a>) {
                cb-&gt;cb_set[type] = func;
                cb-&gt;cb_args[type] = arg;
        } <span class="keywordflow">else</span> {
                cb-&gt;cb_set[type] = cb_def[type][kind];
                cb-&gt;cb_args[type] = arg;
        }

        <span class="keywordflow">return</span> 0;
}
</pre></div>
</div>
</div>
<a class="anchor" id="gad6be5a06f81ed1a411560732c7f3f698"></a><!-- doxytag: member="handlers.c::nl_cb_set_all" ref="gad6be5a06f81ed1a411560732c7f3f698" args="(struct nl_cb *cb, enum nl_cb_kind kind, nl_recvmsg_msg_cb_t func, void *arg)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int nl_cb_set_all </td>
          <td>(</td>
          <td class="paramtype">struct nl_cb *&#160;</td>
          <td class="paramname"><em>cb</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">enum <a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a>&#160;</td>
          <td class="paramname"><em>kind</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__cb.html#ga1bf04ce17ab1b5867017556a6b4ba729">nl_recvmsg_msg_cb_t</a>&#160;</td>
          <td class="paramname"><em>func</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&#160;</td>
          <td class="paramname"><em>arg</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">cb</td><td>callback set </td></tr>
    <tr><td class="paramname">kind</td><td>kind of callback </td></tr>
    <tr><td class="paramname">func</td><td>callback function </td></tr>
    <tr><td class="paramname">arg</td><td>argument to be passwd to callback function</td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>0 on success or a negative error code </dd></dl>

<p>Definition at line <a class="el" href="handlers_8c_source.html#l00366">366</a> of file <a class="el" href="handlers_8c_source.html">handlers.c</a>.</p>

<p>References <a class="el" href="handlers_8c_source.html#l00337">nl_cb_set()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keywordtype">int</span> i, err;

        <span class="keywordflow">for</span> (i = 0; i &lt;= NL_CB_TYPE_MAX; i++) {
                err = <a class="code" href="group__cb.html#gabe7b2516f28fbb8bb9c5b1ea2dfaf1d3" title="Set up a callback.">nl_cb_set</a>(cb, i, kind, func, arg);
                <span class="keywordflow">if</span> (err &lt; 0)
                        <span class="keywordflow">return</span> err;
        }

        <span class="keywordflow">return</span> 0;
}
</pre></div>
</div>
</div>
<a class="anchor" id="gafeb5477254d93d0a8a8c991f3dbacd77"></a><!-- doxytag: member="handlers.c::nl_cb_err" ref="gafeb5477254d93d0a8a8c991f3dbacd77" args="(struct nl_cb *cb, enum nl_cb_kind kind, nl_recvmsg_err_cb_t func, void *arg)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int nl_cb_err </td>
          <td>(</td>
          <td class="paramtype">struct nl_cb *&#160;</td>
          <td class="paramname"><em>cb</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">enum <a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a>&#160;</td>
          <td class="paramname"><em>kind</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__cb.html#ga2eb817b53fffe9103030c692c73b94df">nl_recvmsg_err_cb_t</a>&#160;</td>
          <td class="paramname"><em>func</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&#160;</td>
          <td class="paramname"><em>arg</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">cb</td><td>callback set </td></tr>
    <tr><td class="paramname">kind</td><td>kind of callback </td></tr>
    <tr><td class="paramname">func</td><td>callback function </td></tr>
    <tr><td class="paramname">arg</td><td>argument to be passed to callback function </td></tr>
  </table>
  </dd>
</dl>

<p>Definition at line <a class="el" href="handlers_8c_source.html#l00387">387</a> of file <a class="el" href="handlers_8c_source.html">handlers.c</a>.</p>

<p>References <a class="el" href="handlers_8h_source.html#l00083">NL_CB_CUSTOM</a>.</p>

<p>Referenced by <a class="el" href="handlers_8c_source.html#l00255">nl_cb_alloc()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keywordflow">if</span> (kind &lt; 0 || kind &gt; NL_CB_KIND_MAX)
                <span class="keywordflow">return</span> nl_error(ERANGE, <span class="stringliteral">&quot;Callback kind out of range&quot;</span>);

        <span class="keywordflow">if</span> (kind == <a class="code" href="group__cb.html#ggaba3fabad0c62db483941101e1a18d14da22448271a402b4c4a55733ef4884c038" title="Customized handler specified by the user.">NL_CB_CUSTOM</a>) {
                cb-&gt;cb_err = func;
                cb-&gt;cb_err_arg = arg;
        } <span class="keywordflow">else</span> {
                cb-&gt;cb_err = cb_err_def[kind];
                cb-&gt;cb_err_arg = arg;
        }

        <span class="keywordflow">return</span> 0;
}
</pre></div>
</div>
</div>
<a class="anchor" id="gaf3ce421f4b00617510d6e565207d147a"></a><!-- doxytag: member="handlers.c::nl_cb_overwrite_recvmsgs" ref="gaf3ce421f4b00617510d6e565207d147a" args="(struct nl_cb *cb, int(*func)(struct nl_handle *, struct nl_cb *))" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void nl_cb_overwrite_recvmsgs </td>
          <td>(</td>
          <td class="paramtype">struct nl_cb *&#160;</td>
          <td class="paramname"><em>cb</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int(*)(struct nl_handle *, struct nl_cb *)&#160;</td>
          <td class="paramname"><em>func</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">cb</td><td>callback set </td></tr>
    <tr><td class="paramname">func</td><td>replacement callback for <a class="el" href="group__nl.html#ga1bb066e1772b89f79fe1d76a4ef243a6" title="Receive a set of messages from a netlink socket.">nl_recvmsgs()</a> </td></tr>
  </table>
  </dd>
</dl>

<p>Definition at line <a class="el" href="handlers_8c_source.html#l00416">416</a> of file <a class="el" href="handlers_8c_source.html">handlers.c</a>.</p>
<div class="fragment"><pre class="fragment">{
        cb-&gt;cb_recvmsgs_ow = func;
}
</pre></div>
</div>
</div>
<a class="anchor" id="ga0d2f92ed95a6d7a5f915e128d1643e24"></a><!-- doxytag: member="handlers.c::nl_cb_overwrite_recv" ref="ga0d2f92ed95a6d7a5f915e128d1643e24" args="(struct nl_cb *cb, int(*func)(struct nl_handle *, struct sockaddr_nl *, unsigned char **, struct ucred **))" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void nl_cb_overwrite_recv </td>
          <td>(</td>
          <td class="paramtype">struct nl_cb *&#160;</td>
          <td class="paramname"><em>cb</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int(*)(struct nl_handle *, struct <a class="el" href="structsockaddr__nl.html">sockaddr_nl</a> *, unsigned char **, struct ucred **)&#160;</td>
          <td class="paramname"><em>func</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">cb</td><td>callback set </td></tr>
    <tr><td class="paramname">func</td><td>replacement callback for <a class="el" href="group__nl.html#ga060acc8371fdb242c5ae3d5b761d28e1" title="Receive data from netlink socket.">nl_recv()</a> </td></tr>
  </table>
  </dd>
</dl>

<p>Definition at line <a class="el" href="handlers_8c_source.html#l00427">427</a> of file <a class="el" href="handlers_8c_source.html">handlers.c</a>.</p>
<div class="fragment"><pre class="fragment">{
        cb-&gt;cb_recv_ow = func;
}
</pre></div>
</div>
</div>
<a class="anchor" id="gaba43d04d5b6419e4e5563c8c64856a39"></a><!-- doxytag: member="handlers.c::nl_cb_overwrite_send" ref="gaba43d04d5b6419e4e5563c8c64856a39" args="(struct nl_cb *cb, int(*func)(struct nl_handle *, struct nl_msg *))" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void nl_cb_overwrite_send </td>
          <td>(</td>
          <td class="paramtype">struct nl_cb *&#160;</td>
          <td class="paramname"><em>cb</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int(*)(struct nl_handle *, struct nl_msg *)&#160;</td>
          <td class="paramname"><em>func</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">cb</td><td>callback set </td></tr>
    <tr><td class="paramname">func</td><td>replacement callback for <a class="el" href="group__nl.html#ga5f3fff85c39f18946100c85f09d2c41c" title="Send netlink message.">nl_send()</a> </td></tr>
  </table>
  </dd>
</dl>

<p>Definition at line <a class="el" href="handlers_8c_source.html#l00439">439</a> of file <a class="el" href="handlers_8c_source.html">handlers.c</a>.</p>
<div class="fragment"><pre class="fragment">{
        cb-&gt;cb_send_ow = func;
}
</pre></div>
</div>
</div>
</div>
<hr class="footer"/><address class="footer"><small>Generated on Mon Mar 21 2011 for libnl by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </small></address>
</body>
</html>