auto_nlist.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:6k
- #include <net-snmp/net-snmp-config.h>
- #ifdef CAN_USE_NLIST
- #if HAVE_STRING_H
- #include <string.h>
- #else
- #include <strings.h>
- #endif
- #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 <net-snmp/agent/auto_nlist.h>
- #include "autonlist.h"
- #include "kernel.h"
- #include <net-snmp/net-snmp-includes.h>
- #include <net-snmp/agent/ds_agent.h>
- struct autonlist *nlists = 0;
- static 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) {
- if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
- NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
- 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;
- }
- static 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) {
- if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
- NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
- return;
- } else {
- snmp_log_perror("kvm_openfiles");
- snmp_log(LOG_ERR, "kvm_openfiles: %sn", kvm_errbuf);
- exit(1);
- }
- }
- if ((ret = kvm_nlist(kernel, nl)) == -1) {
- if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
- NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
- return;
- } else {
- snmp_log_perror("kvm_nlist");
- 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 (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
- NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
- return;
- } else {
- exit(1);
- }
- }
- }
- #else
- if ((ret = nlist(KERNEL_LOC, nl)) == -1) {
- if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
- NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
- return;
- } else {
- snmp_log_perror("nlist");
- 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) {
- if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
- NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
- 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
- #else /* !CAN_USE_NLIST */
- int
- auto_nlist_noop(void)
- {
- return 0;
- }
- #endif /* CAN_USE_NLIST */