auto__nlist_8c-source.html from net-snmp at Krugle
Show auto__nlist_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>
</div>
<h1>auto_nlist.c</h1>
<div class="fragment">
<pre class="fragment">
00001 <span class="preprocessor">#include <net-snmp/net-snmp-config.h></span>
00002
00003 <span class="preprocessor">#ifdef CAN_USE_NLIST</span>
00004 <span class="preprocessor">#if HAVE_STRING_H</span>
00005 <span class="preprocessor">#include <string.h></span>
00006 <span class="preprocessor">#else</span>
00007 <span class="preprocessor">#include <strings.h></span>
00008 <span class="preprocessor">#endif</span>
00009
00010 <span class="preprocessor">#if HAVE_STDLIB_H</span>
00011 <span class="preprocessor">#include <stdlib.h></span>
00012 <span class="preprocessor">#endif</span>
00013 <span class="preprocessor">#include <stdio.h></span>
00014 <span class="preprocessor">#include <errno.h></span>
00015 <span class="preprocessor">#include <fcntl.h></span>
00016 <span class="preprocessor">#include <netinet/in.h></span>
00017 <span class="preprocessor">#ifdef HAVE_NLIST_H</span>
00018 <span class="preprocessor">#include <nlist.h></span>
00019 <span class="preprocessor">#endif</span>
00020 <span class="preprocessor">#if HAVE_KVM_H</span>
00021 <span class="preprocessor">#include <kvm.h></span>
00022 <span class="preprocessor">#endif</span>
00023
00024 <span class="preprocessor">#include <net-snmp/agent/auto_nlist.h></span>
00025 <span class="preprocessor">#include "autonlist.h"</span>
00026 <span class="preprocessor">#include "kernel.h"</span>
00027
00028 <span class="preprocessor">#include <net-snmp/net-snmp-includes.h></span>
00029 <span class="preprocessor">#include <net-snmp/agent/ds_agent.h></span>
00030
00031 <span class="keyword">struct </span>autonlist *nlists = 0;
00032 <span class="keyword">static</span> <span class="keywordtype">void</span> init_nlist(<span class=
"keyword">struct</span> nlist *);
00033
00034 <span class="keywordtype">long</span>
00035 auto_nlist_value(<span class="keyword">const</span> <span class="keywordtype">char</span> *string)
00036 {
00037 <span class="keyword">struct </span>autonlist **ptr, *it = 0;
00038 <span class="keywordtype">int</span> cmp;
00039
00040 <span class="keywordflow">if</span> (string == 0)
00041 <span class="keywordflow">return</span> 0;
00042
00043 ptr = &nlists;
00044 <span class="keywordflow">while</span> (*ptr != 0 && it == 0) {
00045 cmp = strcmp((*ptr)->symbol, string);
00046 <span class="keywordflow">if</span> (cmp == 0)
00047 it = *ptr;
00048 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cmp < 0) {
00049 ptr = &((*ptr)->left);
00050 } <span class="keywordflow">else</span> {
00051 ptr = &((*ptr)->right);
00052 }
00053 }
00054 <span class="keywordflow">if</span> (*ptr == 0) {
00055 *ptr = (<span class="keyword">struct </span>autonlist *) malloc(<span class="keyword">sizeof</span>(<span class=
"keyword">struct</span> autonlist));
00056 it = *ptr;
00057 it->left = 0;
00058 it->right = 0;
00059 it->symbol = (<span class="keywordtype">char</span> *) malloc(strlen(string) + 1);
00060 strcpy(it->symbol, string);
00061 <span class="comment">/*</span>
00062 <span class="comment"> * allocate an extra byte for inclusion of a preceding '_' later </span>
00063 <span class="comment"> */</span>
00064 it->nl[0].n_name = (<span class="keywordtype">char</span> *) malloc(strlen(string) + 2);
00065 <span class="preprocessor">#ifdef aix4</span>
00066 strcpy(it->nl[0].n_name, string);
00067 <span class="preprocessor">#else</span>
00068 sprintf(it->nl[0].n_name, <span class="stringliteral">"_%s"</span>, string);
00069 <span class="preprocessor">#endif</span>
00070 it->nl[1].n_name = 0;
00071 init_nlist(it->nl);
00072 <span class="preprocessor">#ifndef aix4</span>
00073 <span class="keywordflow">if</span> (it->nl[0].n_type == 0) {
00074 strcpy(it->nl[0].n_name, string);
00075 init_nlist(it->nl);
00076 }
00077 <span class="preprocessor">#endif</span>
00078 <span class="keywordflow">if</span> (it->nl[0].n_type == 0) {
00079 <span class="keywordflow">if</span> (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
00080 NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
00081 <a class="code" href="group__snmp__logging.html#ga41">snmp_log</a>(LOG_ERR, <span class=
"stringliteral">"nlist err: neither %s nor _%s found.\n"</span>,
00082 string, string);
00083 }
00084 <span class="keywordflow">return</span> (-1);
00085 } <span class="keywordflow">else</span> {
00086 DEBUGMSGTL((<span class="stringliteral">"auto_nlist"</span>, <span class=
"stringliteral">"nlist: found symbol %s at %x.\n"</span>,
00087 it->symbol, it->nl[0].n_value));
00088 <span class="keywordflow">return</span> (it->nl[0].n_value);
00089 }
00090 } <span class="keywordflow">else</span>
00091 <span class="keywordflow">return</span> (it->nl[0].n_value);
00092 }
00093
00094 <span class="keywordtype">int</span>
00095 auto_nlist(<span class="keyword">const</span> <span class="keywordtype">char</span> *string, <span class=
"keywordtype">char</span> *var, <span class="keywordtype">int</span> size)
00096 {
00097 <span class="keywordtype">long</span> result;
00098 <span class="keywordtype">int</span> ret;
00099 result = auto_nlist_value(string);
00100 <span class="keywordflow">if</span> (result != -1) {
00101 <span class="keywordflow">if</span> (var != NULL) {
00102 ret = klookup(result, var, size);
00103 <span class="keywordflow">if</span> (!ret)
00104 <a class="code" href="group__snmp__logging.html#ga41">snmp_log</a>(LOG_ERR,
00105 <span class="stringliteral">"auto_nlist failed on %s at location %lx\n"</span>,
00106 string, result);
00107 <span class="keywordflow">return</span> ret;
00108 } <span class="keywordflow">else</span>
00109 <span class="keywordflow">return</span> 1;
00110 }
00111 <span class="keywordflow">return</span> 0;
00112 }
00113
00114 <span class="keyword">static</span> <span class="keywordtype">void</span>
00115 init_nlist(<span class="keyword">struct</span> nlist nl[])
00116 {
00117 <span class="preprocessor">#ifdef CAN_USE_NLIST</span>
00118 <span class="keywordtype">int</span> ret;
00119 <span class="preprocessor">#if HAVE_KVM_OPENFILES</span>
00120 kvm_t *kernel;
00121 <span class="keywordtype">char</span> kvm_errbuf[4096];
00122
00123 <span class="keywordflow">if</span> ((kernel = kvm_openfiles(KERNEL_LOC, NULL, NULL, O_RDONLY, kvm_errbuf))
00124 == NULL) {
00125 <span class="keywordflow">if</span> (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
00126 NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
00127 <span class="keywordflow">return</span>;
00128 } <span class="keywordflow">else</span> {
00129 snmp_log_perror(<span class="stringliteral">"kvm_openfiles"</span>);
00130 <a class="code" href="group__snmp__logging.html#ga41">snmp_log</a>(LOG_ERR, <span class=
"stringliteral">"kvm_openfiles: %s\n"</span>, kvm_errbuf);
00131 exit(1);
00132 }
00133 }
00134 <span class="keywordflow">if</span> ((ret = kvm_nlist(kernel, nl)) == -1) {
00135 <span class="keywordflow">if</span> (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
00136 NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
00137 <span class="keywordflow">return</span>;
00138 } <span class="keywordflow">else</span> {
00139 snmp_log_perror(<span class="stringliteral">"kvm_nlist"</span>);
00140 exit(1);
00141 }
00142 }
00143 kvm_close(kernel);
00144 <span class="preprocessor">#else </span><span class="comment">/* ! HAVE_KVM_OPENFILES */</span>
00145 <span class="preprocessor">#if defined(aix4) && defined(HAVE_KNLIST)</span>
00146 <span class="keywordflow">if</span> (knlist(nl, 1, <span class="keyword">sizeof</span>(<span class=
"keyword">struct</span> nlist)) == -1) {
00147 DEBUGMSGTL((<span class="stringliteral">"auto_nlist"</span>, <span class=
"stringliteral">"knlist failed on symbol: %s\n"</span>,
00148 nl[0].n_name));
00149 <span class="keywordflow">if</span> (errno == EFAULT) {
00150 nl[0].n_type = 0;
00151 nl[0].n_value = 0;
00152 } <span class="keywordflow">else</span> {
00153 snmp_log_perror(<span class="stringliteral">"knlist"</span>);
00154 <span class="keywordflow">if</span> (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
00155 NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
00156 <span class="keywordflow">return</span>;
00157 } <span class="keywordflow">else</span> {
00158 exit(1);
00159 }
00160 }
00161 }
00162 <span class="preprocessor">#else</span>
00163 <span class="keywordflow">if</span> ((ret = nlist(KERNEL_LOC, nl)) == -1) {
00164 <span class="keywordflow">if</span> (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
00165 NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
00166 <span class="keywordflow">return</span>;
00167 } <span class="keywordflow">else</span> {
00168 snmp_log_perror(<span class="stringliteral">"nlist"</span>);
00169 exit(1);
00170 }
00171 }
00172 <span class="preprocessor">#endif </span><span class="comment">/*aix4 */</span>
00173 <span class="preprocessor">#endif </span><span class="comment">/* ! HAVE_KVM_OPENFILES */</span>
00174 <span class="keywordflow">for</span> (ret = 0; nl[ret].n_name != NULL; ret++) {
00175 <span class="preprocessor">#ifdef aix4</span>
00176 <span class="keywordflow">if</span> (nl[ret].n_type == 0 && nl[ret].n_value != 0)
00177 nl[ret].n_type = 1;
00178 <span class="preprocessor">#endif</span>
00179 <span class="keywordflow">if</span> (nl[ret].n_type == 0) {
00180 <span class="keywordflow">if</span> (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
00181 NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
00182 DEBUGMSGTL((<span class="stringliteral">"auto_nlist"</span>, <span class=
"stringliteral">"nlist err: %s not found\n"</span>,
00183 nl[ret].n_name));
00184 }
00185 } <span class="keywordflow">else</span> {
00186 DEBUGMSGTL((<span class="stringliteral">"auto_nlist"</span>, <span class=
"stringliteral">"nlist: %s 0x%X\n"</span>, nl[ret].n_name,
00187 (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>) nl[ret].n_value));
00188 }
00189 }
00190 <span class="preprocessor">#endif </span><span class="comment">/* CAN_USE_NLIST */</span>
00191 }
00192
00193 <span class="keywordtype">int</span>
00194 KNLookup(<span class="keyword">struct</span> nlist nl[], <span class="keywordtype">int</span> nl_which, <span class=
"keywordtype">char</span> *buf, <span class="keywordtype">int</span> s)
00195 {
00196 <span class="keyword">struct </span>nlist *nlp = &nl[nl_which];
00197
00198 <span class="keywordflow">if</span> (nlp->n_value == 0) {
00199 <a class="code" href="group__snmp__logging.html#ga41">snmp_log</a>(LOG_ERR, <span class=
"stringliteral">"Accessing non-nlisted variable: %s\n"</span>,
00200 nlp->n_name);
00201 nlp->n_value = -1; <span class="comment">/* only one error message ... */</span>
00202 <span class="keywordflow">return</span> 0;
00203 }
00204 <span class="keywordflow">if</span> (nlp->n_value == -1)
00205 <span class="keywordflow">return</span> 0;
00206
00207 <span class="keywordflow">return</span> klookup(nlp->n_value, buf, s);
00208 }
00209
00210 <span class="preprocessor">#ifdef TESTING</span>
00211 <span class="keywordtype">void</span>
00212 auto_nlist_print_tree(<span class="keywordtype">int</span> indent, <span class="keyword">struct</span> autonlist *ptr)
00213 {
00214 <span class="keywordtype">char</span> buf[1024];
00215 <span class="keywordflow">if</span> (indent == -2) {
00216 <a class="code" href="group__snmp__logging.html#ga41">snmp_log</a>(LOG_ERR, <span class=
"stringliteral">"nlist tree:\n"</span>);
00217 auto_nlist_print_tree(12, nlists);
00218 } <span class="keywordflow">else</span> {
00219 <span class="keywordflow">if</span> (ptr == 0)
00220 <span class="keywordflow">return</span>;
00221 sprintf(buf, <span class="stringliteral">"%%%ds\n"</span>, indent);
00222 <span class="comment">/*</span>
00223 <span class="comment"> * DEBUGMSGTL(("auto_nlist", "buf: %s\n",buf)); </span>
00224 <span class="comment"> */</span>
00225 DEBUGMSGTL((<span class="stringliteral">"auto_nlist"</span>, buf, ptr->symbol));
00226 auto_nlist_print_tree(indent + 2, ptr->left);
00227 auto_nlist_print_tree(indent + 2, ptr->right);
00228 }
00229 }
00230 <span class="preprocessor">#endif</span>
00231 <span class="preprocessor">#else </span><span class="comment">/* !CAN_USE_NLIST */</span>
00232 <span class="preprocessor">#include <net-snmp/agent/auto_nlist.h></span>
00233 <span class="keywordtype">int</span>
00234 auto_nlist_noop(<span class="keywordtype">void</span>)
00235 {
00236 <span class="keywordflow">return</span> 0;
00237 }
00238 <span class="preprocessor">#endif </span><span class="comment">/* CAN_USE_NLIST */</span>
</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