Code Search for Developers
 
 
  

baby__steps_8c-source.html from net-snmp at Krugle


Show baby__steps_8c-source.html syntax highlighted

<!--#set var="section" value="development" -->
<!--#include virtual="/page-top.html" -->
<!-- CONTENT START -->
  <!-- Generated by Doxygen 1.3.9.1 -->

  <div class="qindex">
    <a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class=
    "qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class=
    "qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a> | <a class=
    "qindex" href="examples.html">Examples</a>
  </div>

  <div class="nav">
    <a class="el" href="dir_000003.html">agent</a>&nbsp;/&nbsp;<a class="el" href="dir_000004.html">helpers</a>
  </div>

  <h1>baby_steps.c</h1>

  <div class="fragment">
    <pre class="fragment">
00001 <span class="comment">/*</span>
00002 <span class="comment"> * baby_steps.c</span>
00003 <span class="comment"> * $Id: baby__steps_8c-source.html 14005 2005-12-30 19:14:23Z alex_b $</span>
00004 <span class="comment"> */</span>
00005 <span class="preprocessor">#include &lt;net-snmp/net-snmp-config.h&gt;</span>
00006 <span class="preprocessor">#include &lt;net-snmp/net-snmp-includes.h&gt;</span>
00007 <span class="preprocessor">#include &lt;net-snmp/agent/net-snmp-agent-includes.h&gt;</span>
00008 
00009 <span class="preprocessor">#include &lt;net-snmp/agent/baby_steps.h&gt;</span>
00010 
00011 <span class="preprocessor">#define BABY_STEPS_PER_MODE_MAX     4</span>
00012 <span class="preprocessor">#define BSTEP_USE_ORIGINAL          0xffff</span>
00013 
00014 <span class="keyword">static</span> u_short get_mode_map[BABY_STEPS_PER_MODE_MAX] = {
00015     MODE_BSTEP_PRE_REQUEST, MODE_BSTEP_OBJECT_LOOKUP, BSTEP_USE_ORIGINAL, MODE_BSTEP_POST_REQUEST };
00016 
00017 <span class="keyword">static</span> u_short set_mode_map[SNMP_MSG_INTERNAL_SET_MAX][BABY_STEPS_PER_MODE_MAX] = {
00018     <span class="comment">/*R1*/</span>
00019     { MODE_BSTEP_PRE_REQUEST, MODE_BSTEP_OBJECT_LOOKUP, MODE_BSTEP_ROW_CREATE,
00020       MODE_BSTEP_CHECK_VALUE },
00021     <span class="comment">/*R2*/</span>
00022     { MODE_BSTEP_UNDO_SETUP, BABY_STEP_NONE, BABY_STEP_NONE, BABY_STEP_NONE },
00023     <span class="comment">/*A */</span>
00024     { MODE_BSTEP_SET_VALUE,MODE_BSTEP_CHECK_CONSISTENCY,
00025       MODE_BSTEP_COMMIT, BABY_STEP_NONE },
00026     <span class="comment">/*C */</span>
00027     { MODE_BSTEP_IRREVERSIBLE_COMMIT, MODE_BSTEP_UNDO_CLEANUP, MODE_BSTEP_POST_REQUEST,
00028       BABY_STEP_NONE},
00029     <span class="comment">/*F */</span>
00030     { MODE_BSTEP_UNDO_CLEANUP, MODE_BSTEP_POST_REQUEST, BABY_STEP_NONE,
00031       BABY_STEP_NONE },
00032     <span class="comment">/*U */</span>
00033     { MODE_BSTEP_UNDO_COMMIT, MODE_BSTEP_UNDO_SET, MODE_BSTEP_UNDO_CLEANUP,
00034       MODE_BSTEP_POST_REQUEST}
00035 };
00036 
00037 <span class="keyword">static</span> <span class="keywordtype">int</span>
00038 _baby_steps_helper(<a class="code" href="structnetsnmp__mib__handler__s.html">netsnmp_mib_handler</a> *handler,
00039                    <a class="code" href=
"structnetsnmp__handler__registration__s.html">netsnmp_handler_registration</a> *reginfo,
00040                    <a class="code" href=
"structnetsnmp__agent__request__info__s.html">netsnmp_agent_request_info</a> *reqinfo,
00041                    <a class="code" href="structnetsnmp__request__info__s.html">netsnmp_request_info</a> *requests);
00042 <span class="keyword">static</span> <span class="keywordtype">int</span>
00043 _baby_steps_access_multiplexer(<a class="code" href="structnetsnmp__mib__handler__s.html">netsnmp_mib_handler</a> *handler,
00044                                <a class="code" href=
"structnetsnmp__handler__registration__s.html">netsnmp_handler_registration</a> *reginfo,
00045                                <a class="code" href=
"structnetsnmp__agent__request__info__s.html">netsnmp_agent_request_info</a> *reqinfo,
00046                                <a class="code" href=
"structnetsnmp__request__info__s.html">netsnmp_request_info</a> *requests);
00047     
00056 <a class="code" href="structnetsnmp__mib__handler__s.html">netsnmp_mib_handler</a> *
<a name="l00057" id="l00057"></a><a class="code" href="group__baby__steps.html#ga0">00057</a> <a class="code" href=
"group__baby__steps.html#ga0">netsnmp_baby_steps_handler_get</a>(u_long modes)
00058 {
00059     <a class="code" href="structnetsnmp__mib__handler__s.html">netsnmp_mib_handler</a> *mh;
00060     netsnmp_baby_steps_modes *md;
00061 
00062     mh = <a class="code" href="group__handler.html#ga7">netsnmp_create_handler</a>(<span class=
"stringliteral">"baby_steps"</span>, _baby_steps_helper);
00063     <span class="keywordflow">if</span>(!mh)
00064         <span class="keywordflow">return</span> NULL;
00065 
00066     md = <a class="code" href="group__util.html#ga39">SNMP_MALLOC_TYPEDEF</a>(netsnmp_baby_steps_modes);
00067     <span class="keywordflow">if</span> (NULL == md) {
00068         <a class="code" href="group__snmp__logging.html#ga41">snmp_log</a>(LOG_ERR,<span class=
"stringliteral">"malloc failed in netsnmp_baby_steps_handler_get\n"</span>);
00069         <a class="code" href="group__handler.html#ga19">netsnmp_handler_free</a>(mh);
00070         mh = NULL;
00071     }
00072     <span class="keywordflow">else</span> {
00073         mh-&gt;<a class="code" href="structnetsnmp__mib__handler__s.html#o1">myvoid</a> = md;
00074         <span class="keywordflow">if</span> (0 == modes)
00075             modes = BABY_STEP_ALL;
00076         md-&gt;registered = modes;
00077     }
00078 
00079     <span class="comment">/*</span>
00080 <span class="comment">     * don't set MIB_HANDLER_AUTO_NEXT, since we need to call lower</span>
00081 <span class="comment">     * handlers with a munged mode.</span>
00082 <span class="comment">     */</span>
00083     
00084     <span class="keywordflow">return</span> mh;
00085 }
00086 
00088 <span class="keyword">static</span> <span class="keywordtype">int</span>
00089 _baby_steps_helper(<a class="code" href="structnetsnmp__mib__handler__s.html">netsnmp_mib_handler</a> *handler,
00090                          <a class="code" href=
"structnetsnmp__handler__registration__s.html">netsnmp_handler_registration</a> *reginfo,
00091                          <a class="code" href=
"structnetsnmp__agent__request__info__s.html">netsnmp_agent_request_info</a> *reqinfo,
00092                          <a class="code" href="structnetsnmp__request__info__s.html">netsnmp_request_info</a> *requests)
00093 {
00094     netsnmp_baby_steps_modes *bs_modes;
00095     <span class="keywordtype">int</span> save_mode, i, rc = SNMP_ERR_NOERROR;
00096     u_short *mode_map_ptr;
00097     
00098     DEBUGMSGTL((<span class="stringliteral">"baby_steps"</span>, <span class=
"stringliteral">"Got request, mode %s\n"</span>,
00099                 se_find_label_in_slist(<span class="stringliteral">"agent_mode"</span>,reqinfo-&gt;<a class="code" href=
"structnetsnmp__agent__request__info__s.html#o0">mode</a>)));
00100 
00101     bs_modes = handler-&gt;<a class="code" href="structnetsnmp__mib__handler__s.html#o1">myvoid</a>;
00102     netsnmp_assert(NULL != bs_modes);
00103 
00104     <span class="keywordflow">switch</span> (reqinfo-&gt;<a class="code" href=
"structnetsnmp__agent__request__info__s.html#o0">mode</a>) {
00105 
00106     <span class="keywordflow">case</span> MODE_SET_RESERVE1:
00107         <span class="comment">/*</span>
00108 <span class="comment">         * clear completed modes</span>
00109 <span class="comment">         * xxx-rks: this will break for pdus with set requests to different</span>
00110 <span class="comment">         * rows in the same table when the handler is set up to use the row</span>
00111 <span class="comment">         * merge helper as well (or if requests are serialized).</span>
00112 <span class="comment">         */</span>
00113         bs_modes-&gt;completed = 0;
00116     <span class="keywordflow">case</span> MODE_SET_RESERVE2:
00117     <span class="keywordflow">case</span> MODE_SET_ACTION:
00118     <span class="keywordflow">case</span> MODE_SET_COMMIT:
00119     <span class="keywordflow">case</span> MODE_SET_FREE:
00120     <span class="keywordflow">case</span> MODE_SET_UNDO:
00121         mode_map_ptr = set_mode_map[reqinfo-&gt;<a class="code" href=
"structnetsnmp__agent__request__info__s.html#o0">mode</a>];
00122         <span class="keywordflow">break</span>;
00123             
00124     <span class="keywordflow">default</span>:
00125         <span class="comment">/*</span>
00126 <span class="comment">         * clear completed modes</span>
00127 <span class="comment">         */</span>
00128         bs_modes-&gt;completed = 0;
00129 
00130         mode_map_ptr = get_mode_map;
00131     }
00132 
00133     <span class="comment">/*</span>
00134 <span class="comment">     * NOTE: if you update this chart, please update the versions in</span>
00135 <span class="comment">     *       local/mib2c-conf.d/parent-set.m2i</span>
00136 <span class="comment">     *       agent/mibgroup/helpers/baby_steps.c</span>
00137 <span class="comment">     * while you're at it.</span>
00138 <span class="comment">     */</span>
00139     <span class="comment">/*</span>
00140 <span class="comment">     ***********************************************************************</span>
00141 <span class="comment">     * Baby Steps Flow Chart (2004.06.05)                                  *</span>
00142 <span class="comment">     *                                                                     *</span>
00143 <span class="comment">     * +--------------+    +================+    U = unconditional path    *</span>
00144 <span class="comment">     * |optional state|    ||required state||    S = path for success      *</span>
00145 <span class="comment">     * +--------------+    +================+    E = path for error        *</span>
00146 <span class="comment">     ***********************************************************************</span>
00147 <span class="comment">     *</span>
00148 <span class="comment">     *                        +--------------+</span>
00149 <span class="comment">     *                        |     pre      |</span>
00150 <span class="comment">     *                        |   request    |</span>
00151 <span class="comment">     *                        +--------------+</span>
00152 <span class="comment">     *                               | U</span>
00153 <span class="comment">     * +-------------+        +==============+</span>
00154 <span class="comment">     * |    row    |f|&lt;-------||  object    ||</span>
00155 <span class="comment">     * |  create   |1|      E ||  lookup    ||</span>
00156 <span class="comment">     * +-------------+        +==============+</span>
00157 <span class="comment">     *     E |   | S                 | S</span>
00158 <span class="comment">     *       |   +------------------&gt;|</span>
00159 <span class="comment">     *       |                +==============+</span>
00160 <span class="comment">     *       |              E ||   check    ||</span>
00161 <span class="comment">     *       |&lt;---------------||   values   ||</span>
00162 <span class="comment">     *       |                +==============+</span>
00163 <span class="comment">     *       |                       | S</span>
00164 <span class="comment">     *       |                +==============+</span>
00165 <span class="comment">     *       |       +&lt;-------||   undo     ||</span>
00166 <span class="comment">     *       |       |      E ||   setup    ||</span>
00167 <span class="comment">     *       |       |        +==============+</span>
00168 <span class="comment">     *       |       |               | S</span>
00169 <span class="comment">     *       |       |        +==============+</span>
00170 <span class="comment">     *       |       |        ||    set     ||--------------------------&gt;+</span>
00171 <span class="comment">     *       |       |        ||   value    || E                         |</span>
00172 <span class="comment">     *       |       |        +==============+                           |</span>
00173 <span class="comment">     *       |       |               | S                                 |</span>
00174 <span class="comment">     *       |       |        +--------------+                           |</span>
00175 <span class="comment">     *       |       |        |    check     |--------------------------&gt;|</span>
00176 <span class="comment">     *       |       |        |  consistency | E                         |</span>
00177 <span class="comment">     *       |       |        +--------------+                           |</span>
00178 <span class="comment">     *       |       |               | S                                 |</span>
00179 <span class="comment">     *       |       |        +==============+         +==============+  |</span>
00180 <span class="comment">     *       |       |        ||   commit   ||--------&gt;||     undo   ||  |</span>
00181 <span class="comment">     *       |       |        ||            || E       ||    commit  ||  |</span>
00182 <span class="comment">     *       |       |        +==============+         +==============+  |</span>
00183 <span class="comment">     *       |       |               | S                     U |&lt;--------+</span>
00184 <span class="comment">     *       |       |        +--------------+         +==============+</span>
00185 <span class="comment">     *       |       |        | irreversible |         ||    undo    ||</span>
00186 <span class="comment">     *       |       |        |    commit    |         ||     set    ||</span>
00187 <span class="comment">     *       |       |        +--------------+         +==============+</span>
00188 <span class="comment">     *       |       |               | U                     U |</span>
00189 <span class="comment">     *       |       +--------------&gt;|&lt;------------------------+</span>
00190 <span class="comment">     *       |                +==============+</span>
00191 <span class="comment">     *       |                ||   undo     ||</span>
00192 <span class="comment">     *       |                ||  cleanup   ||</span>
00193 <span class="comment">     *       |                +==============+</span>
00194 <span class="comment">     *       +----------------------&gt;| U</span>
00195 <span class="comment">     *                               |</span>
00196 <span class="comment">     *                          (err &amp;&amp; f1)-------------------&gt;+</span>
00197 <span class="comment">     *                               |                         |</span>
00198 <span class="comment">     *                        +--------------+         +--------------+</span>
00199 <span class="comment">     *                        |    post      |&lt;--------|      row     |</span>
00200 <span class="comment">     *                        |   request    |       U |    release   |</span>
00201 <span class="comment">     *                        +--------------+         +--------------+</span>
00202 <span class="comment">     *</span>
00203 <span class="comment">     */</span>
00204     <span class="comment">/*</span>
00205 <span class="comment">     * save original mode</span>
00206 <span class="comment">     */</span>
00207     save_mode = reqinfo-&gt;<a class="code" href="structnetsnmp__agent__request__info__s.html#o0">mode</a>;
00208     <span class="keywordflow">for</span>(i = 0; i &lt; BABY_STEPS_PER_MODE_MAX; ++i ) {
00209         <span class="comment">/*</span>
00210 <span class="comment">         * break if we run out of baby steps for this mode</span>
00211 <span class="comment">         */</span>
00212         <span class="keywordflow">if</span>(mode_map_ptr[i] == BABY_STEP_NONE)
00213             <span class="keywordflow">break</span>;
00214 
00215         DEBUGMSGTL((<span class="stringliteral">"baby_steps"</span>, <span class=
"stringliteral">" baby step mode %s\n"</span>,
00216                     se_find_label_in_slist(<span class="stringliteral">"babystep_mode"</span>,mode_map_ptr[i])));
00217 
00218         <span class="comment">/*</span>
00219 <span class="comment">         * skip modes the handler didn't register for</span>
00220 <span class="comment">         */</span>
00221         <span class="keywordflow">if</span> (BSTEP_USE_ORIGINAL != mode_map_ptr[i]) {
00222             u_int    mode_flag;
00223 
00224             <span class="comment">/*</span>
00225 <span class="comment">             * skip undo commit if commit wasn't hit, and</span>
00226 <span class="comment">             * undo_cleanup if undo_setup wasn't hit.</span>
00227 <span class="comment">             */</span>
00228             <span class="keywordflow">if</span>((MODE_SET_UNDO == save_mode) &amp;&amp;
00229                (MODE_BSTEP_UNDO_COMMIT == mode_map_ptr[i]) &amp;&amp;
00230                !(BABY_STEP_COMMIT &amp; bs_modes-&gt;completed)) {
00231                 DEBUGMSGTL((<span class="stringliteral">"baby_steps"</span>,
00232                             <span class="stringliteral">"   skipping commit undo (no commit)\n"</span>));
00233                 <span class="keywordflow">continue</span>;
00234             }
00235             <span class="keywordflow">else</span> <span class=
"keywordflow">if</span>((MODE_SET_FREE == save_mode) &amp;&amp;
00236                (MODE_BSTEP_UNDO_CLEANUP == mode_map_ptr[i]) &amp;&amp;
00237                !(BABY_STEP_UNDO_SETUP &amp; bs_modes-&gt;completed)) {
00238                 DEBUGMSGTL((<span class="stringliteral">"baby_steps"</span>,
00239                             <span class="stringliteral">"   skipping undo cleanup (no undo setup)\n"</span>));
00240                 <span class="keywordflow">continue</span>;
00241             }
00242 
00243             reqinfo-&gt;<a class="code" href="structnetsnmp__agent__request__info__s.html#o0">mode</a> = mode_map_ptr[i];
00244             mode_flag = netsnmp_baby_step_mode2flag( mode_map_ptr[i] );
00245             <span class="keywordflow">if</span>((mode_flag &amp; bs_modes-&gt;registered))
00246                 bs_modes-&gt;completed |= mode_flag;
00247             <span class="keywordflow">else</span> {
00248                 DEBUGMSGTL((<span class="stringliteral">"baby_steps"</span>,
00249                             <span class="stringliteral">"   skipping mode (not registered)\n"</span>));
00250                 <span class="keywordflow">continue</span>;
00251             }
00252 
00253         
00254         }
00255         <span class="keywordflow">else</span> {
00256             reqinfo-&gt;<a class="code" href="structnetsnmp__agent__request__info__s.html#o0">mode</a> = save_mode;
00257         }
00258 
00259 <span class="preprocessor">#ifdef BABY_STEPS_NEXT_MODE</span>
00260         <span class="comment">/*</span>
00261 <span class="comment">         * I can't remember why I wanted the next mode in the request,</span>
00262 <span class="comment">         * but it's not used anywhere, so don't use this code. saved,</span>
00263 <span class="comment">         * in case I remember why I thought needed it. - rstory 040911</span>
00264 <span class="comment">         */</span>
00265         <span class="keywordflow">if</span>((BABY_STEPS_PER_MODE_MAX - 1) == i)
00266             reqinfo-&gt;next_mode_ok = BABY_STEP_NONE;
00267         <span class="keywordflow">else</span> {
00268             <span class="keywordflow">if</span>(BSTEP_USE_ORIGINAL == mode_map_ptr[i+1])
00269                 reqinfo-&gt;next_mode_ok = save_mode;
00270             <span class="keywordflow">else</span>
00271                 reqinfo-&gt;next_mode_ok = mode_map_ptr[i+1];
00272         }
00273 <span class="preprocessor">#endif</span>
00274 
00275         <span class="comment">/*</span>
00276 <span class="comment">         * call handlers for baby step</span>
00277 <span class="comment">         */</span>
00278         rc = <a class="code" href="group__handler.html#ga17">netsnmp_call_next_handler</a>(handler, reginfo, reqinfo,
00279                                        requests);
00280 
00281         <span class="comment">/*</span>
00282 <span class="comment">         * check for error calling handler (unlikely, but...)</span>
00283 <span class="comment">         */</span>
00284         <span class="keywordflow">if</span>(rc) {
00285             DEBUGMSGTL((<span class="stringliteral">"baby_steps"</span>, <span class=
"stringliteral">"   ERROR:handler error\n"</span>));
00286             <span class="keywordflow">break</span>;
00287         }
00288 
00289         <span class="comment">/*</span>
00290 <span class="comment">         * check for errors in any of the requests for GET-like, reserve1,</span>
00291 <span class="comment">         * reserve2 and action. (there is no recovery from errors</span>
00292 <span class="comment">         * in commit, free or undo.)</span>
00293 <span class="comment">         */</span>
00294         <span class="keywordflow">if</span> (MODE_IS_GET(save_mode)
00295             || (save_mode &lt; SNMP_MSG_INTERNAL_SET_COMMIT)) {
00296             rc = netsnmp_check_requests_error(requests);
00297             <span class="keywordflow">if</span>(rc) {
00298                 DEBUGMSGTL((<span class="stringliteral">"baby_steps"</span>, <span class=
"stringliteral">"   ERROR:request error\n"</span>));
00299                 <span class="keywordflow">break</span>;
00300             }
00301         }
00302     }
00303 
00304     <span class="comment">/*</span>
00305 <span class="comment">     * restore original mode</span>
00306 <span class="comment">     */</span>
00307     reqinfo-&gt;<a class="code" href="structnetsnmp__agent__request__info__s.html#o0">mode</a> = save_mode;
00308 
00309     
00310     <span class="keywordflow">return</span> rc;
00311 }
00312 
00317 <span class="keywordtype">void</span>
<a name="l00318" id="l00318"></a><a class="code" href="group__baby__steps.html#ga2">00318</a> <a class="code" href=
"group__baby__steps.html#ga2">netsnmp_baby_steps_handler_init</a>(<span class="keywordtype">void</span>)
00319 {
00320     <a class="code" href="group__handler.html#ga36">netsnmp_register_handler_by_name</a>(<span class=
"stringliteral">"baby_steps"</span>,
00321                                      <a class="code" href=
"group__baby__steps.html#ga0">netsnmp_baby_steps_handler_get</a>(BABY_STEP_ALL));
00322 }
00323 
00334 <a class="code" href="structnetsnmp__mib__handler__s.html">netsnmp_mib_handler</a> *
<a name="l00335" id="l00335"></a><a class="code" href="group__baby__steps.html#ga3">00335</a> <a class="code" href=
"group__baby__steps.html#ga3">netsnmp_baby_steps_access_multiplexer_get</a>(netsnmp_baby_steps_access_methods *am)
00336 {
00337     <a class="code" href="structnetsnmp__mib__handler__s.html">netsnmp_mib_handler</a> *mh;
00338 
00339     mh = <a class="code" href="group__handler.html#ga7">netsnmp_create_handler</a>(<span class=
"stringliteral">"baby_steps_mux"</span>,
00340                                 _baby_steps_access_multiplexer);
00341     <span class="keywordflow">if</span>(!mh)
00342         <span class="keywordflow">return</span> NULL;
00343 
00344     mh-&gt;<a class="code" href="structnetsnmp__mib__handler__s.html#o1">myvoid</a> = am;
00345     mh-&gt;<a class="code" href="structnetsnmp__mib__handler__s.html#o2">flags</a> |= MIB_HANDLER_AUTO_NEXT;
00346     
00347     <span class="keywordflow">return</span> mh;
00348 }
00349 
00351 <span class="keyword">static</span> <span class="keywordtype">int</span>
00352 _baby_steps_access_multiplexer(<a class="code" href="structnetsnmp__mib__handler__s.html">netsnmp_mib_handler</a> *handler,
00353                                <a class="code" href=
"structnetsnmp__handler__registration__s.html">netsnmp_handler_registration</a> *reginfo,
00354                                <a class="code" href=
"structnetsnmp__agent__request__info__s.html">netsnmp_agent_request_info</a> *reqinfo,
00355                                <a class="code" href=
"structnetsnmp__request__info__s.html">netsnmp_request_info</a> *requests)
00356 {
00357     <span class="keywordtype">void</span> *temp_void;
00358     Netsnmp_Node_Handler *method = NULL;
00359     netsnmp_baby_steps_access_methods *access_methods;
00360     <span class="keywordtype">int</span> rc = SNMP_ERR_NOERROR;
00361 
00363     netsnmp_assert((handler!=NULL) &amp;&amp; (reginfo!=NULL) &amp;&amp; (reqinfo!=NULL) &amp;&amp;
00364                    (requests!=NULL));
00365 
00366     DEBUGMSGT((<span class="stringliteral">"baby_steps_mux"</span>, <span class="stringliteral">"mode %s\n"</span>,
00367                se_find_label_in_slist(<span class="stringliteral">"babystep_mode"</span>,reqinfo-&gt;<a class="code" href=
"structnetsnmp__agent__request__info__s.html#o0">mode</a>)));
00368 
00369     access_methods = (netsnmp_baby_steps_access_methods *)handler-&gt;<a class="code" href=
"structnetsnmp__mib__handler__s.html#o1">myvoid</a>;
00370     <span class="keywordflow">if</span>(!access_methods) {
00371         <a class="code" href="group__snmp__logging.html#ga41">snmp_log</a>(LOG_ERR,<span class=
"stringliteral">"baby_steps_access_multiplexer has no methods\n"</span>);
00372         <span class="keywordflow">return</span> SNMPERR_GENERR;
00373     }
00374 
00375     <span class="keywordflow">switch</span>(reqinfo-&gt;<a class="code" href=
"structnetsnmp__agent__request__info__s.html#o0">mode</a>) {
00376         
00377     <span class="keywordflow">case</span> MODE_BSTEP_PRE_REQUEST:
00378         <span class="keywordflow">if</span>( access_methods-&gt;pre_request )
00379             method = access_methods-&gt;pre_request;
00380         <span class="keywordflow">break</span>;
00381         
00382     <span class="keywordflow">case</span> MODE_BSTEP_OBJECT_LOOKUP:
00383         <span class="keywordflow">if</span>( access_methods-&gt;object_lookup )
00384             method = access_methods-&gt;object_lookup;
00385         <span class="keywordflow">break</span>;
00386 
00387     <span class="keywordflow">case</span> SNMP_MSG_GET:
00388     <span class="keywordflow">case</span> SNMP_MSG_GETNEXT:
00389         <span class="keywordflow">if</span>( access_methods-&gt;get_values )
00390             method = access_methods-&gt;get_values;
00391         <span class="keywordflow">break</span>;
00392         
00393     <span class="keywordflow">case</span> MODE_BSTEP_CHECK_VALUE:
00394         <span class="keywordflow">if</span>( access_methods-&gt;object_syntax_checks )
00395             method = access_methods-&gt;object_syntax_checks;
00396         <span class="keywordflow">break</span>;
00397 
00398     <span class="keywordflow">case</span> MODE_BSTEP_ROW_CREATE:
00399         <span class="keywordflow">if</span>( access_methods-&gt;row_creation )
00400             method = access_methods-&gt;row_creation;
00401         <span class="keywordflow">break</span>;
00402 
00403     <span class="keywordflow">case</span> MODE_BSTEP_UNDO_SETUP:
00404         <span class="keywordflow">if</span>( access_methods-&gt;undo_setup )
00405             method = access_methods-&gt;undo_setup;
00406         <span class="keywordflow">break</span>;
00407 
00408     <span class="keywordflow">case</span> MODE_BSTEP_SET_VALUE:
00409         <span class="keywordflow">if</span>( access_methods-&gt;set_values )
00410             method = access_methods-&gt;set_values;
00411         <span class="keywordflow">break</span>;
00412 
00413     <span class="keywordflow">case</span> MODE_BSTEP_CHECK_CONSISTENCY:
00414         <span class="keywordflow">if</span>( access_methods-&gt;consistency_checks )
00415             method = access_methods-&gt;consistency_checks;
00416         <span class="keywordflow">break</span>;
00417 
00418     <span class="keywordflow">case</span> MODE_BSTEP_UNDO_SET:
00419         <span class="keywordflow">if</span>( access_methods-&gt;undo_sets )
00420             method = access_methods-&gt;undo_sets;
00421         <span class="keywordflow">break</span>;
00422 
00423     <span class="keywordflow">case</span> MODE_BSTEP_COMMIT:
00424         <span class="keywordflow">if</span>( access_methods-&gt;commit )
00425             method = access_methods-&gt;commit;
00426         <span class="keywordflow">break</span>;
00427 
00428     <span class="keywordflow">case</span> MODE_BSTEP_UNDO_COMMIT:
00429         <span class="keywordflow">if</span>( access_methods-&gt;undo_commit )
00430             method = access_methods-&gt;undo_commit;
00431         <span class="keywordflow">break</span>;
00432 
00433     <span class="keywordflow">case</span> MODE_BSTEP_IRREVERSIBLE_COMMIT:
00434         <span class="keywordflow">if</span>( access_methods-&gt;irreversible_commit )
00435             method = access_methods-&gt;irreversible_commit;
00436         <span class="keywordflow">break</span>;
00437 
00438     <span class="keywordflow">case</span> MODE_BSTEP_UNDO_CLEANUP:
00439         <span class="keywordflow">if</span>( access_methods-&gt;undo_cleanup )
00440             method = access_methods-&gt;undo_cleanup;
00441         <span class="keywordflow">break</span>;
00442         
00443     <span class="keywordflow">case</span> MODE_BSTEP_POST_REQUEST:
00444         <span class="keywordflow">if</span>( access_methods-&gt;post_request )
00445             method = access_methods-&gt;post_request;
00446         <span class="keywordflow">break</span>;
00447 
00448     <span class="keywordflow">default</span>:
00449         <a class="code" href="group__snmp__logging.html#ga41">snmp_log</a>(LOG_ERR,<span class=
"stringliteral">"unknown mode %d\n"</span>, reqinfo-&gt;<a class="code" href=
"structnetsnmp__agent__request__info__s.html#o0">mode</a>);
00450         <span class="keywordflow">return</span> SNMP_ERR_GENERR;
00451     }
00452 
00453     <span class="comment">/*</span>
00454 <span class="comment">     * if method exists, set up handler void and call method.</span>
00455 <span class="comment">     */</span>
00456     <span class="keywordflow">if</span>(NULL != method) {
00457         temp_void = handler-&gt;<a class="code" href="structnetsnmp__mib__handler__s.html#o1">myvoid</a>;
00458         handler-&gt;<a class="code" href=
"structnetsnmp__mib__handler__s.html#o1">myvoid</a> = access_methods-&gt;my_access_void;
00459         rc = (*method)(handler, reginfo, reqinfo, requests);
00460         handler-&gt;<a class="code" href="structnetsnmp__mib__handler__s.html#o1">myvoid</a> = temp_void;
00461     }
00462     <span class="keywordflow">else</span> {
00463         rc = SNMP_ERR_GENERR;
00464         <a class="code" href="group__snmp__logging.html#ga41">snmp_log</a>(LOG_ERR,<span class=
"stringliteral">"baby steps multiplexer handler called for a mode "</span>
00465                  <span class="stringliteral">"with no handler\n"</span>);
00466         netsnmp_assert(NULL != method);
00467     }
00468 
00469     <span class="comment">/*</span>
00470 <span class="comment">     * don't call any lower handlers, it will be done for us </span>
00471 <span class="comment">     * since we set MIB_HANDLER_AUTO_NEXT</span>
00472 <span class="comment">     */</span>
00473 
00474     <span class="keywordflow">return</span> rc;
00475 }
00476 
00477 <span class="comment">/*</span>
00478 <span class="comment"> * give a baby step mode, return the flag for that mode</span>
00479 <span class="comment"> */</span>
00480 <span class="keywordtype">int</span>
00481 netsnmp_baby_step_mode2flag( u_int mode )
00482 {
00483     <span class="keywordflow">switch</span>( mode ) {
00484         <span class="keywordflow">case</span> MODE_BSTEP_OBJECT_LOOKUP:
00485             <span class="keywordflow">return</span> BABY_STEP_OBJECT_LOOKUP;
00486         <span class="keywordflow">case</span> MODE_BSTEP_SET_VALUE:
00487             <span class="keywordflow">return</span> BABY_STEP_SET_VALUE;
00488         <span class="keywordflow">case</span> MODE_BSTEP_IRREVERSIBLE_COMMIT:
00489             <span class="keywordflow">return</span> BABY_STEP_IRREVERSIBLE_COMMIT;
00490         <span class="keywordflow">case</span> MODE_BSTEP_CHECK_VALUE:
00491             <span class="keywordflow">return</span> BABY_STEP_CHECK_VALUE;
00492         <span class="keywordflow">case</span> MODE_BSTEP_PRE_REQUEST:
00493             <span class="keywordflow">return</span> BABY_STEP_PRE_REQUEST;
00494         <span class="keywordflow">case</span> MODE_BSTEP_POST_REQUEST:
00495             <span class="keywordflow">return</span> BABY_STEP_POST_REQUEST;
00496         <span class="keywordflow">case</span> MODE_BSTEP_UNDO_SETUP:
00497             <span class="keywordflow">return</span> BABY_STEP_UNDO_SETUP;
00498         <span class="keywordflow">case</span> MODE_BSTEP_UNDO_CLEANUP:
00499             <span class="keywordflow">return</span> BABY_STEP_UNDO_CLEANUP;
00500         <span class="keywordflow">case</span> MODE_BSTEP_UNDO_SET:
00501             <span class="keywordflow">return</span> BABY_STEP_UNDO_SET;
00502         <span class="keywordflow">case</span> MODE_BSTEP_ROW_CREATE:
00503             <span class="keywordflow">return</span> BABY_STEP_ROW_CREATE;
00504         <span class="keywordflow">case</span> MODE_BSTEP_CHECK_CONSISTENCY:
00505             <span class="keywordflow">return</span> BABY_STEP_CHECK_CONSISTENCY;
00506         <span class="keywordflow">case</span> MODE_BSTEP_COMMIT:
00507             <span class="keywordflow">return</span> BABY_STEP_COMMIT;
00508         <span class="keywordflow">case</span> MODE_BSTEP_UNDO_COMMIT:
00509             <span class="keywordflow">return</span> BABY_STEP_UNDO_COMMIT;
00510         <span class="keywordflow">default</span>:
00511             netsnmp_assert(<span class="stringliteral">"unknown flag"</span>);
00512             <span class="keywordflow">break</span>;
00513     }
00514     <span class="keywordflow">return</span> 0;
00515 }
</pre>
  </div>
  <hr size="1" />

  <address style="align: right;">
    <small>Generated on Fri Dec 30 13:47:44 2005 for net-snmp by&nbsp; <a href="http://www.doxygen.org/index.html"><img src=
    "doxygen.png" alt="doxygen" align="middle" border="0" /></a> 1.3.9.1</small>
  </address>
<!-- CONTENT END -->
<!--#include virtual="/page-bottom.html" -->





See more files for this project here

net-snmp

net-snmp provides tools and libraries relating to the Simple Network\r\nManagement Protocol including: An extensible agent, An SNMP library,\r\ntools to request or set information from SNMP agents, tools to\r\ngenerate and handle SNMP traps, etc.\r\n

Project homepage: http://sourceforge.net/projects/net-snmp
Programming language(s): C,Perl,Shell Script
License: other

  mfd/
  acconfig_8h-source.html
  acconfig_8h.html
  agent_2snmp__perl_8c-source.html
  agent__callbacks_8h-source.html
  agent__callbacks_8h.html
  agent__handler_8c-source.html
  agent__handler_8c.html
  agent__handler_8h-source.html
  agent__handler_8h.html
  agent__index_8c-source.html
  agent__index_8c.html
  agent__index_8h-source.html
  agent__index_8h.html
  agent__module__config_8h-source.html
  agent__read__config_8c-source.html
  agent__read__config_8c.html
  agent__read__config_8h-source.html
  agent__read__config_8h.html
  agent__registry_8c-source.html
  agent__registry_8c.html
  agent__registry_8h-source.html
  agent__registry_8h.html
  agent__trap_8c-source.html
  agent__trap_8c.html
  agent__trap_8h-source.html
  agent__trap_8h.html
  all__helpers_8c-source.html
  all__helpers_8h-source.html
  annotated.html
  asn1_8c-source.html
  asn1_8h-source.html
  auto__nlist_8c-source.html
  auto__nlist_8c.html
  auto__nlist_8h-source.html
  auto__nlist_8h.html
  autonlist_8h-source.html
  autonlist_8h.html
  baby__steps_8c-source.html
  baby__steps_8h-source.html
  blah.html
  bulk__to__next_8c-source.html
  bulk__to__next_8h-source.html
  cache__handler_8c-source.html
  cache__handler_8h-source.html
  callback_8c-source.html
  callback_8h-source.html
  check__varbind_8c-source.html
  check__varbind_8h-source.html
  cmu__compat_8c-source.html
  cmu__compat_8h-source.html
  config_8h-source.html
  config_8h.html
  config__api_8h-source.html
  container_8c-source.html
  container_8h-source.html
  container__binary__array_8c-source.html
  container__binary__array_8h-source.html
  container__iterator_8c-source.html
  container__iterator_8h-source.html
  container__list__ssll_8c-source.html
  container__list__ssll_8h-source.html
  container__null_8c-source.html
  container__null_8h-source.html
  data__list_8c-source.html
  data__list_8h-source.html
  data__set_8c-example.html
  data__set_8c-source.html
  data__set_8h-source.html
  debug__handler_8c-source.html
  debug__handler_8h-source.html
  default__store_8c-source.html
  default__store_8h-source.html
  default_store.html
  definitions_8h-source.html
  delayed__instance_8c-example.html
  delayed__instance_8c-source.html
  delayed__instance_8h-source.html
  deprecated.html
  dir_000000.html
  dir_000001.html
  dir_000002.html
  dir_000003.html
  dir_000004.html
  dir_000005.html
  dir_000006.html
  dir_000007.html
  dir_000008.html
  doxygen.css
  doxygen.gif
  doxygen.png
  ds__agent_8h-source.html
  ds__agent_8h.html
  example_8c-source.html
  example_8h-source.html
  examples.html
  factory_8h-source.html
  fd__event__manager_8c-source.html
  fd__event__manager_8h-source.html
  file__utils_8c-source.html
  file__utils_8h-source.html
  files.html