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 Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class=
"qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="files.html">File List</a> | <a class=
"qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="pages.html">Related Pages</a> | <a class=
"qindex" href="examples.html">Examples</a>
</div>
<div class="nav">
<a class="el" href="dir_000003.html">agent</a> / <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 <net-snmp/net-snmp-config.h></span>
00006 <span class="preprocessor">#include <net-snmp/net-snmp-includes.h></span>
00007 <span class="preprocessor">#include <net-snmp/agent/net-snmp-agent-includes.h></span>
00008
00009 <span class="preprocessor">#include <net-snmp/agent/baby_steps.h></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-><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->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-><a class="code" href=
"structnetsnmp__agent__request__info__s.html#o0">mode</a>)));
00100
00101 bs_modes = handler-><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-><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->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-><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->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|<-------|| 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"> * | +------------------>|</span>
00159 <span class="comment"> * | +==============+</span>
00160 <span class="comment"> * | E || check ||</span>
00161 <span class="comment"> * |<---------------|| values ||</span>
00162 <span class="comment"> * | +==============+</span>
00163 <span class="comment"> * | | S</span>
00164 <span class="comment"> * | +==============+</span>
00165 <span class="comment"> * | +<-------|| 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 ||-------------------------->+</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 |-------------------------->|</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 ||-------->|| undo || |</span>
00181 <span class="comment"> * | | || || E || commit || |</span>
00182 <span class="comment"> * | | +==============+ +==============+ |</span>
00183 <span class="comment"> * | | | S U |<--------+</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"> * | +-------------->|<------------------------+</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"> * +---------------------->| U</span>
00195 <span class="comment"> * |</span>
00196 <span class="comment"> * (err && f1)------------------->+</span>
00197 <span class="comment"> * | |</span>
00198 <span class="comment"> * +--------------+ +--------------+</span>
00199 <span class="comment"> * | post |<--------| 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-><a class="code" href="structnetsnmp__agent__request__info__s.html#o0">mode</a>;
00208 <span class="keywordflow">for</span>(i = 0; i < 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) &&
00229 (MODE_BSTEP_UNDO_COMMIT == mode_map_ptr[i]) &&
00230 !(BABY_STEP_COMMIT & bs_modes->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) &&
00236 (MODE_BSTEP_UNDO_CLEANUP == mode_map_ptr[i]) &&
00237 !(BABY_STEP_UNDO_SETUP & bs_modes->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-><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 & bs_modes->registered))
00246 bs_modes->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-><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->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->next_mode_ok = save_mode;
00270 <span class="keywordflow">else</span>
00271 reqinfo->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 < 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-><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-><a class="code" href="structnetsnmp__mib__handler__s.html#o1">myvoid</a> = am;
00345 mh-><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) && (reginfo!=NULL) && (reqinfo!=NULL) &&
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-><a class="code" href=
"structnetsnmp__agent__request__info__s.html#o0">mode</a>)));
00368
00369 access_methods = (netsnmp_baby_steps_access_methods *)handler-><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-><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->pre_request )
00379 method = access_methods->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->object_lookup )
00384 method = access_methods->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->get_values )
00390 method = access_methods->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->object_syntax_checks )
00395 method = access_methods->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->row_creation )
00400 method = access_methods->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->undo_setup )
00405 method = access_methods->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->set_values )
00410 method = access_methods->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->consistency_checks )
00415 method = access_methods->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->undo_sets )
00420 method = access_methods->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->commit )
00425 method = access_methods->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->undo_commit )
00430 method = access_methods->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->irreversible_commit )
00435 method = access_methods->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->undo_cleanup )
00440 method = access_methods->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->post_request )
00445 method = access_methods->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-><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-><a class="code" href="structnetsnmp__mib__handler__s.html#o1">myvoid</a>;
00458 handler-><a class="code" href=
"structnetsnmp__mib__handler__s.html#o1">myvoid</a> = access_methods->my_access_void;
00459 rc = (*method)(handler, reginfo, reqinfo, requests);
00460 handler-><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 <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