Sophie

Sophie

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

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: Manager</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="#func-members">Functions</a>  </div>
  <div class="headertitle">
<h1>Manager</h1>  </div>
<div class="ingroups"><a class="el" href="group__cache__mngt.html">Caching</a></div></div>
<div class="contents">

<p>Helps keeping caches up to date.  
<a href="#_details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct nl_cache_mngr *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cache__mngr.html#gacb350ed929ffe7d01fb8bc2f872b8b19">nl_cache_mngr_alloc</a> (struct nl_handle *handle, int protocol, int flags)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocate new cache manager.  <a href="#gacb350ed929ffe7d01fb8bc2f872b8b19"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct nl_cache *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__cache__mngr.html#ga68610a013ae88504ba9ff1dffb8464c0">nl_cache_mngr_add</a> (struct nl_cache_mngr *mngr, const char *name, change_func_t cb)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Add cache responsibility to cache manager.  <a href="#ga68610a013ae88504ba9ff1dffb8464c0"></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__cache__mngr.html#gac49581d90c6e7be9f3fa7fe009a88e80">nl_cache_mngr_get_fd</a> (struct nl_cache_mngr *mngr)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get file descriptor.  <a href="#gac49581d90c6e7be9f3fa7fe009a88e80"></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__cache__mngr.html#ga544e06be5c3cf48fa761677e152f64f6">nl_cache_mngr_poll</a> (struct nl_cache_mngr *mngr, int timeout)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for event notifications.  <a href="#ga544e06be5c3cf48fa761677e152f64f6"></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__cache__mngr.html#gaea5a5c62599aefaf9a540f770a5b1fd4">nl_cache_mngr_data_ready</a> (struct nl_cache_mngr *mngr)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Receive available event notifications.  <a href="#gaea5a5c62599aefaf9a540f770a5b1fd4"></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__cache__mngr.html#ga3c3ff6903e0fd29c620cc9b7a47e5a99">nl_cache_mngr_free</a> (struct nl_cache_mngr *mngr)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Free cache manager.  <a href="#ga3c3ff6903e0fd29c620cc9b7a47e5a99"></a><br/></td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<p>The purpose of a cache manager is to keep track of caches and automatically receive event notifications to keep the caches up to date with the kernel state. Each manager has exactly one netlink socket assigned which limits the scope of each manager to exactly one netlink family. Therefore all caches committed to a manager must be part of the same netlink family. Due to the nature of a manager, it is not possible to have a cache maintain two instances of the same cache type. The socket is subscribed to the event notification group of each cache and also put into non-blocking mode. Functions exist to poll() on the socket to wait for new events to be received.</p>
<div class="fragment"><pre class="fragment"> App       libnl                        Kernel
        |                            |
            +-----------------+        [ notification, link change ]
        |   |  Cache Manager  |      | [   (IFF_UP | IFF_RUNNING)  ]
            |                 |                |
        |   |   +------------+|      |         |  [ notification, <span class="keyword">new</span> addr ]
    &lt;-------|---| route/link |&lt;-------(async)--+  [  10.0.1.1/32 dev eth1  ]
        |   |   +------------+|      |                      |
            |   +------------+|                             |
    &lt;---|---|---| route/addr |&lt;------|-(async)--------------+
            |   +------------+|
        |   |   +------------+|      |
    &lt;-------|---| ...        ||
        |   |   +------------+|      |
            +-----------------+
        |                            |
</pre></div><dl class="user"><dt><b>1) Creating a new cache manager</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="keyword">struct </span>nl_cache_mngr *mngr;

 <span class="comment">// Allocate a new cache manager for RTNETLINK and automatically</span>
 <span class="comment">// provide the caches added to the manager.</span>
 mngr = <a class="code" href="group__cache__mngr.html#gacb350ed929ffe7d01fb8bc2f872b8b19" title="Allocate new cache manager.">nl_cache_mngr_alloc</a>(NETLINK_ROUTE, NL_AUTO_PROVIDE);
</pre></div></dd></dl>
<dl class="user"><dt><b>2) Keep track of a cache</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="keyword">struct </span>nl_cache *cache;

 <span class="comment">// Create a new cache for links/interfaces and ask the manager to</span>
 <span class="comment">// keep it up to date for us. This will trigger a full dump request</span>
 <span class="comment">// to initially fill the cache.</span>
 cache = <a class="code" href="group__cache__mngr.html#ga68610a013ae88504ba9ff1dffb8464c0" title="Add cache responsibility to cache manager.">nl_cache_mngr_add</a>(mngr, <span class="stringliteral">&quot;route/link&quot;</span>);
</pre></div></dd></dl>
<dl class="user"><dt><b>3) Make the manager receive updates</b></dt><dd><div class="fragment"><pre class="fragment"> <span class="comment">// Give the manager the ability to receive updates, will call poll()</span>
 <span class="comment">// with a timeout of 5 seconds.</span>
 <span class="keywordflow">if</span> (<a class="code" href="group__cache__mngr.html#ga544e06be5c3cf48fa761677e152f64f6" title="Check for event notifications.">nl_cache_mngr_poll</a>(mngr, 5000) &gt; 0) {
         <span class="comment">// Manager received at least one update, dump cache?</span>
         <a class="code" href="group__cache.html#ga8e7a06ddf0139ee1c9304721793772d1" title="Dump all elements of a cache.">nl_cache_dump</a>(cache, ...);
 }
</pre></div></dd></dl>
<dl class="user"><dt><b>4) Release cache manager</b></dt><dd><div class="fragment"><pre class="fragment"> <a class="code" href="group__cache__mngr.html#ga3c3ff6903e0fd29c620cc9b7a47e5a99" title="Free cache manager.">nl_cache_mngr_free</a>(mngr);
</pre></div> </dd></dl>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="gacb350ed929ffe7d01fb8bc2f872b8b19"></a><!-- doxytag: member="cache_mngr.c::nl_cache_mngr_alloc" ref="gacb350ed929ffe7d01fb8bc2f872b8b19" args="(struct nl_handle *handle, int protocol, int flags)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">struct nl_cache_mngr* nl_cache_mngr_alloc </td>
          <td>(</td>
          <td class="paramtype">struct nl_handle *&#160;</td>
          <td class="paramname"><em>handle</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>protocol</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>flags</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</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">handle</td><td>Netlink socket/handle to be used </td></tr>
    <tr><td class="paramname">protocol</td><td>Netlink Protocol this manager is used for </td></tr>
    <tr><td class="paramname">flags</td><td>Flags</td></tr>
  </table>
  </dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Newly allocated cache manager or NULL on failure. </dd></dl>

<p>Definition at line <a class="el" href="cache__mngr_8c_source.html#l00149">149</a> of file <a class="el" href="cache__mngr_8c_source.html">cache_mngr.c</a>.</p>

<p>References <a class="el" href="cache__mngr_8c_source.html#l00373">nl_cache_mngr_free()</a>, <a class="el" href="handlers_8h_source.html#l00083">NL_CB_CUSTOM</a>, <a class="el" href="handlers_8h_source.html#l00095">NL_CB_VALID</a>, <a class="el" href="nl_8c_source.html#l00191">nl_connect()</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="socket_8c_source.html#l00448">nl_socket_set_nonblocking()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keyword">struct </span>nl_cache_mngr *mngr;

        <span class="keywordflow">if</span> (handle == NULL)
                BUG();

        mngr = calloc(1, <span class="keyword">sizeof</span>(*mngr));
        <span class="keywordflow">if</span> (!mngr)
                <span class="keywordflow">goto</span> enomem;

        mngr-&gt;cm_handle = handle;
        mngr-&gt;cm_nassocs = 32;
        mngr-&gt;cm_protocol = protocol;
        mngr-&gt;cm_flags = flags;
        mngr-&gt;cm_assocs = calloc(mngr-&gt;cm_nassocs,
                                 <span class="keyword">sizeof</span>(<span class="keyword">struct</span> nl_cache_assoc));
        <span class="keywordflow">if</span> (!mngr-&gt;cm_assocs)
                <span class="keywordflow">goto</span> enomem;


        <a class="code" href="group__socket.html#ga6ae4e46ad6ea991e92dd0cc2653ff371" title="Modify the callback handler associated to the socket.">nl_socket_modify_cb</a>(mngr-&gt;cm_handle, <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>,
                            event_input, mngr);

        <span class="comment">/* Required to receive async event notifications */</span>
        <a class="code" href="group__socket.html#ga0ff2f43147e3a4547f7109578b3ca422" title="Disable sequence number checking.">nl_disable_sequence_check</a>(mngr-&gt;cm_handle);

        <span class="keywordflow">if</span> (<a class="code" href="group__nl.html#ga68655d7fa8bd1944bec4761c95e576e9" title="Create and connect netlink socket.">nl_connect</a>(mngr-&gt;cm_handle, protocol) &lt; 0)
                <span class="keywordflow">goto</span> errout;

        <span class="keywordflow">if</span> (<a class="code" href="group__socket.html#gafbf20258be9d18116a9179c76cdd2637" title="Set file descriptor of socket handle to non-blocking state.">nl_socket_set_nonblocking</a>(mngr-&gt;cm_handle) &lt; 0)
                <span class="keywordflow">goto</span> errout;

        NL_DBG(1, <span class="stringliteral">&quot;Allocated cache manager %p, protocol %d, %d caches\n&quot;</span>,
               mngr, protocol, mngr-&gt;cm_nassocs);

        <span class="keywordflow">return</span> mngr;

enomem:
        nl_errno(ENOMEM);
errout:
        <a class="code" href="group__cache__mngr.html#ga3c3ff6903e0fd29c620cc9b7a47e5a99" title="Free cache manager.">nl_cache_mngr_free</a>(mngr);
        <span class="keywordflow">return</span> NULL;
}
</pre></div>
</div>
</div>
<a class="anchor" id="ga68610a013ae88504ba9ff1dffb8464c0"></a><!-- doxytag: member="cache_mngr.c::nl_cache_mngr_add" ref="ga68610a013ae88504ba9ff1dffb8464c0" args="(struct nl_cache_mngr *mngr, const char *name, change_func_t cb)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">struct nl_cache* nl_cache_mngr_add </td>
          <td>(</td>
          <td class="paramtype">struct nl_cache_mngr *&#160;</td>
          <td class="paramname"><em>mngr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const char *&#160;</td>
          <td class="paramname"><em>name</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">change_func_t&#160;</td>
          <td class="paramname"><em>cb</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</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">mngr</td><td>Cache manager. </td></tr>
    <tr><td class="paramname">name</td><td>Name of cache to keep track of </td></tr>
    <tr><td class="paramname">cb</td><td>Function to be called upon changes.</td></tr>
  </table>
  </dd>
</dl>
<p>Allocates a new cache of the specified type and adds it to the manager. The operation will trigger a full dump request from the kernel to initially fill the contents of the cache. The manager will subscribe to the notification group of the cache to keep track of any further changes.</p>
<dl class="return"><dt><b>Returns:</b></dt><dd>The newly allocated cache or NULL on failure. </dd></dl>

<p>Definition at line <a class="el" href="cache__mngr_8c_source.html#l00209">209</a> of file <a class="el" href="cache__mngr_8c_source.html">cache_mngr.c</a>.</p>

<p>References <a class="el" href="cache-api_8h_source.html#l00149">nl_af_group::ag_group</a>, <a class="el" href="cache_8c_source.html#l00173">nl_cache_alloc()</a>, <a class="el" href="cache_8c_source.html#l00265">nl_cache_free()</a>, <a class="el" href="cache__mngt_8c_source.html#l00189">nl_cache_mngt_provide()</a>, <a class="el" href="cache__mngt_8c_source.html#l00036">nl_cache_ops_lookup()</a>, <a class="el" href="cache_8c_source.html#l00662">nl_cache_refill()</a>, <a class="el" href="socket_8c_source.html#l00355">nl_socket_add_membership()</a>, and <a class="el" href="socket_8c_source.html#l00382">nl_socket_drop_membership()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keyword">struct </span><a class="code" href="structnl__cache__ops.html" title="Cache Operations.">nl_cache_ops</a> *ops;
        <span class="keyword">struct </span>nl_cache *cache;
        <span class="keyword">struct </span><a class="code" href="structnl__af__group.html" title="Address family to netlink group association.">nl_af_group</a> *grp;
        <span class="keywordtype">int</span> err, i;

        ops = <a class="code" href="group__cache__mngt.html#ga7657cf661e569b4b43842a82e409b5fd" title="Lookup the set cache operations of a certain cache type.">nl_cache_ops_lookup</a>(name);
        <span class="keywordflow">if</span> (!ops) {
                nl_error(ENOENT, <span class="stringliteral">&quot;Unknown cache type&quot;</span>);
                <span class="keywordflow">return</span> NULL;
        }

        <span class="keywordflow">if</span> (ops-&gt;co_protocol != mngr-&gt;cm_protocol) {
                nl_error(EINVAL, <span class="stringliteral">&quot;Netlink protocol mismatch&quot;</span>);
                <span class="keywordflow">return</span> NULL;
        }

        <span class="keywordflow">if</span> (ops-&gt;co_groups == NULL) {
                nl_error(EOPNOTSUPP, NULL);
                <span class="keywordflow">return</span> NULL;
        }

        <span class="keywordflow">for</span> (i = 0; i &lt; mngr-&gt;cm_nassocs; i++) {
                <span class="keywordflow">if</span> (mngr-&gt;cm_assocs[i].ca_cache &amp;&amp;
                    mngr-&gt;cm_assocs[i].ca_cache-&gt;c_ops == ops) {
                        nl_error(EEXIST, <span class="stringliteral">&quot;Cache of this type already managed&quot;</span>);
                        <span class="keywordflow">return</span> NULL;
                }
        }

retry:
        <span class="keywordflow">for</span> (i = 0; i &lt; mngr-&gt;cm_nassocs; i++)
                <span class="keywordflow">if</span> (!mngr-&gt;cm_assocs[i].ca_cache)
                        <span class="keywordflow">break</span>;

        <span class="keywordflow">if</span> (i &gt;= mngr-&gt;cm_nassocs) {
                mngr-&gt;cm_nassocs += 16;
                mngr-&gt;cm_assocs = realloc(mngr-&gt;cm_assocs,
                                          mngr-&gt;cm_nassocs *
                                          <span class="keyword">sizeof</span>(<span class="keyword">struct</span> nl_cache_assoc));
                <span class="keywordflow">if</span> (mngr-&gt;cm_assocs == NULL) {
                        nl_errno(ENOMEM);
                        <span class="keywordflow">return</span> NULL;
                } <span class="keywordflow">else</span> {
                        NL_DBG(1, <span class="stringliteral">&quot;Increased capacity of cache manager %p &quot;</span> \
                                  <span class="stringliteral">&quot;to %d\n&quot;</span>, mngr, mngr-&gt;cm_nassocs);
                        <span class="keywordflow">goto</span> retry;
                }
        }

        cache = <a class="code" href="group__cache.html#ga9520ae0f2158db3c081f34c851d92252" title="Allocate an empty cache.">nl_cache_alloc</a>(ops);
        <span class="keywordflow">if</span> (!cache) {
                nl_errno(ENOMEM);
                <span class="keywordflow">return</span> NULL;
        }

        <span class="keywordflow">for</span> (grp = ops-&gt;co_groups; grp-&gt;<a class="code" href="structnl__af__group.html#a8b51cf29b78960889696f161d5a852f8" title="Netlink group identifier.">ag_group</a>; grp++) {
                err = <a class="code" href="group__socket.html#ga3d0fb09feebd7fe9d919437aef47239a" title="Join a group.">nl_socket_add_membership</a>(mngr-&gt;cm_handle, grp-&gt;<a class="code" href="structnl__af__group.html#a8b51cf29b78960889696f161d5a852f8" title="Netlink group identifier.">ag_group</a>);
                <span class="keywordflow">if</span> (err &lt; 0)
                        <span class="keywordflow">goto</span> errout_free_cache;
        }

        err = <a class="code" href="group__cache.html#gaf5bd584017847e6ef69ec36739a6aaf0" title="(Re)fill a cache with the contents in the kernel.">nl_cache_refill</a>(mngr-&gt;cm_handle, cache);
        <span class="keywordflow">if</span> (err &lt; 0)
                <span class="keywordflow">goto</span> errout_drop_membership;

        mngr-&gt;cm_assocs[i].ca_cache = cache;
        mngr-&gt;cm_assocs[i].ca_change = cb;

        <span class="keywordflow">if</span> (mngr-&gt;cm_flags &amp; NL_AUTO_PROVIDE)
                <a class="code" href="group__cache__mngt.html#ga6a5f7016b2aa9485979e2de38076014d" title="Provide a cache for global use.">nl_cache_mngt_provide</a>(cache);

        NL_DBG(1, <span class="stringliteral">&quot;Added cache %p &lt;%s&gt; to cache manager %p\n&quot;</span>,
               cache, nl_cache_name(cache), mngr);

        <span class="keywordflow">return</span> cache;

errout_drop_membership:
        <span class="keywordflow">for</span> (grp = ops-&gt;co_groups; grp-&gt;<a class="code" href="structnl__af__group.html#a8b51cf29b78960889696f161d5a852f8" title="Netlink group identifier.">ag_group</a>; grp++)
                <a class="code" href="group__socket.html#ga0114b0736393662d10296a0480ebd49d" title="Leave a group.">nl_socket_drop_membership</a>(mngr-&gt;cm_handle, grp-&gt;<a class="code" href="structnl__af__group.html#a8b51cf29b78960889696f161d5a852f8" title="Netlink group identifier.">ag_group</a>);
errout_free_cache:
        <a class="code" href="group__cache.html#ga530c896db26d72001d011114b1e6cfaa" title="Free a cache.">nl_cache_free</a>(cache);

        <span class="keywordflow">return</span> NULL;
}
</pre></div>
</div>
</div>
<a class="anchor" id="gac49581d90c6e7be9f3fa7fe009a88e80"></a><!-- doxytag: member="cache_mngr.c::nl_cache_mngr_get_fd" ref="gac49581d90c6e7be9f3fa7fe009a88e80" args="(struct nl_cache_mngr *mngr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int nl_cache_mngr_get_fd </td>
          <td>(</td>
          <td class="paramtype">struct nl_cache_mngr *&#160;</td>
          <td class="paramname"><em>mngr</em></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">mngr</td><td>Cache Manager</td></tr>
  </table>
  </dd>
</dl>
<p>Get the file descriptor of the socket associated to the manager. This can be used to change socket options or monitor activity using poll()/select(). </p>

<p>Definition at line <a class="el" href="cache__mngr_8c_source.html#l00305">305</a> of file <a class="el" href="cache__mngr_8c_source.html">cache_mngr.c</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keywordflow">return</span> nl_socket_get_fd(mngr-&gt;cm_handle);
}
</pre></div>
</div>
</div>
<a class="anchor" id="ga544e06be5c3cf48fa761677e152f64f6"></a><!-- doxytag: member="cache_mngr.c::nl_cache_mngr_poll" ref="ga544e06be5c3cf48fa761677e152f64f6" args="(struct nl_cache_mngr *mngr, int timeout)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int nl_cache_mngr_poll </td>
          <td>(</td>
          <td class="paramtype">struct nl_cache_mngr *&#160;</td>
          <td class="paramname"><em>mngr</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>timeout</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">mngr</td><td>Cache Manager </td></tr>
    <tr><td class="paramname">timeout</td><td>Upper limit poll() will block, in milliseconds.</td></tr>
  </table>
  </dd>
</dl>
<p>Causes poll() to be called to check for new event notifications being available. Automatically receives and handles available notifications.</p>
<p>This functionally is ideally called regularly during an idle period.</p>
<dl class="return"><dt><b>Returns:</b></dt><dd>A positive value if at least one update was handled, 0 for none, or a negative error code. </dd></dl>

<p>Definition at line <a class="el" href="cache__mngr_8c_source.html#l00325">325</a> of file <a class="el" href="cache__mngr_8c_source.html">cache_mngr.c</a>.</p>

<p>References <a class="el" href="cache__mngr_8c_source.html#l00356">nl_cache_mngr_data_ready()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keywordtype">int</span> ret;
        <span class="keyword">struct </span>pollfd fds = {
                .fd = nl_socket_get_fd(mngr-&gt;cm_handle),
                .events = POLLIN,
        };

        NL_DBG(3, <span class="stringliteral">&quot;Cache manager %p, poll() fd %d\n&quot;</span>, mngr, fds.fd);
        ret = poll(&amp;fds, 1, timeout);
        NL_DBG(3, <span class="stringliteral">&quot;Cache manager %p, poll() returned %d\n&quot;</span>, mngr, ret);
        <span class="keywordflow">if</span> (ret &lt; 0)
                <span class="keywordflow">return</span> nl_errno(errno);

        <span class="keywordflow">if</span> (ret == 0)
                <span class="keywordflow">return</span> 0;

        <span class="keywordflow">return</span> <a class="code" href="group__cache__mngr.html#gaea5a5c62599aefaf9a540f770a5b1fd4" title="Receive available event notifications.">nl_cache_mngr_data_ready</a>(mngr);
}
</pre></div>
</div>
</div>
<a class="anchor" id="gaea5a5c62599aefaf9a540f770a5b1fd4"></a><!-- doxytag: member="cache_mngr.c::nl_cache_mngr_data_ready" ref="gaea5a5c62599aefaf9a540f770a5b1fd4" args="(struct nl_cache_mngr *mngr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int nl_cache_mngr_data_ready </td>
          <td>(</td>
          <td class="paramtype">struct nl_cache_mngr *&#160;</td>
          <td class="paramname"><em>mngr</em></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">mngr</td><td>Cache manager</td></tr>
  </table>
  </dd>
</dl>
<p>This function can be called if the socket associated to the manager contains updates to be received. This function should not be used if <a class="el" href="group__cache__mngr.html#ga544e06be5c3cf48fa761677e152f64f6" title="Check for event notifications.">nl_cache_mngr_poll()</a> is used.</p>
<dl class="return"><dt><b>Returns:</b></dt><dd>A positive value if at least one update was handled, 0 for none, or a negative error code. </dd></dl>

<p>Definition at line <a class="el" href="cache__mngr_8c_source.html#l00356">356</a> of file <a class="el" href="cache__mngr_8c_source.html">cache_mngr.c</a>.</p>

<p>References <a class="el" href="nl_8c_source.html#l00781">nl_recvmsgs_default()</a>.</p>

<p>Referenced by <a class="el" href="cache__mngr_8c_source.html#l00325">nl_cache_mngr_poll()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keywordtype">int</span> err;

        err = <a class="code" href="group__nl.html#gab287fc77c46d80c4e22bc87494cbf853" title="Receive a set of message from a netlink socket using handlers in nl_handle.">nl_recvmsgs_default</a>(mngr-&gt;cm_handle);
        <span class="keywordflow">if</span> (err &lt; 0)
                <span class="keywordflow">return</span> err;

        <span class="keywordflow">return</span> 1;
}
</pre></div>
</div>
</div>
<a class="anchor" id="ga3c3ff6903e0fd29c620cc9b7a47e5a99"></a><!-- doxytag: member="cache_mngr.c::nl_cache_mngr_free" ref="ga3c3ff6903e0fd29c620cc9b7a47e5a99" args="(struct nl_cache_mngr *mngr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void nl_cache_mngr_free </td>
          <td>(</td>
          <td class="paramtype">struct nl_cache_mngr *&#160;</td>
          <td class="paramname"><em>mngr</em></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">mngr</td><td>Cache manager</td></tr>
  </table>
  </dd>
</dl>
<p>Release all resources after usage of a cache manager. </p>

<p>Definition at line <a class="el" href="cache__mngr_8c_source.html#l00373">373</a> of file <a class="el" href="cache__mngr_8c_source.html">cache_mngr.c</a>.</p>

<p>References <a class="el" href="nl_8c_source.html#l00247">nl_close()</a>, and <a class="el" href="socket_8c_source.html#l00240">nl_handle_destroy()</a>.</p>

<p>Referenced by <a class="el" href="cache__mngr_8c_source.html#l00149">nl_cache_mngr_alloc()</a>.</p>
<div class="fragment"><pre class="fragment">{
        <span class="keywordflow">if</span> (!mngr)
                <span class="keywordflow">return</span>;

        <span class="keywordflow">if</span> (mngr-&gt;cm_handle) {
                <a class="code" href="group__nl.html#ga25039e93db5ab64ce4345ffe14379530" title="Close/Disconnect netlink socket.">nl_close</a>(mngr-&gt;cm_handle);
                <a class="code" href="group__socket.html#gaf73c4d1d895ec4cd19f504aae96219b5" title="Destroy netlink handle.">nl_handle_destroy</a>(mngr-&gt;cm_handle);
        }

        free(mngr-&gt;cm_assocs);
        free(mngr);

        NL_DBG(1, <span class="stringliteral">&quot;Cache manager %p freed\n&quot;</span>, mngr);
}
</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>