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

SNMP编程

开发平台:

Unix_Linux

  1. #include <net-snmp/net-snmp-config.h>
  2. #if HAVE_STDLIB_H
  3. #include <stdlib.h>
  4. #endif
  5. #if HAVE_UNISTD_H
  6. #include <unistd.h>
  7. #endif
  8. #if HAVE_FCNTL_H
  9. #include <fcntl.h>
  10. #endif
  11. #include <signal.h>
  12. #if TIME_WITH_SYS_TIME
  13. # ifdef WIN32
  14. #  include <sys/timeb.h>
  15. # else
  16. #  include <sys/time.h>
  17. # endif
  18. # include <time.h>
  19. #else
  20. # if HAVE_SYS_TIME_H
  21. #  include <sys/time.h>
  22. # else
  23. #  include <time.h>
  24. # endif
  25. #endif
  26. #if HAVE_MACHINE_PARAM_H
  27. #include <machine/param.h>
  28. #endif
  29. #if HAVE_SYS_PARAM_H
  30. #include <sys/param.h>
  31. #endif
  32. #if HAVE_SYS_VMMETER_H
  33. #if !(defined(bsdi2) || defined(netbsd1))
  34. #include <sys/vmmeter.h>
  35. #endif
  36. #endif
  37. #if HAVE_SYS_CONF_H
  38. #include <sys/conf.h>
  39. #endif
  40. #if HAVE_ASM_PAGE_H
  41. #include <asm/page.h>
  42. #endif
  43. #if HAVE_SYS_SWAP_H
  44. #include <sys/swap.h>
  45. #endif
  46. #if HAVE_SYS_FS_H
  47. #include <sys/fs.h>
  48. #else
  49. #if HAVE_UFS_FS_H
  50. #include <ufs/fs.h>
  51. #else
  52. #ifdef HAVE_SYS_STAT_H
  53. #include <sys/stat.h>
  54. #endif
  55. #ifdef HAVE_SYS_VNODE_H
  56. #include <sys/vnode.h>
  57. #endif
  58. #ifdef HAVE_UFS_UFS_QUOTA_H
  59. #include <ufs/ufs/quota.h>
  60. #endif
  61. #ifdef HAVE_UFS_UFS_INODE_H
  62. #include <ufs/ufs/inode.h>
  63. #endif
  64. #if HAVE_UFS_FFS_FS_H
  65. #include <ufs/ffs/fs.h>
  66. #endif
  67. #endif
  68. #endif
  69. #if HAVE_MTAB_H
  70. #include <mtab.h>
  71. #endif
  72. #include <errno.h>
  73. #if HAVE_FSTAB_H
  74. #include <fstab.h>
  75. #endif
  76. #if HAVE_SYS_STATFS_H
  77. #include <sys/statfs.h>
  78. #endif
  79. #if HAVE_SYS_STATVFS_H
  80. #include <sys/statvfs.h>
  81. #endif
  82. #if HAVE_SYS_VFS_H
  83. #include <sys/vfs.h>
  84. #endif
  85. #if (!defined(HAVE_STATVFS)) && defined(HAVE_STATFS)
  86. #if HAVE_SYS_PARAM_H
  87. #include <sys/param.h>
  88. #endif
  89. #if HAVE_SYS_MOUNT_H
  90. #include <sys/mount.h>
  91. #endif
  92. #if HAVE_SYS_SYSCTL_H
  93. #include <sys/sysctl.h>
  94. #endif
  95. #define statvfs statfs
  96. #endif
  97. #if HAVE_VM_VM_H
  98. #include <vm/vm.h>
  99. #endif
  100. #if HAVE_VM_SWAP_PAGER_H
  101. #include <vm/swap_pager.h>
  102. #endif
  103. #if HAVE_SYS_FIXPOINT_H
  104. #include <sys/fixpoint.h>
  105. #endif
  106. #if HAVE_MALLOC_H
  107. #include <malloc.h>
  108. #endif
  109. #if HAVE_STRING_H
  110. #include <string.h>
  111. #endif
  112. #if HAVE_WINSOCK_H
  113. #include <winsock.h>
  114. #endif
  115. #if HAVE_DMALLOC_H
  116. #include <dmalloc.h>
  117. #endif
  118. #include <net-snmp/net-snmp-includes.h>
  119. #include <net-snmp/agent/net-snmp-agent-includes.h>
  120. #include <net-snmp/agent/auto_nlist.h>
  121. #include "struct.h"
  122. #include "errormib.h"
  123. #include "util_funcs.h"
  124. static time_t   errorstatustime = 0;
  125. static int      errorstatusprior = 0;
  126. static char     errorstring[STRMAX];
  127. void
  128. setPerrorstatus(const char *to)
  129. {
  130.     char            buf[STRMAX];
  131.     snprintf(buf, sizeof(buf), "%s:  %s", to, strerror(errno));
  132.     buf[ sizeof(buf)-1 ] = 0;
  133.     snmp_log_perror(to);
  134.     seterrorstatus(buf, 5);
  135. }
  136. void
  137. seterrorstatus(const char *to, int prior)
  138. {
  139.     if (errorstatusprior <= prior ||
  140.         (ERRORTIMELENGTH < (time(NULL) - errorstatustime))) {
  141.         strncpy(errorstring, to, sizeof(errorstring));
  142.         errorstring[ sizeof(errorstring)-1 ] = 0;
  143.         errorstatusprior = prior;
  144.         errorstatustime = time(NULL);
  145.     }
  146. }
  147. void
  148. init_errormib(void)
  149. {
  150.     /*
  151.      * define the structure we're going to ask the agent to register our
  152.      * information at 
  153.      */
  154.     struct variable2 extensible_error_variables[] = {
  155.         {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_errors, 1,
  156.          {MIBINDEX}},
  157.         {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_errors, 1,
  158.          {ERRORNAME}},
  159.         {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_errors, 1,
  160.          {ERRORFLAG}},
  161.         {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_errors, 1,
  162.          {ERRORMSG}}
  163.     };
  164.     /*
  165.      * Define the OID pointer to the top of the mib tree that we're
  166.      * registering underneath 
  167.      */
  168.     oid             extensible_error_variables_oid[] =
  169.         { UCDAVIS_MIB, ERRORMIBNUM };
  170.     /*
  171.      * register ourselves with the agent to handle our mib tree 
  172.      */
  173.     REGISTER_MIB("ucd-snmp/errormib", extensible_error_variables,
  174.                  variable2, extensible_error_variables_oid);
  175. }
  176. /*
  177.  * var_extensible_errors(...
  178.  * Arguments:
  179.  * vp     IN      - pointer to variable entry that points here
  180.  * name    IN/OUT  - IN/name requested, OUT/name found
  181.  * length  IN/OUT  - length of IN/OUT oid's 
  182.  * exact   IN      - TRUE if an exact match was requested
  183.  * var_len OUT     - length of variable or 0 if function returned
  184.  * write_method
  185.  * 
  186.  */
  187. u_char         *
  188. var_extensible_errors(struct variable *vp,
  189.                       oid * name,
  190.                       size_t * length,
  191.                       int exact,
  192.                       size_t * var_len, WriteMethod ** write_method)
  193. {
  194.     static long     long_ret;
  195.     static char     errmsg[300];
  196.     if (header_generic(vp, name, length, exact, var_len, write_method))
  197.         return (NULL);
  198.     errmsg[0] = 0;
  199.     switch (vp->magic) {
  200.     case MIBINDEX:
  201.         long_ret = name[*length - 1];
  202.         return ((u_char *) (&long_ret));
  203.     case ERRORNAME:
  204.         strcpy(errmsg, "snmp");
  205.         *var_len = strlen(errmsg);
  206.         return ((u_char *) errmsg);
  207.     case ERRORFLAG:
  208.         long_ret =
  209.             (ERRORTIMELENGTH >= time(NULL) - errorstatustime) ? 1 : 0;
  210.         return ((u_char *) (&long_ret));
  211.     case ERRORMSG:
  212.         if ((ERRORTIMELENGTH >= time(NULL) - errorstatustime) ? 1 : 0) {
  213.             strncpy(errmsg, errorstring, sizeof(errmsg));
  214.             errmsg[ sizeof(errmsg)-1 ] = 0;
  215.         } else
  216.             errmsg[0] = 0;
  217.         *var_len = strlen(errmsg);
  218.         return ((u_char *) errmsg);
  219.     }
  220.     return NULL;
  221. }