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

SNMP编程

开发平台:

Unix_Linux

  1. #include <net-snmp/net-snmp-config.h>
  2. #ifdef dynix
  3. #  ifdef HAVE_SYS_SWAP_H
  4. #    include <sys/swap.h>
  5. #  endif
  6. #  ifdef HAVE_SYS_PARAM_H
  7. #    include <sys/param.h>
  8. #  endif
  9. #  ifdef HAVE_UNISTD_H
  10. #    include <unistd.h>
  11. #  endif
  12. #endif
  13. #include <net-snmp/net-snmp-includes.h>
  14. #include <net-snmp/agent/net-snmp-agent-includes.h>
  15. #include <net-snmp/agent/auto_nlist.h>
  16. #include "util_funcs.h"         /* utility function declarations */
  17. #include "memory.h"             /* the module-specific header */
  18. #include "memory_dynix.h"       /* the module-specific header */
  19. int             minimumswap;
  20. static char     errmsg[1024];
  21. static FindVarMethod var_extensible_mem;
  22. static long     getFreeSwap(void);
  23. static long     getTotalSwap(void);
  24. static long     getTotalFree(void);
  25. void
  26. init_memory_dynix(void)
  27. {
  28.     struct variable2 extensible_mem_variables[] = {
  29.         {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MIBINDEX}},
  30.         {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_mem, 1,
  31.          {ERRORNAME}},
  32.         {MEMTOTALSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  33.          {MEMTOTALSWAP}},
  34.         {MEMAVAILSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  35.          {MEMAVAILSWAP}},
  36.         {MEMTOTALREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  37.          {MEMTOTALREAL}},
  38.         {MEMAVAILREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  39.          {MEMAVAILREAL}},
  40.         {MEMTOTALSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  41.          {MEMTOTALSWAPTXT}},
  42.         {MEMUSEDSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  43.          {MEMUSEDSWAPTXT}},
  44.         {MEMTOTALREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  45.          {MEMTOTALREALTXT}},
  46.         {MEMUSEDREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  47.          {MEMUSEDREALTXT}},
  48.         {MEMTOTALFREE, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  49.          {MEMTOTALFREE}},
  50.         {MEMSWAPMINIMUM, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  51.          {MEMSWAPMINIMUM}},
  52.         {MEMSHARED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  53.          {MEMSHARED}},
  54.         {MEMBUFFER, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  55.          {MEMBUFFER}},
  56.         {MEMCACHED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  57.          {MEMCACHED}},
  58.         {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  59.          {ERRORFLAG}},
  60.         {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_mem, 1, {ERRORMSG}}
  61.     };
  62.     /*
  63.      * Define the OID pointer to the top of the mib tree that we're
  64.      * registering underneath 
  65.      */
  66.     oid             mem_variables_oid[] = { UCDAVIS_MIB, MEMMIBNUM };
  67.     /*
  68.      * register ourselves with the agent to handle our mib tree 
  69.      */
  70.     REGISTER_MIB("ucd-snmp/memory", extensible_mem_variables, variable2,
  71.                  mem_variables_oid);
  72.     snmpd_register_config_handler("swap", memory_parse_config,
  73.                                   memory_free_config, "min-avail");
  74. }
  75. static u_char  *
  76. var_extensible_mem(struct variable *vp,
  77.                    oid * name,
  78.                    size_t * length,
  79.                    int exact,
  80.                    size_t * var_len, WriteMethod ** write_method)
  81. {
  82.     static long     long_ret;
  83.     /*
  84.      * Initialize the return value to 0 
  85.      */
  86.     long_ret = 0;
  87.     if (header_generic(vp, name, length, exact, var_len, write_method))
  88.         return (NULL);
  89.     switch (vp->magic) {
  90.     case MIBINDEX:
  91.         long_ret = 0;
  92.         return ((u_char *) (&long_ret));
  93.     case ERRORNAME:            /* dummy name */
  94.         sprintf(errmsg, "swap");
  95.         *var_len = strlen(errmsg);
  96.         return ((u_char *) (errmsg));
  97.     case MEMTOTALSWAP:
  98.         long_ret = S2KB(getTotalSwap());
  99.         return ((u_char *) (&long_ret));
  100.     case MEMAVAILSWAP:
  101.         long_ret = S2KB(getFreeSwap());
  102.         return ((u_char *) (&long_ret));
  103.     case MEMSWAPMINIMUM:
  104.         long_ret = minimumswap;
  105.         return ((u_char *) (&long_ret));
  106.     case MEMTOTALREAL:
  107.         long_ret = P2KB(sysconf(_SC_PHYSMEM));
  108.         return ((u_char *) (&long_ret));
  109.     case MEMAVAILREAL:
  110.         long_ret = P2KB(sysconf(_SC_FREEMEM));
  111.         return ((u_char *) (&long_ret));
  112.     case MEMTOTALFREE:
  113.         long_ret = getTotalFree();
  114.         return ((u_char *) (&long_ret));
  115.     case ERRORFLAG:
  116.         long_ret = getTotalFree();
  117.         long_ret = (long_ret > minimumswap) ? 0 : 1;
  118.         return ((u_char *) (&long_ret));
  119.     case ERRORMSG:
  120.         long_ret = getTotalFree();
  121.         if ((long_ret > minimumswap) ? 0 : 1)
  122.             sprintf(errmsg, "Running out of swap space (%ld)", long_ret);
  123.         else
  124.             errmsg[0] = 0;
  125.         *var_len = strlen(errmsg);
  126.         return ((u_char *) (errmsg));
  127.     }
  128.     return (NULL);
  129. }
  130. #define DEFAULTMINIMUMSWAP 16384        /* kilobytes */
  131. void
  132. memory_parse_config(const char *token, char *cptr)
  133. {
  134.     minimumswap = atoi(cptr);
  135. }
  136. void
  137. memory_free_config(void)
  138. {
  139.     minimumswap = DEFAULTMINIMUMSWAP;
  140. }
  141. /*
  142.  * return is in sectors 
  143.  */
  144. long
  145. getTotalSwap(void)
  146. {
  147.     long            total_swp_sectors = -1;
  148.     size_t          max_elements = MAXSWAPDEVS;
  149.     swapsize_t      swap_dblks[MAXSWAPDEVS];
  150.     swapstat_t      swap_status;
  151.     int             swap_sizes;
  152.     if ((swap_sizes =
  153.          getswapstat(max_elements, swap_dblks, &swap_status) >= 0))
  154.         total_swp_sectors =
  155.             swap_dblks[0].sws_size * swap_dblks[0].sws_total;
  156.     return (total_swp_sectors);
  157. }
  158. /*
  159.  * return is in sectors 
  160.  */
  161. static long
  162. getFreeSwap(void)
  163. {
  164.     long            free_swp_sectors = -1;
  165.     size_t          max_elements = MAXSWAPDEVS;
  166.     swapsize_t      swap_dblks[MAXSWAPDEVS];
  167.     swapstat_t      swap_status;
  168.     int             i, swap_sizes;
  169.     if ((swap_sizes =
  170.          getswapstat(max_elements, swap_dblks, &swap_status) >= 0)) {
  171.         for (i = 0; i < swap_sizes; i++)
  172.             free_swp_sectors +=
  173.                 swap_dblks[0].sws_size * swap_dblks[i].sws_avail;
  174.     }
  175.     return (free_swp_sectors);
  176. }
  177. /*
  178.  * return is in kilobytes 
  179.  */
  180. static long
  181. getTotalFree(void)
  182. {
  183.     long            free_swap = S2KB(getFreeSwap());
  184.     long            free_mem = P2KB(sysconf(_SC_FREEMEM));
  185.     if (free_swap < 0)
  186.         return (free_swap);
  187.     if (free_mem < 0)
  188.         return (free_mem);
  189.     free_mem += free_swap;
  190.     return (free_mem);
  191. }