<!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 <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 Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data 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  </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"> </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  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#gaba3fabad0c62db483941101e1a18d14d">nl_cb_kind</a> { <br/>   <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/>   <b>__NL_CB_KIND_MAX</b> <br/> }</td></tr> <tr><td class="mdescLeft"> </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  </td><td class="memItemRight" valign="bottom"><a class="el" href="group__cb.html#ga3f60f4515ada826d2bf16395ee722363">nl_cb_type</a> { <br/>   <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/>   <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/>   <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"> </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 * </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"> </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 * </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"> </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 * </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 </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 </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"> </td><td class="mdescRight">Set up a callback. <a href="#gabe7b2516f28fbb8bb9c5b1ea2dfaf1d3"></a><br/></td></tr> <tr><td class="memItemLeft" align="right" valign="top">int </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"> </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 </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"> </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 </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"> </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 </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"> </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 </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"> </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(* </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"> </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(* </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"> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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 < 0 || kind > 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->cb_refcnt = 1; <span class="keywordflow">for</span> (i = 0; i <= 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 * </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->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 * </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> </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> </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> </td> <td class="paramname"><em>func</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">void * </td> <td class="paramname"><em>arg</em> </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 < 0 || type > NL_CB_TYPE_MAX) <span class="keywordflow">return</span> nl_error(ERANGE, <span class="stringliteral">"Callback type out of range"</span>); <span class="keywordflow">if</span> (kind < 0 || kind > NL_CB_KIND_MAX) <span class="keywordflow">return</span> nl_error(ERANGE, <span class="stringliteral">"Callback kind out of range"</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->cb_set[type] = func; cb->cb_args[type] = arg; } <span class="keywordflow">else</span> { cb->cb_set[type] = cb_def[type][kind]; cb->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 * </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> </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> </td> <td class="paramname"><em>func</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">void * </td> <td class="paramname"><em>arg</em> </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 <= 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 < 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 * </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> </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> </td> <td class="paramname"><em>func</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">void * </td> <td class="paramname"><em>arg</em> </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 < 0 || kind > NL_CB_KIND_MAX) <span class="keywordflow">return</span> nl_error(ERANGE, <span class="stringliteral">"Callback kind out of range"</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->cb_err = func; cb->cb_err_arg = arg; } <span class="keywordflow">else</span> { cb->cb_err = cb_err_def[kind]; cb->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 * </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 *) </td> <td class="paramname"><em>func</em> </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->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 * </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 **) </td> <td class="paramname"><em>func</em> </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->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 * </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 *) </td> <td class="paramname"><em>func</em> </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->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  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </small></address> </body> </html>