auto_nlist.c
资源名称:snmp.src.rar [点击查看]
上传用户:cxs890
上传日期:2021-05-22
资源大小:347k
文件大小:5k
源码类别:
SNMP编程
开发平台:
C/C++
- #include <config.h>
- #ifdef CAN_USE_NLIST
- #if HAVE_STDLIB_H
- #include <stdlib.h>
- #endif
- #include <stdio.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <netinet/in.h>
- #ifdef HAVE_NLIST_H
- #include <nlist.h>
- #endif
- #if HAVE_KVM_H
- #include <kvm.h>
- #endif
- #if HAVE_DMALLOC_H
- #include <dmalloc.h>
- #endif
- #include "auto_nlist.h"
- #include "autonlist.h"
- /*#include "kernel.h"*/
- #include "snmplib/system.h"
- #include "asn1.h"
- #include "snmp_api.h"
- #include "snmp_debug.h"
- #include "snmp_logging.h"
- #include "default_store.h"
- #include "ds_agent.h"
- struct autonlist *nlists = 0;
- void init_nlist (struct nlist *);
- long
- auto_nlist_value(const char *string)
- {
- struct autonlist **ptr, *it=0;
- int cmp;
- if (string == 0)
- return 0;
- ptr = &nlists;
- while(*ptr != 0 && it == 0) {
- cmp = strcmp((*ptr)->symbol, string);
- if (cmp == 0)
- it = *ptr;
- else if (cmp < 0) {
- ptr = &((*ptr)->left);
- } else {
- ptr = &((*ptr)->right);
- }
- }
- if (*ptr == 0) {
- *ptr = (struct autonlist *) malloc(sizeof (struct autonlist));
- it = *ptr;
- it->left = 0;
- it->right = 0;
- it->symbol = (char *) malloc(strlen(string)+1);
- strcpy(it->symbol,string);
- /* allocate an extra byte for inclusion of a preceding '_' later */
- it->nl[0].n_name = (char *) malloc(strlen(string)+2);
- #ifdef aix4
- strcpy(it->nl[0].n_name,string);
- #else
- sprintf(it->nl[0].n_name,"_%s",string);
- #endif
- it->nl[1].n_name = 0;
- init_nlist(it->nl);
- #ifndef aix4
- if (it->nl[0].n_type == 0) {
- strcpy(it->nl[0].n_name,string);
- init_nlist(it->nl);
- }
- #endif
- if (it->nl[0].n_type == 0) {
- snmp_log(LOG_ERR, "nlist err: neither %s nor _%s found.n", string, string);
- return( -1 );
- } else {
- DEBUGMSGTL(("auto_nlist", "nlist: found symbol %s at %x.n", it->symbol, it->nl[0].n_value));
- return( it->nl[0].n_value );
- }
- }
- else
- return( it->nl[0].n_value );
- }
- int
- auto_nlist(const char *string,
- char *var,
- int size)
- {
- long result;
- int ret;
- result = auto_nlist_value(string);
- if (result != -1) {
- if (var != NULL) {
- ret = klookup(result, var, size);
- if (!ret)
- snmp_log(LOG_ERR, "auto_nlist failed on %s at location %lxn",
- string, result);
- return ret;
- } else
- return 1;
- }
- return 0;
- }
- void
- init_nlist(struct nlist nl[])
- {
- #ifdef CAN_USE_NLIST
- int ret;
- #if HAVE_KVM_OPENFILES
- kvm_t *kernel;
- char kvm_errbuf[4096];
- if((kernel = kvm_openfiles(KERNEL_LOC, NULL, NULL, O_RDONLY, kvm_errbuf)) == NULL) {
- snmp_log_perror("kvm_openfiles");
- snmp_log(LOG_ERR, "kvm_openfiles: %sn", kvm_errbuf);
- if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS))
- return;
- else
- exit(1);
- }
- if ((ret = kvm_nlist(kernel, nl)) == -1) {
- snmp_log_perror("kvm_nlist");
- if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS))
- return;
- else
- exit(1);
- }
- kvm_close(kernel);
- #else /* ! HAVE_KVM_OPENFILES */
- #if defined(aix4) && defined(HAVE_KNLIST)
- if ( knlist(nl,1,sizeof(struct nlist)) == -1) {
- DEBUGMSGTL(("auto_nlist", "knlist failed on symbol: %sn", nl[0].n_name));
- if ( errno == EFAULT ) {
- nl[0].n_type = 0;
- nl[0].n_value = 0;
- } else {
- snmp_log_perror("knlist");
- if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS))
- return;
- else
- exit(1);
- }
- }
- #else
- if ((ret = nlist(KERNEL_LOC,nl)) == -1) {
- snmp_log_perror("nlist");
- if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS))
- return;
- else
- exit(1);
- }
- #endif /*aix4*/
- #endif /* ! HAVE_KVM_OPENFILES */
- for(ret = 0; nl[ret].n_name != NULL; ret++) {
- #ifdef aix4
- if (nl[ret].n_type == 0 && nl[ret].n_value != 0)
- nl[ret].n_type = 1;
- #endif
- if (nl[ret].n_type == 0) {
- DEBUGMSGTL(("auto_nlist", "nlist err: %s not foundn",nl[ret].n_name));
- } else {
- DEBUGMSGTL(("auto_nlist", "nlist: %s 0x%Xn", nl[ret].n_name,
- (unsigned int)nl[ret].n_value));
- }
- }
- #endif /* CAN_USE_NLIST */
- }
- int KNLookup(struct nlist nl[],
- int nl_which,
- char *buf,
- int s)
- {
- struct nlist *nlp = &nl[nl_which];
- if (nlp->n_value == 0) {
- snmp_log(LOG_ERR, "Accessing non-nlisted variable: %sn", nlp->n_name);
- nlp->n_value = -1; /* only one error message ... */
- return 0;
- }
- if (nlp->n_value == -1)
- return 0;
- return klookup(nlp->n_value, buf, s);
- }
- #ifdef TESTING
- void
- auto_nlist_print_tree(int indent,
- struct autonlist *ptr)
- {
- char buf[1024];
- if (indent == -2) {
- snmp_log(LOG_ERR, "nlist tree:n");
- auto_nlist_print_tree(12,nlists);
- } else {
- if (ptr == 0)
- return;
- sprintf(buf,"%%%dsn",indent);
- /* DEBUGMSGTL(("auto_nlist", "buf: %sn",buf)); */
- DEBUGMSGTL(("auto_nlist", buf, ptr->symbol));
- auto_nlist_print_tree(indent+2,ptr->left);
- auto_nlist_print_tree(indent+2,ptr->right);
- }
- }
- #endif
- #endif /* CAN_USE_NLIST */