auto_nlist.c
上传用户:cxs890
上传日期:2021-05-22
资源大小:347k
文件大小:5k
源码类别:

SNMP编程

开发平台:

C/C++

  1. #include <config.h>
  2. #ifdef CAN_USE_NLIST
  3. #if HAVE_STDLIB_H
  4. #include <stdlib.h>
  5. #endif
  6. #include <stdio.h>
  7. #include <errno.h>
  8. #include <fcntl.h>
  9. #include <netinet/in.h>
  10. #ifdef HAVE_NLIST_H
  11. #include <nlist.h>
  12. #endif
  13. #if HAVE_KVM_H
  14. #include <kvm.h>
  15. #endif
  16. #if HAVE_DMALLOC_H
  17. #include <dmalloc.h>
  18. #endif
  19. #include "auto_nlist.h"
  20. #include "autonlist.h"
  21. /*#include "kernel.h"*/
  22. #include "snmplib/system.h"
  23. #include "asn1.h"
  24. #include "snmp_api.h"
  25. #include "snmp_debug.h"
  26. #include "snmp_logging.h"
  27. #include "default_store.h"
  28. #include "ds_agent.h"
  29. struct autonlist *nlists = 0;
  30. void init_nlist (struct nlist *);
  31. long
  32. auto_nlist_value(const char *string)
  33. {
  34.   struct autonlist **ptr, *it=0;
  35.   int cmp;
  36.   if (string == 0)
  37.     return 0;
  38.   ptr = &nlists;
  39.   while(*ptr != 0 && it == 0) {
  40.     cmp = strcmp((*ptr)->symbol, string);
  41.     if (cmp == 0)
  42.       it = *ptr;
  43.     else if (cmp < 0) {
  44.       ptr = &((*ptr)->left);
  45.     } else {
  46.       ptr = &((*ptr)->right);
  47.     }
  48.   }
  49.   if (*ptr == 0) {
  50.     *ptr = (struct autonlist *) malloc(sizeof (struct autonlist));
  51.     it = *ptr;
  52.     it->left = 0;
  53.     it->right = 0;
  54.     it->symbol = (char *) malloc(strlen(string)+1);
  55.     strcpy(it->symbol,string);
  56.     /* allocate an extra byte for inclusion of a preceding '_' later */
  57.     it->nl[0].n_name = (char *) malloc(strlen(string)+2);
  58. #ifdef aix4
  59.     strcpy(it->nl[0].n_name,string);
  60. #else
  61.     sprintf(it->nl[0].n_name,"_%s",string);
  62. #endif
  63.     it->nl[1].n_name = 0;
  64.     init_nlist(it->nl);
  65. #ifndef aix4
  66.     if (it->nl[0].n_type == 0) {
  67.       strcpy(it->nl[0].n_name,string);
  68.       init_nlist(it->nl);
  69.     }
  70. #endif
  71.     if (it->nl[0].n_type == 0) {
  72.       snmp_log(LOG_ERR, "nlist err: neither %s nor _%s found.n", string, string);
  73.       return( -1 );
  74.     } else {
  75.       DEBUGMSGTL(("auto_nlist", "nlist:  found symbol %s at %x.n", it->symbol, it->nl[0].n_value));
  76.       return( it->nl[0].n_value );
  77.     }
  78.   }
  79.   else
  80.     return( it->nl[0].n_value );
  81. }
  82. int
  83. auto_nlist(const char *string,
  84.    char *var,
  85.    int size)
  86. {
  87.   long result;
  88.   int ret;
  89.   result = auto_nlist_value(string);
  90.   if (result != -1) {
  91.     if (var != NULL) {
  92.       ret = klookup(result, var, size);
  93.       if (!ret)
  94.         snmp_log(LOG_ERR, "auto_nlist failed on %s at location %lxn",
  95.                string, result);
  96.       return ret;
  97.     } else
  98.       return 1;
  99.   }
  100.   return 0;
  101. }
  102.  
  103. void
  104. init_nlist(struct nlist nl[])
  105. {
  106. #ifdef CAN_USE_NLIST
  107.   int ret;
  108. #if HAVE_KVM_OPENFILES
  109.   kvm_t *kernel;
  110.   char kvm_errbuf[4096];
  111.   if((kernel = kvm_openfiles(KERNEL_LOC, NULL, NULL, O_RDONLY, kvm_errbuf)) == NULL) {
  112.       snmp_log_perror("kvm_openfiles");
  113.       snmp_log(LOG_ERR, "kvm_openfiles: %sn", kvm_errbuf);
  114.       if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS))
  115. return;
  116.       else
  117. exit(1);
  118.   }
  119.   if ((ret = kvm_nlist(kernel, nl)) == -1) {
  120.       snmp_log_perror("kvm_nlist");
  121.       if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS))
  122. return;
  123.       else
  124. exit(1);
  125.   }
  126.   kvm_close(kernel);
  127. #else /* ! HAVE_KVM_OPENFILES */
  128. #if defined(aix4) && defined(HAVE_KNLIST)
  129.   if ( knlist(nl,1,sizeof(struct nlist)) == -1) {
  130.     DEBUGMSGTL(("auto_nlist", "knlist failed on symbol:  %sn", nl[0].n_name));
  131.     if ( errno == EFAULT ) {
  132.         nl[0].n_type = 0;
  133.         nl[0].n_value = 0;
  134.     } else {
  135.         snmp_log_perror("knlist");
  136.         if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS))
  137.   return;
  138.         else
  139.   exit(1);
  140.     }
  141.   }
  142. #else
  143.   if ((ret = nlist(KERNEL_LOC,nl)) == -1) {
  144.     snmp_log_perror("nlist");
  145.     if (ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS))
  146. return;
  147.     else
  148. exit(1);
  149.   }
  150. #endif /*aix4*/
  151. #endif /* ! HAVE_KVM_OPENFILES */
  152.   for(ret = 0; nl[ret].n_name != NULL; ret++) {
  153. #ifdef aix4
  154.       if (nl[ret].n_type == 0 && nl[ret].n_value != 0)
  155. nl[ret].n_type = 1;
  156. #endif
  157.       if (nl[ret].n_type == 0) {
  158.   DEBUGMSGTL(("auto_nlist", "nlist err:  %s not foundn",nl[ret].n_name));
  159.       } else {
  160.   DEBUGMSGTL(("auto_nlist", "nlist: %s 0x%Xn", nl[ret].n_name,
  161.                       (unsigned int)nl[ret].n_value));
  162.       }
  163.   }
  164. #endif /* CAN_USE_NLIST */
  165. }
  166. int KNLookup(struct nlist nl[],
  167.      int nl_which,
  168.      char *buf,
  169.      int s)
  170.     struct nlist *nlp = &nl[nl_which];
  171.     if (nlp->n_value == 0) {
  172.         snmp_log(LOG_ERR, "Accessing non-nlisted variable: %sn", nlp->n_name);
  173. nlp->n_value = -1; /* only one error message ... */
  174. return 0;
  175.     }
  176.     if (nlp->n_value == -1)
  177.         return 0;
  178.     return klookup(nlp->n_value, buf, s);
  179. }
  180. #ifdef TESTING
  181. void
  182. auto_nlist_print_tree(int indent,
  183.       struct autonlist *ptr)
  184. {
  185.   char buf[1024];
  186.   if (indent == -2) {
  187.     snmp_log(LOG_ERR, "nlist tree:n");
  188.     auto_nlist_print_tree(12,nlists);
  189.   } else {
  190.     if (ptr == 0)
  191.       return;
  192.     sprintf(buf,"%%%dsn",indent);
  193. /*    DEBUGMSGTL(("auto_nlist", "buf: %sn",buf)); */
  194.     DEBUGMSGTL(("auto_nlist", buf, ptr->symbol));
  195.     auto_nlist_print_tree(indent+2,ptr->left);
  196.     auto_nlist_print_tree(indent+2,ptr->right);
  197.   }
  198. }
  199. #endif
  200. #endif /* CAN_USE_NLIST */