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

SNMP编程

开发平台:

C/C++

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