kernel.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:4k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  *  13 Jun 91  wsak (wk0x@andrew) added mips support
  3.  */
  4. #include <net-snmp/net-snmp-config.h>
  5. #ifdef CAN_USE_NLIST
  6. #include <sys/types.h>
  7. #if HAVE_STDLIB_H
  8. #include <stdlib.h>
  9. #endif
  10. #if HAVE_UNISTD_H
  11. #include <unistd.h>
  12. #endif
  13. #include <stdio.h>
  14. #include <errno.h>
  15. #if HAVE_STRING_H
  16. #include <string.h>
  17. #endif
  18. #if HAVE_FCNTL_H
  19. #include <fcntl.h>
  20. #endif
  21. #if HAVE_NETINET_IN_H
  22. #include <netinet/in.h>
  23. #endif
  24. #if HAVE_KVM_H
  25. #include <kvm.h>
  26. #endif
  27. #include <net-snmp/net-snmp-includes.h>
  28. #include "kernel.h"
  29. #include <net-snmp/agent/ds_agent.h>
  30. #ifndef NULL
  31. #define NULL 0
  32. #endif
  33. #if HAVE_KVM_H
  34. kvm_t          *kd;
  35. void
  36. init_kmem(const char *file)
  37. {
  38. #if HAVE_KVM_OPENFILES
  39.     char            err[4096];
  40.     kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, err);
  41.     if (kd == NULL && !netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
  42.    NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
  43.         snmp_log(LOG_CRIT, "init_kmem: kvm_openfiles failed: %sn", err);
  44.         exit(1);
  45.     }
  46. #else
  47.     kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
  48.     if (!kd && !netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
  49.        NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
  50.         snmp_log(LOG_CRIT, "init_kmem: kvm_open failed: %sn",
  51.                  strerror(errno));
  52.         exit(1);
  53.     }
  54. #endif                          /* HAVE_KVM_OPENFILES */
  55. }
  56. /*
  57.  *  klookup:
  58.  *
  59.  *  It seeks to the location  off  in kmem
  60.  *  It does a read into  target  of  siz  bytes.
  61.  *
  62.  *  Return 0 on failure and 1 on sucess.
  63.  *
  64.  */
  65. int
  66. klookup(unsigned long off, char *target, int siz)
  67. {
  68.     int             result;
  69.     if (kd == NULL)
  70.         return 0;
  71.     result = kvm_read(kd, off, target, siz);
  72.     if (result != siz) {
  73. #if HAVE_KVM_OPENFILES
  74.         snmp_log(LOG_ERR, "kvm_read(*, %lx, %p, %d) = %d: %sn", off,
  75.                  target, siz, result, kvm_geterr(kd));
  76. #else
  77.         snmp_log(LOG_ERR, "kvm_read(*, %lx, %p, %d) = %d: ", off, target,
  78.                  siz, result);
  79.         snmp_log_perror("klookup");
  80. #endif
  81.         return 0;
  82.     }
  83.     return 1;
  84. }
  85. #else                           /* HAVE_KVM_H */
  86. static off_t    klseek(off_t);
  87. static int      klread(char *, int);
  88. int             swap, mem, kmem;
  89. void
  90. init_kmem(const char *file)
  91. {
  92.     kmem = open(file, O_RDONLY);
  93.     if (kmem < 0 && !netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
  94.     NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
  95.         snmp_log_perror(file);
  96.         exit(1);
  97.     }
  98.     fcntl(kmem, F_SETFD, 1);
  99.     mem = open("/dev/mem", O_RDONLY);
  100.     if (mem < 0 && !netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
  101.    NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
  102.         snmp_log_perror("/dev/mem");
  103.         exit(1);
  104.     }
  105.     fcntl(mem, F_SETFD, 1);
  106. #ifdef DMEM_LOC
  107.     swap = open(DMEM_LOC, O_RDONLY);
  108.     if (swap < 0 && !netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
  109.     NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
  110.         snmp_log_perror(DMEM_LOC);
  111.         exit(1);
  112.     }
  113.     fcntl(swap, F_SETFD, 1);
  114. #endif
  115. }
  116. /*
  117.  *  Seek into the kernel for a value.
  118.  */
  119. static          off_t
  120. klseek(off_t base)
  121. {
  122.     return (lseek(kmem, (off_t) base, SEEK_SET));
  123. }
  124. /*
  125.  *  Read from the kernel 
  126.  */
  127. static int
  128. klread(char *buf, int buflen)
  129. {
  130.     return (read(kmem, buf, buflen));
  131. }
  132. /*
  133.  *  klookup:
  134.  *
  135.  *  It seeks to the location  off  in kmem
  136.  *  It does a read into  target  of  siz  bytes.
  137.  *
  138.  *  Return 0 on failure and 1 on sucess.
  139.  *
  140.  */
  141. int
  142. klookup(unsigned long off, char *target, int siz)
  143. {
  144.     long            retsiz;
  145.     if (kmem < 0)
  146.         return 0;
  147.     if ((retsiz = klseek((off_t) off)) != off) {
  148.         snmp_log(LOG_ERR, "klookup(%lx, %p, %d): ", off, target, siz);
  149.         snmp_log_perror("klseek");
  150. #ifdef EXIT_ON_BAD_KLREAD
  151.         exit(1);
  152. #endif
  153.         return (0);
  154.     }
  155.     if ((retsiz = klread(target, siz)) != siz) {
  156.         if (snmp_get_do_debugging()) {
  157.             /*
  158.              * these happen too often on too many architectures to print them
  159.              * unless we're in debugging mode. People get very full log files. 
  160.              */
  161.             snmp_log(LOG_ERR, "klookup(%lx, %p, %d): ", off, target, siz);
  162.             snmp_log_perror("klread");
  163.         }
  164. #ifdef EXIT_ON_BAD_KLREAD
  165.         exit(1);
  166. #endif
  167.         return (0);
  168.     }
  169.     return (1);
  170. }
  171. #endif                          /* HAVE_KVM_H */
  172. #endif                          /* CAN_USE_NLIST */