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

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 <ctype.h>
  12. #include <signal.h>
  13. #if HAVE_MACHINE_PARAM_H
  14. #include <machine/param.h>
  15. #endif
  16. #if HAVE_SYS_VMMETER_H
  17. #if !defined(bsdi2) && !defined(netbsd1)
  18. #include <sys/vmmeter.h>
  19. #endif
  20. #endif
  21. #if HAVE_SYS_CONF_H
  22. #include <sys/conf.h>
  23. #endif
  24. #if HAVE_ASM_PAGE_H
  25. #include <asm/page.h>
  26. #endif
  27. #if HAVE_SYS_SWAP_H
  28. #include <sys/swap.h>
  29. #endif
  30. #if HAVE_SYS_FS_H
  31. #include <sys/fs.h>
  32. #else
  33. #if HAVE_UFS_FS_H
  34. #include <ufs/fs.h>
  35. #else
  36. #ifdef HAVE_SYS_STAT_H
  37. #include <sys/stat.h>
  38. #endif
  39. #ifdef HAVE_SYS_VNODE_H
  40. #include <sys/vnode.h>
  41. #endif
  42. #ifdef HAVE_UFS_UFS_QUOTA_H
  43. #include <ufs/ufs/quota.h>
  44. #endif
  45. #ifdef HAVE_UFS_UFS_INODE_H
  46. #include <ufs/ufs/inode.h>
  47. #endif
  48. #ifdef HAVE_SYS_PARAM_H
  49. #include <sys/param.h>
  50. #endif
  51. #if HAVE_UFS_FFS_FS_H
  52. #include <ufs/ffs/fs.h>
  53. #endif
  54. #endif
  55. #endif
  56. #if HAVE_MTAB_H
  57. #include <mtab.h>
  58. #endif
  59. #include <sys/stat.h>
  60. #include <errno.h>
  61. #if HAVE_FSTAB_H
  62. #include <fstab.h>
  63. #endif
  64. #if HAVE_SYS_STATVFS_H
  65. #include <sys/statvfs.h>
  66. #endif
  67. #if HAVE_SYS_VFS_H
  68. #include <sys/vfs.h>
  69. #endif
  70. #if (!defined(HAVE_STATVFS)) && defined(HAVE_STATFS)
  71. #if HAVE_SYS_PARAM_H
  72. #include <sys/param.h>
  73. #endif
  74. #if HAVE_SYS_MOUNT_H
  75. #include <sys/mount.h>
  76. #endif
  77. #if HAVE_SYS_SYSCTL_H
  78. #include <sys/sysctl.h>
  79. #endif
  80. #define statvfs statfs
  81. #endif
  82. #if HAVE_VM_SWAP_PAGER_H
  83. #include <vm/swap_pager.h>
  84. #endif
  85. #if HAVE_SYS_FIXPOINT_H
  86. #include <sys/fixpoint.h>
  87. #endif
  88. #if HAVE_MALLOC_H
  89. #include <malloc.h>
  90. #endif
  91. #if HAVE_STRING_H
  92. #include <string.h>
  93. #endif
  94. #if TIME_WITH_SYS_TIME
  95. # include <sys/time.h>
  96. # include <time.h>
  97. #else
  98. # if HAVE_SYS_TIME_H
  99. #  include <sys/time.h>
  100. # else
  101. #  include <time.h>
  102. # endif
  103. #endif
  104. #if defined(hpux10) || defined(hpux11)
  105. #include <sys/pstat.h>
  106. #endif
  107. #include <net-snmp/net-snmp-includes.h>
  108. #include <net-snmp/agent/net-snmp-agent-includes.h>
  109. #include <net-snmp/agent/auto_nlist.h>
  110. #include "mibdefs.h"
  111. #include "struct.h"
  112. #include "util_funcs.h"
  113. #include "memory.h"
  114. int             minimumswap;
  115. #ifndef linux
  116. static int      pageshift;      /* log base 2 of the pagesize */
  117. #else
  118. static int      log_procerr = 1;
  119. void
  120. getmem(unsigned long *memtotal, unsigned long *memfree, unsigned long *memshared, 
  121.        unsigned long *buffers, unsigned long *cached, unsigned long *swaptotal, 
  122.        unsigned long *swapfree);
  123. #endif
  124. #ifndef bsdi2
  125. #ifdef NSWAPDEV_SYMBOL
  126. int nswapdev=10;            /* taken from <machine/space.h> */
  127. #endif
  128. #ifdef NSWAPFS_SYMBOL
  129. int nswapfs=10;            /* taken from <machine/space.h> */
  130. #endif
  131. #endif      /* !bsdi2 */
  132. #define DEFAULTMINIMUMSWAP 16000        /* kilobytes */
  133. static FindVarMethod var_extensible_mem;
  134. void
  135. init_memory(void)
  136. {
  137. #ifdef linux
  138.     unsigned long memtotal, memfree, memshared, buffers, cached, swaptotal,
  139.         swapfree;
  140.     /*
  141.      * call once, to log errors for missing vars, then turn off logging
  142.      * of those errors.
  143.      */
  144.     getmem(&memtotal, &memfree, &memshared, &buffers, &cached, &swaptotal,
  145.            &swapfree);
  146.     log_procerr = 0;
  147. #else
  148.     int             pagesize;
  149. #ifdef PHYSMEM_SYMBOL
  150.     auto_nlist(PHYSMEM_SYMBOL, 0, 0);
  151. #endif
  152. #ifdef TOTAL_MEMORY_SYMBOL
  153.     auto_nlist(TOTAL_MEMORY_SYMBOL, 0, 0);
  154. #endif
  155. #ifdef MBSTAT_SYMBOL
  156.     auto_nlist(MBSTAT_SYMBOL, 0, 0);
  157. #endif
  158. #ifdef SWDEVT_SYMBOL
  159.     auto_nlist(SWDEVT_SYMBOL, 0, 0);
  160. #endif
  161. #ifdef FSWDEVT_SYMBOL
  162.     auto_nlist(FSWDEVT_SYMBOL, 0, 0);
  163. #endif
  164. #ifdef NSWAPFS_SYMBOL
  165.     auto_nlist(NSWAPFS_SYMBOL, 0, 0);
  166. #endif
  167. #ifdef NSWAPDEV_SYMBOL
  168.     auto_nlist(NSWAPDEV_SYMBOL, 0, 0);
  169. #endif
  170. #ifndef bsdi2
  171. #ifdef NSWAPDEV_SYMBOL
  172.     if (auto_nlist(NSWAPDEV_SYMBOL, (char *) &nswapdev, sizeof(nswapdev))
  173.         == 0)
  174.         return;
  175. #endif
  176. #ifdef NSWAPFS_SYMBOL
  177.     if (auto_nlist(NSWAPFS_SYMBOL, (char *) &nswapfs, sizeof(nswapfs)) ==
  178.         0)
  179.         return;
  180. #endif
  181. #endif /* bsdi2 */
  182.     pagesize = 1 << PGSHIFT;
  183.     pageshift = 0;
  184.     while (pagesize > 1) {
  185.         pageshift++;
  186.         pagesize >>= 1;
  187.     }
  188.     pageshift -= 10;
  189. #endif /* linux */
  190.     {
  191.         struct variable2 extensible_mem_variables[] = {
  192.             {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  193.              {MIBINDEX}},
  194.             {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_mem, 1,
  195.              {ERRORNAME}},
  196.             {MEMTOTALSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  197.              {MEMTOTALSWAP}},
  198.             {MEMAVAILSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  199.              {MEMAVAILSWAP}},
  200.             {MEMTOTALREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  201.              {MEMTOTALREAL}},
  202.             {MEMAVAILREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  203.              {MEMAVAILREAL}},
  204.             {MEMTOTALSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  205.              {MEMTOTALSWAPTXT}},
  206.             {MEMUSEDSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  207.              {MEMUSEDSWAPTXT}},
  208.             {MEMTOTALREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  209.              {MEMTOTALREALTXT}},
  210.             {MEMUSEDREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  211.              {MEMUSEDREALTXT}},
  212.             {MEMTOTALFREE, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  213.              {MEMTOTALFREE}},
  214.             {MEMSWAPMINIMUM, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  215.              {MEMSWAPMINIMUM}},
  216.             {MEMSHARED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  217.              {MEMSHARED}},
  218.             {MEMBUFFER, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  219.              {MEMBUFFER}},
  220.             {MEMCACHED, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  221.              {MEMCACHED}},
  222.             {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_mem, 1,
  223.              {ERRORFLAG}},
  224.             {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_mem, 1,
  225.              {ERRORMSG}}
  226.         };
  227.         /*
  228.          * Define the OID pointer to the top of the mib tree that we're
  229.          * registering underneath 
  230.          */
  231.         oid             mem_variables_oid[] = { UCDAVIS_MIB, MEMMIBNUM };
  232.         /*
  233.          * register ourselves with the agent to handle our mib tree 
  234.          */
  235.         REGISTER_MIB("ucd-snmp/memory", extensible_mem_variables,
  236.                      variable2, mem_variables_oid);
  237.         snmpd_register_config_handler("swap", memory_parse_config,
  238.                                       memory_free_config, "min-avail");
  239.     }
  240. }
  241. void
  242. memory_parse_config(const char *token, char *cptr)
  243. {
  244.     minimumswap = atoi(cptr);
  245. }
  246. void
  247. memory_free_config(void)
  248. {
  249.     minimumswap = DEFAULTMINIMUMSWAP;
  250. }
  251. #ifdef linux
  252. #define MEMINFO_FILE "/proc/meminfo"
  253. void
  254. getmem(unsigned long *memtotal, unsigned long *memfree, unsigned long *memshared, 
  255.        unsigned long *buffers, unsigned long *cached, unsigned long *swaptotal, 
  256.        unsigned long *swapfree)
  257. {
  258.     int         statfd;
  259.     static char *buff = NULL;
  260.     static int  bsize = 0;
  261.     int len;
  262.     if ((statfd = open(MEMINFO_FILE, O_RDONLY, 0)) != -1) {
  263.         char *b;
  264.         if (bsize == 0) {
  265.             bsize = 128;
  266.             buff = malloc(bsize);
  267.         }
  268.         while ((len = read(statfd, buff, bsize)) == bsize) {
  269.             bsize += 256;
  270.             buff = realloc(buff, bsize);
  271.             close(statfd);
  272.             statfd = open(MEMINFO_FILE, O_RDONLY, 0);
  273.         }
  274.         close(statfd);
  275. buff[len] = 0;
  276.         b = strstr(buff, "MemTotal: ");
  277.         if (b) 
  278.             sscanf(b, "MemTotal: %lu", memtotal);
  279.         else {
  280.             if(log_procerr)
  281.             snmp_log(LOG_ERR, "No MemTotal line in /proc/meminfon");
  282.             *memtotal = 0;
  283.         }
  284.         b = strstr(buff, "MemFree: ");
  285.         if (b) 
  286.             sscanf(b, "MemFree: %lu", memfree);
  287.         else {
  288.             if(log_procerr)
  289.             snmp_log(LOG_ERR, "No MemFree line in /proc/meminfon");
  290.             *memfree = 0;
  291.         }
  292.         b = strstr(buff, "MemShared: ");
  293.         if (b)
  294.             sscanf(b, "MemShared: %lu", memshared);
  295.         else {
  296.             if(log_procerr)
  297.             {
  298.             if (0 == netsnmp_os_prematch("Linux","2.4"))
  299.             snmp_log(LOG_ERR, "No MemShared line in /proc/meminfon");
  300.             }
  301.             *memshared = 0;
  302.         }
  303.         b = strstr(buff, "Buffers: ");
  304.         if (b)
  305.             sscanf(b, "Buffers: %lu", buffers);
  306.         else {
  307.             if(log_procerr)
  308.             snmp_log(LOG_ERR, "No Buffers line in /proc/meminfon");
  309.             *buffers = 0;
  310.         }
  311.         b = strstr(buff, "Cached: ");
  312.         if (b)
  313.             sscanf(b, "Cached: %lu", cached);
  314.         else {
  315.             if(log_procerr)
  316.             snmp_log(LOG_ERR, "No Cached line in /proc/meminfon");
  317.             *cached = 0;
  318.         }
  319.         b = strstr(buff, "SwapTotal: ");
  320.         if (b)
  321.             sscanf(b, "SwapTotal: %lu", swaptotal);
  322.         else {
  323.             if(log_procerr)
  324.             snmp_log(LOG_ERR, "No SwapTotal line in /proc/meminfon");
  325.             *swaptotal = 0;
  326.         }
  327.         b = strstr(buff, "SwapFree: ");
  328.         if (b)
  329.             sscanf(b, "SwapFree: %lu", swapfree);
  330.         else {
  331.             if(log_procerr)
  332.             snmp_log(LOG_ERR, "No SwapFree line in /proc/meminfon");
  333.             *swapfree = 0;
  334.         }
  335.     } else {
  336.         snmp_log_perror(MEMINFO_FILE);
  337.     }
  338. }
  339. enum memory_index { memtotal, memfree, memshared, buffers, cached, swaptotal, 
  340.     swapfree
  341. };
  342. unsigned
  343. memory(int iindex)
  344. {
  345.     unsigned long   mem_total[2], mem_free[2], mem_shared[2], mem_buffers[2], 
  346.                     mem_cached[2],  swap_total[2], swap_free[2];
  347.     getmem(mem_total, mem_free, mem_shared, mem_buffers, mem_cached, swap_total,
  348.            swap_free);
  349.     switch (iindex) {
  350.         case memtotal:
  351.             return *(mem_total);
  352.         case memfree:
  353.             return *(mem_free);
  354.         case memshared:
  355.             return *(mem_shared);
  356.         case buffers:
  357.             return *(mem_buffers);
  358.         case cached:
  359.             return *(mem_cached);
  360.         case swaptotal:
  361.             return *(swap_total);
  362.         case swapfree:
  363.             return *(swap_free);
  364.         default:
  365.             return -1;
  366.     }
  367. }
  368. #else
  369. #define pagetok(size) ((size) << pageshift)
  370. #endif
  371. #define SWAPGETLEFT 0
  372. #define SWAPGETTOTAL 1
  373. static long
  374. getswap(int rettype)
  375. {
  376.     long            spaceleft = 0, spacetotal = 0;
  377. #if defined(linux)
  378.     spaceleft = memory(swapfree);
  379.     spacetotal = memory(swaptotal);
  380. #elif defined(bsdi2)
  381.     struct swapstats swapst;
  382.     size_t          size = sizeof(swapst);
  383.     static int      mib[] = { CTL_VM, VM_SWAPSTATS };
  384.     if (sysctl(mib, 2, &swapst, &size, NULL, 0) < 0)
  385.         return (0);
  386.     spaceleft = swapst.swap_free / 2;
  387.     spacetotal = swapst.swap_total / 2;
  388. #elif defined (hpux10) || defined(hpux11)
  389.     struct pst_swapinfo pst_buf;
  390.     int ndx = 0;
  391.     long pgs, pgs_free;
  392.   
  393.     while (pstat_getswap(&pst_buf, sizeof(struct pst_swapinfo), 1, ndx) > 0) {
  394.         if (pst_buf.pss_flags & SW_BLOCK) {
  395.             pgs = pst_buf.pss_nblksenabled;
  396.             pgs_free = pst_buf.pss_nblksavail;
  397.         }
  398.         else if (pst_buf.pss_flags & SW_FS) {
  399.             pgs = pst_buf.pss_limit;
  400.             pgs_free = pgs - pst_buf.pss_allocated - pst_buf.pss_reserve;
  401.             /*
  402.              * the following calculation is done this way to avoid integer overflow!
  403.              * pss_swapchunk is either 512 or a multiple of 1024!
  404.              */
  405.             if (pst_buf.pss_swapchunk == 512) {
  406.                 pgs_free /= 2;
  407.                 pgs /= 2;
  408.             } else {
  409.                 pgs_free *= (pst_buf.pss_swapchunk / 1024);
  410.                 pgs *= (pst_buf.pss_swapchunk / 1024);
  411.             }
  412.         }
  413.         else {
  414.             pgs = pgs_free = 0;
  415.         }
  416.         spaceleft += pgs_free;
  417.         spacetotal += pgs;
  418.         ndx = pst_buf.pss_idx + 1;
  419.     }
  420. #else /* !linux && !bsdi2 && !hpux10 && !hpux11 */
  421.     struct swdevt   swdevt[100];
  422.     struct fswdevt  fswdevt[100];
  423.     FILE           *file;
  424.     struct extensible ex;
  425.     int             i, fd;
  426.     char           *cp;
  427.     if (auto_nlist
  428.         (SWDEVT_SYMBOL, (char *) swdevt, sizeof(struct swdevt) * nswapdev)
  429.         == 0)
  430.         return (0);
  431.     DEBUGMSGTL(("ucd-snmp/memory", "%d block swap devices: n", nswapdev));
  432.     for (i = 0; i < nswapdev; i++) {
  433.         DEBUGMSGTL(("ucd-snmp/memory", "swdevt[%d]: %dn", i,
  434.                     swdevt[i].sw_enable));
  435.         if (swdevt[i].sw_enable)
  436.         {
  437. #ifdef STRUCT_SWDEVT_HAS_SW_NBLKSENABLED
  438.             DEBUGMSGTL(("ucd-snmp/memory",
  439.                         "  swdevt.sw_nblksenabled:     %dn",
  440.                         swdevt[i].sw_nblksenabled));
  441.             spacetotal += swdevt[i].sw_nblksenabled;
  442. #else
  443.             DEBUGMSGTL(("ucd-snmp/memory", "  swdevt.sw_nblks:     %dn",
  444.                         swdevt[i].sw_nblks));
  445.             spacetotal += swdevt[i].sw_nblks;
  446. #endif
  447.             DEBUGMSGTL(("ucd-snmp/memory", "  swdevt.sw_nfpgs:     %dn",
  448.                         swdevt[i].sw_nfpgs));
  449.             spaceleft += (swdevt[i].sw_nfpgs * 4);
  450.         }
  451.     }
  452.     if (auto_nlist
  453.         (FSWDEVT_SYMBOL, (char *) fswdevt,
  454.          sizeof(struct fswdevt) * nswapfs)
  455.         == 0)
  456.         return (0);
  457.     DEBUGMSGTL(("ucd-snmp/memory", "%d fs swap devices: n", nswapfs));
  458.     for (i = 0; i < nswapfs; i++) {
  459.         DEBUGMSGTL(("ucd-snmp/memory", "fswdevt[%d]: %dn", i,
  460.                     fswdevt[i].fsw_enable));
  461.         if (fswdevt[i].fsw_enable)
  462.         {
  463.             spacetotal += (fswdevt[i].fsw_limit * 2048);        /* 2048=bytes per page? */
  464.             spaceleft += (fswdevt[i].fsw_limit * 2048 -
  465.                           ((fswdevt[i].fsw_allocated -
  466.                             fswdevt[i].fsw_min) * 37));
  467.             DEBUGMSGTL(("ucd-snmp/memory",
  468.                         "  fswdevt[i].fsw_limit:     %dn",
  469.                         fswdevt[i].fsw_limit));
  470.             DEBUGMSGTL(("ucd-snmp/memory",
  471.                         "  fswdevt[i].fsw_allocated: %dn",
  472.                         fswdevt[i].fsw_allocated));
  473.             DEBUGMSGTL(("ucd-snmp/memory",
  474.                         "  fswdevt[i].fsw_min:       %dn",
  475.                         fswdevt[i].fsw_min));
  476.             DEBUGMSGTL(("ucd-snmp/memory",
  477.                         "  fswdevt[i].fsw_reserve:   %dn",
  478.                         fswdevt[i].fsw_reserve));
  479.             /*
  480.              * 37 = calculated value I know it makes no sense, nor is it accurate 
  481.              */
  482.         }
  483.     }
  484.     /*
  485.      * this is a real hack.  I need to get the hold info from swapinfo, but
  486.      * I can't figure out how to read it out of the kernel directly
  487.      * -- Wes 
  488.      */
  489.     strcpy(ex.command, "/etc/swapinfo -h");
  490.     if ((fd = get_exec_output(&ex)) != -1) {
  491.         file = fdopen(fd, "r");
  492.         for (i = 1;
  493.              i <= 2 && fgets(ex.output, sizeof(ex.output), file) != NULL;
  494.              i++);
  495.         if (fgets(ex.output, sizeof(ex.output), file) != NULL) {
  496.             cp = skip_white(ex.output); /* not there should be any */
  497.             cp = skip_not_white(cp);    /* skip over "reserve" */
  498.             cp = skip_white(cp);
  499.             cp = skip_not_white(cp);    /* avail swap, a '-' in most cases */
  500.             cp = skip_white(cp);
  501.             spaceleft -= atoi(cp);      /* reserved swap */
  502.         }
  503.         fclose(file);
  504.         wait_on_exec(&ex);
  505.     } else {
  506.         return (0);
  507.     }
  508. #endif                          /* !linux && !bsdi2 && !hpux10 && !hpux11 */
  509.     switch (rettype) {
  510.     case SWAPGETLEFT:
  511.         return (spaceleft);
  512.     case SWAPGETTOTAL:
  513.         return (spacetotal);
  514.     }
  515.     return 0;
  516. }
  517. static
  518. unsigned char  *
  519. var_extensible_mem(struct variable *vp,
  520.                    oid * name,
  521.                    size_t * length,
  522.                    int exact,
  523.                    size_t * var_len, WriteMethod ** write_method)
  524. {
  525.     static long     long_ret;
  526.     static char     errmsg[1024];
  527. #if !defined(linux)
  528. #if defined(hpux10) || defined(hpux11)
  529.     struct pst_dynamic pst_buf;
  530. #elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM)
  531.     struct vmtotal total;
  532. #endif
  533. #endif
  534.     long_ret = 0;               /* set to 0 as default */
  535.     if (header_generic(vp, name, length, exact, var_len, write_method))
  536.         return (NULL);
  537. #if !defined(linux)
  538. #if defined(hpux10) || defined(hpux11)
  539.     if (pstat_getdynamic(&pst_buf, sizeof(struct pst_dynamic), 1, 0) < 0)
  540.         return NULL;
  541. #elif defined(USE_SYSCTL_VM)
  542.     /*
  543.      * sum memory statistics 
  544.      */
  545.     {
  546.         size_t          size = sizeof(total);
  547.         static int      mib[] = { CTL_VM, VM_TOTAL };
  548.         if (sysctl(mib, 2, &total, &size, NULL, 0) < 0)
  549.             return NULL;
  550.     }
  551. #elif defined(TOTAL_MEMORY_SYMBOL)
  552.     if (auto_nlist(TOTAL_MEMORY_SYMBOL, (char *) &total, sizeof(total)) ==
  553.         0)
  554.         return NULL;
  555. #endif
  556. #endif                          /* !linux */
  557.     switch (vp->magic) {
  558.     case MIBINDEX:
  559.         long_ret = 0;
  560.         return ((u_char *) (&long_ret));
  561.     case ERRORNAME:            /* dummy name */
  562.         sprintf(errmsg, "swap");
  563.         *var_len = strlen(errmsg);
  564.         return ((u_char *) (errmsg));
  565.     case MEMTOTALSWAP:
  566.         long_ret = getswap(SWAPGETTOTAL);
  567.         return ((u_char *) (&long_ret));
  568.     case MEMAVAILSWAP:
  569.         long_ret = getswap(SWAPGETLEFT);
  570.         return ((u_char *) (&long_ret));
  571.     case MEMSWAPMINIMUM:
  572.         long_ret = minimumswap;
  573.         return ((u_char *) (&long_ret));
  574.     case MEMTOTALREAL:
  575. #if defined(USE_SYSCTL)
  576.         {
  577.             size_t          size = sizeof(long_ret);
  578.             static int      mib[] = { CTL_HW, HW_PHYSMEM };
  579.             if (sysctl(mib, 2, &long_ret, &size, NULL, 0) < 0)
  580.                 return NULL;
  581.             long_ret = long_ret / 1024;
  582.         }
  583. #elif defined(hpux10) || defined(hpux11)
  584.         {
  585.             struct pst_static pst_buf;
  586.             if (pstat_getstatic(&pst_buf, sizeof(struct pst_static), 1, 0)
  587.                 < 0)
  588.                 return NULL;
  589.             long_ret =
  590.                 pst_buf.physical_memory * (pst_buf.page_size / 1024);
  591.         }
  592. #elif defined(linux)
  593.         long_ret = memory(memtotal);
  594. #elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
  595.         long_ret =
  596.             sysconf(_SC_PHYS_PAGES) * (sysconf(_SC_PAGESIZE) / 1024);
  597. #elif defined(PHYSMEM_SYMBOL)
  598.         {
  599.             int             result;
  600.             if (auto_nlist
  601.                 (PHYSMEM_SYMBOL, (char *) &result, sizeof(result)) == 0)
  602.                 return NULL;
  603.             long_ret = result * 1000;   /* ??? */
  604.         }
  605. #else
  606.         return NULL;            /* no dummy values */
  607. #endif
  608.         return ((u_char *) (&long_ret));
  609.     case MEMAVAILREAL:
  610. #ifdef linux
  611.         long_ret = memory(memfree);
  612. #elif defined(hpux10) || defined(hpux11)
  613.         long_ret = pagetok((int) pst_buf.psd_arm);
  614. #elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM)
  615.         long_ret = pagetok((int) total.t_arm);
  616. #else
  617.         return NULL;            /* no dummy values */
  618. #endif
  619.         return ((u_char *) (&long_ret));
  620. #ifndef linux
  621.     case MEMTOTALSWAPTXT:
  622. #if defined(hpux10) || defined(hpux11)
  623.         long_ret = pagetok((int) pst_buf.psd_vmtxt);
  624. #elif !defined(bsdi2)
  625.         long_ret = pagetok(total.t_vmtxt);
  626. #else
  627.         return NULL;            /* no dummy values */
  628. #endif
  629.         return ((u_char *) (&long_ret));
  630.     case MEMUSEDSWAPTXT:
  631. #if defined(hpux10) || defined(hpux11)
  632.         long_ret = pagetok((int) pst_buf.psd_avmtxt);
  633. #elif !defined(bsdi2)
  634.         long_ret = pagetok(total.t_avmtxt);
  635. #else
  636.         return NULL;            /* no dummy values */
  637. #endif
  638.         return ((u_char *) (&long_ret));
  639.     case MEMTOTALREALTXT:
  640. #if defined(hpux10) || defined(hpux11)
  641.         long_ret = pagetok((int) pst_buf.psd_rmtxt);
  642. #elif !defined(bsdi2)
  643.         long_ret = pagetok(total.t_rmtxt);
  644. #else
  645.         return NULL;            /* no dummy values */
  646. #endif
  647.         return ((u_char *) (&long_ret));
  648.     case MEMUSEDREALTXT:
  649. #if defined(hpux10) || defined(hpux11)
  650.         long_ret = pagetok((int) pst_buf.psd_armtxt);
  651. #elif !defined(bsdi2)
  652.         long_ret = pagetok(total.t_armtxt);
  653. #else
  654.         return NULL;            /* no dummy values */
  655. #endif
  656.         return ((u_char *) (&long_ret));
  657. #endif                          /* linux */
  658.     case MEMTOTALFREE:
  659. #ifdef linux
  660.         long_ret = memory(memfree) + memory(swapfree);
  661. #elif defined(hpux10) || defined(hpux11)
  662.         long_ret = pagetok((int) pst_buf.psd_free);
  663. #else
  664.         long_ret = pagetok(total.t_free);
  665. #endif
  666.         return ((u_char *) (&long_ret));
  667.     case MEMCACHED:
  668. #ifdef linux
  669.         long_ret = memory(cached);
  670. #else
  671.         return NULL;            /* no dummy values */
  672. #endif
  673.         return ((u_char *) (&long_ret));
  674.     case MEMBUFFER:
  675. #ifdef linux
  676.         long_ret = memory(buffers);
  677. #else
  678.         return NULL;            /* no dummy values */
  679. #endif
  680.         return ((u_char *) (&long_ret));
  681.     case MEMSHARED:
  682. #ifdef linux
  683.         long_ret = memory(memshared);
  684. #else
  685.         return NULL;            /* no dummy values */
  686. #endif
  687.         return ((u_char *) (&long_ret));
  688.     case ERRORFLAG:
  689.         long_ret = getswap(SWAPGETLEFT);
  690.         long_ret = (long_ret > minimumswap) ? 0 : 1;
  691.         return ((u_char *) (&long_ret));
  692.     case ERRORMSG:
  693.         long_ret = getswap(SWAPGETLEFT);
  694.         if ((long_ret > minimumswap) ? 0 : 1)
  695.             sprintf(errmsg, "Running out of swap space (%ld)",
  696.                     getswap(SWAPGETLEFT));
  697.         else
  698.             errmsg[0] = 0;
  699.         *var_len = strlen(errmsg);
  700.         return ((u_char *) (errmsg));
  701.     }
  702.     return NULL;
  703. }