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

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  *  Host Resources MIB - storage group implementation - hr_storage.c
  3.  *
  4.  */
  5. #include <net-snmp/net-snmp-config.h>
  6. #if defined(freebsd5)
  7. /* undefine these in order to use getfsstat */
  8. #undef HAVE_STATVFS
  9. #undef STRUCT_STATVFS_HAS_F_FRSIZE
  10. #endif
  11. #include <sys/types.h>
  12. #include <sys/param.h>
  13. #if HAVE_UNISTD_H
  14. #include <unistd.h>
  15. #endif
  16. #if TIME_WITH_SYS_TIME
  17. # ifdef WIN32
  18. #  include <sys/timeb.h>
  19. # else
  20. #  include <sys/time.h>
  21. # endif
  22. # include <time.h>
  23. #else
  24. # if HAVE_SYS_TIME_H
  25. #  include <sys/time.h>
  26. # else
  27. #  include <time.h>
  28. # endif
  29. #endif
  30. #ifndef mingw32
  31. #if HAVE_UTMPX_H
  32. #include <utmpx.h>
  33. #else
  34. #include <utmp.h>
  35. #endif
  36. #endif /* mingw32 */
  37. #ifndef dynix
  38. #if HAVE_SYS_VM_H
  39. #include <sys/vm.h>
  40. #if (!defined(KERNEL) || defined(MACH_USER_API)) && defined(HAVE_SYS_VMMETER_H) /*OS X does not #include <sys/vmmeter.h> if (defined(KERNEL) && !defined(MACH_USER_API)) */
  41. #include <sys/vmmeter.h>
  42. #endif
  43. #else
  44. #if HAVE_VM_VM_H
  45. #include <vm/vm.h>
  46. #if HAVE_MACHINE_TYPES_H
  47. #include <machine/types.h>
  48. #endif
  49. #if HAVE_SYS_VMMETER_H
  50. #include <sys/vmmeter.h>
  51. #endif
  52. #if HAVE_VM_VM_PARAM_H
  53. #include <vm/vm_param.h>
  54. #endif
  55. #else
  56. #if HAVE_SYS_VMPARAM_H
  57. #include <sys/vmparam.h>
  58. #endif
  59. #if HAVE_SYS_VMMAC_H
  60. #include <sys/vmmac.h>
  61. #endif
  62. #if HAVE_SYS_VMMETER_H
  63. #include <sys/vmmeter.h>
  64. #endif
  65. #if HAVE_SYS_VMSYSTM_H
  66. #include <sys/vmsystm.h>
  67. #endif
  68. #endif                          /* vm/vm.h */
  69. #endif                          /* sys/vm.h */
  70. #if defined(HAVE_UVM_UVM_PARAM_H) && defined(HAVE_UVM_UVM_EXTERN_H)
  71. #include <uvm/uvm_param.h>
  72. #include <uvm/uvm_extern.h>
  73. #elif defined(HAVE_VM_VM_PARAM_H) && defined(HAVE_VM_VM_EXTERN_H)
  74. #include <vm/vm_param.h>
  75. #include <vm/vm_extern.h>
  76. #endif
  77. #if HAVE_KVM_H
  78. #include <kvm.h>
  79. #endif
  80. #if HAVE_FCNTL_H
  81. #include <fcntl.h>
  82. #endif
  83. #if HAVE_SYS_POOL_H
  84. #if defined(MBPOOL_SYMBOL) && defined(MCLPOOL_SYMBOL)
  85. #define __POOL_EXPOSE
  86. #include <sys/pool.h>
  87. #else
  88. #undef HAVE_SYS_POOL_H
  89. #endif
  90. #endif
  91. #if HAVE_SYS_MBUF_H
  92. #include <sys/mbuf.h>
  93. #endif
  94. #if HAVE_SYS_SYSCTL_H
  95. #include <sys/sysctl.h>
  96. #if defined(CTL_HW) && defined(HW_PAGESIZE)
  97. #define USE_SYSCTL
  98. #endif
  99. #if defined(CTL_VM) && (defined(VM_METER) || defined(VM_UVMEXP))
  100. #define USE_SYSCTL_VM
  101. #endif
  102. #endif
  103. #endif                          /* ifndef dynix */
  104. #include "host_res.h"
  105. #include "hr_storage.h"
  106. #include "hr_filesys.h"
  107. #include <net-snmp/agent/auto_nlist.h>
  108. #if HAVE_MNTENT_H
  109. #include <mntent.h>
  110. #endif
  111. #if HAVE_SYS_MNTTAB_H
  112. #include <sys/mnttab.h>
  113. #endif
  114. #if HAVE_SYS_STATVFS_H
  115. #include <sys/statvfs.h>
  116. #endif
  117. #if HAVE_SYS_VFS_H
  118. #include <sys/vfs.h>
  119. #endif
  120. #if HAVE_SYS_MOUNT_H
  121. #ifdef __osf__
  122. #undef m_next
  123. #undef m_data
  124. #endif
  125. #include <sys/mount.h>
  126. #endif
  127. #ifdef HAVE_MACHINE_PARAM_H
  128. #include <machine/param.h>
  129. #endif
  130. #include <sys/stat.h>
  131. #if defined(hpux10) || defined(hpux11)
  132. #include <sys/pstat.h>
  133. #endif
  134. #if defined(solaris2)
  135. #if HAVE_SYS_SWAP_H
  136. #include <sys/swap.h>
  137. #endif
  138. #endif
  139. #if HAVE_STRING_H
  140. #include <string.h>
  141. #else
  142. #include <strings.h>
  143. #endif
  144. #include <net-snmp/utilities.h>
  145. #include <net-snmp/output_api.h>
  146. #if solaris2
  147. #include "kernel_sunos5.h"
  148. #endif
  149. #include <net-snmp/agent/agent_read_config.h>
  150. #include <net-snmp/library/read_config.h>
  151. #define HRSTORE_MONOTONICALLY_INCREASING
  152.         /*********************
  153.  *
  154.  *  Kernel & interface information,
  155.  *   and internal forward declarations
  156.  *
  157.  *********************/
  158. #ifdef solaris2
  159. extern struct mnttab *HRFS_entry;
  160. #define HRFS_mount mnt_mountp
  161. #define HRFS_statfs statvfs
  162. #define HRFS_HAS_FRSIZE STRUCT_STATVFS_HAS_F_FRSIZE
  163. #elif defined(HAVE_STATVFS) && defined(__NetBSD__)
  164. extern struct statvfs *HRFS_entry;
  165. extern int      fscount;
  166. #define HRFS_statfs statvfs
  167. #define HRFS_mount f_mntonname
  168. #define HRFS_HAS_FRSIZE STRUCT_STATVFS_HAS_F_FRSIZE
  169. #elif defined(HAVE_STATVFS) && defined(STRUCT_STATVFS_HAS_MNT_DIR)
  170. extern struct mntent *HRFS_entry;
  171. extern int      fscount;
  172. #define HRFS_statfs statvfs
  173. #define HRFS_mount mnt_dir
  174. #define HRFS_HAS_FRSIZE STRUCT_STATVFS_HAS_F_FRSIZE
  175. #elif defined(HAVE_GETFSSTAT)
  176. extern struct statfs *HRFS_entry;
  177. extern int      fscount;
  178. #define HRFS_statfs statfs
  179. #define HRFS_mount f_mntonname
  180. #define HRFS_HAS_FRSIZE STRUCT_STATFS_HAS_F_FRSIZE
  181. #else
  182. extern struct mntent *HRFS_entry;
  183. #define HRFS_mount mnt_dir
  184. #define HRFS_statfs statfs
  185. #define HRFS_HAS_FRSIZE STRUCT_STATFS_HAS_F_FRSIZE
  186. #endif
  187. static int      physmem, pagesize;
  188. static void parse_storage_config(const char *, char *);
  189.         /*********************
  190.  *
  191.  *  Initialisation & common implementation functions
  192.  *
  193.  *********************/
  194. int             Get_Next_HR_Store(void);
  195. void            Init_HR_Store(void);
  196. int             header_hrstore(struct variable *, oid *, size_t *, int,
  197.                                size_t *, WriteMethod **);
  198. int             header_hrstoreEntry(struct variable *, oid *, size_t *,
  199.                                     int, size_t *, WriteMethod **);
  200. #ifdef linux
  201. int             linux_mem(int, int);
  202. #endif
  203. #ifdef solaris2
  204. void            sol_get_swapinfo(int *, int *);
  205. #endif
  206. #define HRSTORE_MEMSIZE 1
  207. #define HRSTORE_INDEX 2
  208. #define HRSTORE_TYPE 3
  209. #define HRSTORE_DESCR 4
  210. #define HRSTORE_UNITS 5
  211. #define HRSTORE_SIZE 6
  212. #define HRSTORE_USED 7
  213. #define HRSTORE_FAILS 8
  214. struct variable4 hrstore_variables[] = {
  215.     {HRSTORE_MEMSIZE, ASN_INTEGER, RONLY, var_hrstore, 1, {2}},
  216.     {HRSTORE_INDEX, ASN_INTEGER, RONLY, var_hrstore, 3, {3, 1, 1}},
  217.     {HRSTORE_TYPE, ASN_OBJECT_ID, RONLY, var_hrstore, 3, {3, 1, 2}},
  218.     {HRSTORE_DESCR, ASN_OCTET_STR, RONLY, var_hrstore, 3, {3, 1, 3}},
  219.     {HRSTORE_UNITS, ASN_INTEGER, RONLY, var_hrstore, 3, {3, 1, 4}},
  220.     {HRSTORE_SIZE, ASN_INTEGER, RONLY, var_hrstore, 3, {3, 1, 5}},
  221.     {HRSTORE_USED, ASN_INTEGER, RONLY, var_hrstore, 3, {3, 1, 6}},
  222.     {HRSTORE_FAILS, ASN_COUNTER, RONLY, var_hrstore, 3, {3, 1, 7}}
  223. };
  224. oid             hrstore_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 2 };
  225. void
  226. init_hr_storage(void)
  227. {
  228. #ifdef USE_SYSCTL
  229.     int             mib[2];
  230.     size_t          len;
  231. #elif defined(hpux10) || defined(hpux11)
  232.     struct pst_static pst_buf;
  233. #endif
  234. #ifdef USE_SYSCTL
  235.     mib[0] = CTL_HW;
  236.     mib[1] = HW_PHYSMEM;
  237.     len = sizeof(physmem);
  238.     if (sysctl(mib, 2, &physmem, &len, NULL, 0) == -1)
  239.         snmp_log_perror("sysctl: physmem");
  240.     mib[1] = HW_PAGESIZE;
  241.     len = sizeof(pagesize);
  242.     if (sysctl(mib, 2, &pagesize, &len, NULL, 0) == -1)
  243.         snmp_log_perror("sysctl: pagesize");
  244.     physmem /= pagesize;
  245. #elif defined(hpux10) || defined(hpux11)
  246.     if (pstat_getstatic(&pst_buf, sizeof(struct pst_static), 1, 0) < 0) {
  247.         snmp_log_perror("pstat_getstatic");
  248.     } else {
  249.         physmem = pst_buf.physical_memory;
  250.         pagesize = pst_buf.page_size;
  251.     }
  252. #else                           /* !USE_SYSCTL && !hpux10 && !hpux11 */
  253. #ifdef HAVE_GETPAGESIZE
  254.     pagesize = getpagesize();
  255. #elif defined(_SC_PAGESIZE)
  256.     pagesize = sysconf(_SC_PAGESIZE);
  257. #elif defined(PGSHIFT)
  258.     pagesize = 1 << PGSHIFT;
  259. #elif defined(PAGE_SHIFT)
  260.     pagesize = 1 << PAGE_SHIFT;
  261. #elif defined(PAGE_SIZE)
  262.     pagesize = PAGE_SIZE;
  263. #elif defined(linux)
  264.     {
  265.         struct stat     kc_buf;
  266.         if (stat("/proc/kcore", &kc_buf) == -1)
  267.     snmp_log_perror("/proc/kcore");
  268.         pagesize = kc_buf.st_size / 1024;       /* 4K too large ? */
  269.     }
  270. #else
  271.     pagesize = PAGESIZE;
  272. #endif
  273. #ifdef _SC_PHYS_PAGES
  274.     physmem = sysconf(_SC_PHYS_PAGES);
  275. #else
  276. #ifdef dynix
  277.     physmem = sysconf(_SC_PHYSMEM);
  278. #else
  279.     auto_nlist(PHYSMEM_SYMBOL, (char *) &physmem, sizeof(physmem));
  280. #endif
  281. #endif
  282. #endif                          /* !USE_SYSCTL && !hpux10 && !hpux11 */
  283. #ifdef TOTAL_MEMORY_SYMBOL
  284.     auto_nlist(TOTAL_MEMORY_SYMBOL, 0, 0);
  285. #endif
  286. #ifdef MBSTAT_SYMBOL
  287.     auto_nlist(MBSTAT_SYMBOL, 0, 0);
  288. #endif
  289.     REGISTER_MIB("host/hr_storage", hrstore_variables, variable4,
  290.                  hrstore_variables_oid);
  291.     snmpd_register_config_handler("storageUseNFS", parse_storage_config, NULL,
  292. "1 | 2tt(1 = enable, 2 = disable)");
  293. }
  294. static int storageUseNFS = 0; /* initially disabled */
  295. static void
  296. parse_storage_config(const char *token, char *cptr)
  297. {
  298.     char *val;
  299.     int ival;
  300.     char *st;
  301.     val = strtok_r(cptr, " t", &st);
  302.     if (!val) {
  303.         config_perror("Missing FLAG parameter in storageUseNFS");
  304.         return;
  305.     }
  306.     ival = atoi(val);
  307.     if (ival < 1 || ival > 2) {
  308.         config_perror("storageUseNFS must be 1 or 2");
  309.         return;
  310.     }
  311.     storageUseNFS = (ival == 1) ? 1 : 0;
  312. }
  313. /*
  314.  * header_hrstore(...
  315.  * Arguments:
  316.  * vp     IN      - pointer to variable entry that points here
  317.  * name    IN/OUT  - IN/name requested, OUT/name found
  318.  * length  IN/OUT  - length of IN/OUT oid's 
  319.  * exact   IN      - TRUE if an exact match was requested
  320.  * var_len OUT     - length of variable or 0 if function returned
  321.  * write_method
  322.  * 
  323.  */
  324. int
  325. header_hrstore(struct variable *vp,
  326.                oid * name,
  327.                size_t * length,
  328.                int exact, size_t * var_len, WriteMethod ** write_method)
  329. {
  330. #define HRSTORE_NAME_LENGTH 9
  331.     oid             newname[MAX_OID_LEN];
  332.     int             result;
  333.     DEBUGMSGTL(("host/hr_storage", "var_hrstore: "));
  334.     DEBUGMSGOID(("host/hr_storage", name, *length));
  335.     DEBUGMSG(("host/hr_storage", " %dn", exact));
  336.     memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
  337.     newname[HRSTORE_NAME_LENGTH] = 0;
  338.     result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
  339.     if ((exact && (result != 0)) || (!exact && (result >= 0)))
  340.         return (MATCH_FAILED);
  341.     memcpy((char *) name, (char *) newname,
  342.            (vp->namelen + 1) * sizeof(oid));
  343.     *length = vp->namelen + 1;
  344.     *write_method = 0;
  345.     *var_len = sizeof(long);    /* default to 'long' results */
  346.     return (MATCH_SUCCEEDED);
  347. }
  348. int
  349. header_hrstoreEntry(struct variable *vp,
  350.                     oid * name,
  351.                     size_t * length,
  352.                     int exact,
  353.                     size_t * var_len, WriteMethod ** write_method)
  354. {
  355. #define HRSTORE_ENTRY_NAME_LENGTH 11
  356.     oid             newname[MAX_OID_LEN];
  357.     int             storage_idx, LowIndex = -1;
  358.     int             result;
  359.     DEBUGMSGTL(("host/hr_storage", "var_hrstoreEntry: "));
  360.     DEBUGMSGOID(("host/hr_storage", name, *length));
  361.     DEBUGMSG(("host/hr_storage", " %dn", exact));
  362.     memcpy((char *) newname, (char *) vp->name,
  363.            (int) vp->namelen * sizeof(oid));
  364.     /*
  365.      * Find "next" storage entry 
  366.      */
  367.     Init_HR_Store();
  368.     for (;;) {
  369.         storage_idx = Get_Next_HR_Store();
  370.         DEBUGMSG(("host/hr_storage", "(index %d ....", storage_idx));
  371.         if (storage_idx == -1)
  372.             break;
  373.         newname[HRSTORE_ENTRY_NAME_LENGTH] = storage_idx;
  374.         DEBUGMSGOID(("host/hr_storage", newname, *length));
  375.         DEBUGMSG(("host/hr_storage", "n"));
  376.         result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
  377.         if (exact && (result == 0)) {
  378.             LowIndex = storage_idx;
  379.             /*
  380.              * Save storage status information 
  381.              */
  382.             break;
  383.         }
  384.         if ((!exact && (result < 0)) &&
  385.             (LowIndex == -1 || storage_idx < LowIndex)) {
  386.             LowIndex = storage_idx;
  387.             /*
  388.              * Save storage status information 
  389.              */
  390. #ifdef HRSTORE_MONOTONICALLY_INCREASING
  391.             break;
  392. #endif
  393.         }
  394.     }
  395.     if (LowIndex == -1) {
  396.         DEBUGMSGTL(("host/hr_storage", "... index out of rangen"));
  397.         return (MATCH_FAILED);
  398.     }
  399.     memcpy((char *) name, (char *) newname,
  400.            ((int) vp->namelen + 1) * sizeof(oid));
  401.     *length = vp->namelen + 1;
  402.     *write_method = 0;
  403.     *var_len = sizeof(long);    /* default to 'long' results */
  404.     DEBUGMSGTL(("host/hr_storage", "... get storage stats "));
  405.     DEBUGMSGOID(("host/hr_storage", name, *length));
  406.     DEBUGMSG(("host/hr_storage", "n"));
  407.     return LowIndex;
  408. }
  409. oid             storage_type_id[] = { 1, 3, 6, 1, 2, 1, 25, 2, 1, 1 };  /* hrStorageOther */
  410. int             storage_type_len =
  411.     sizeof(storage_type_id) / sizeof(storage_type_id[0]);
  412.         /*********************
  413.  *
  414.  *  System specific implementation functions
  415.  *
  416.  *********************/
  417. static const char *hrs_descr[] = {
  418.     NULL,
  419.     "Memory Buffers",           /* HRS_TYPE_MBUF */
  420.     "Real Memory",              /* HRS_TYPE_MEM */
  421.     "Swap Space"                /* HRS_TYPE_SWAP */
  422. };
  423. u_char         *
  424. var_hrstore(struct variable *vp,
  425.             oid * name,
  426.             size_t * length,
  427.             int exact, size_t * var_len, WriteMethod ** write_method)
  428. {
  429.     int             store_idx = 0;
  430. #if !defined(linux)
  431. #if defined(solaris2)
  432.     int             freemem;
  433.     int             swap_total, swap_used;
  434. #elif defined(hpux10) || defined(hpux11)
  435.     struct pst_dynamic pst_buf;
  436. #elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM)
  437. #ifdef VM_UVMEXP
  438.     struct uvmexp   uvmexp_totals;
  439. #endif
  440.     struct vmtotal  memory_totals;
  441. #endif
  442. #if HAVE_KVM_GETSWAPINFO
  443.     struct kvm_swap swapinfo;
  444.     static kvm_t *kd = NULL;
  445. #endif
  446. #if HAVE_SYS_POOL_H
  447.     struct pool     mbpool, mclpool;
  448.     int             i;
  449. #endif
  450. #ifdef MBSTAT_SYMBOL
  451.     struct mbstat   mbstat;
  452. #endif
  453. #endif                          /* !linux */
  454.     static char     string[1024];
  455.     struct HRFS_statfs stat_buf;
  456.     if (vp->magic == HRSTORE_MEMSIZE) {
  457.         if (header_hrstore(vp, name, length, exact, var_len, write_method)
  458.             == MATCH_FAILED)
  459.             return NULL;
  460.     } else {
  461. really_try_next:
  462. store_idx = header_hrstoreEntry(vp, name, length, exact, var_len,
  463. write_method);
  464. if (store_idx == MATCH_FAILED)
  465.     return NULL;
  466. if (store_idx > HRS_TYPE_FIXED_MAX) {
  467.     if (HRFS_statfs(HRFS_entry->HRFS_mount, &stat_buf) < 0) {
  468. snmp_log_perror(HRFS_entry->HRFS_mount);
  469. goto try_next;
  470.     }
  471. }
  472. #if !defined(linux) && !defined(solaris2)
  473.         else
  474.             switch (store_idx) {
  475.             case HRS_TYPE_MEM:
  476.             case HRS_TYPE_SWAP:
  477. #ifdef USE_SYSCTL_VM
  478.                 {
  479.                     int             mib[2];
  480.                     size_t          len = sizeof(memory_totals);
  481.                     mib[0] = CTL_VM;
  482.                     mib[1] = VM_METER;
  483.                     sysctl(mib, 2, &memory_totals, &len, NULL, 0);
  484. #ifdef VM_UVMEXP
  485.                     mib[1] = VM_UVMEXP;
  486.     len = sizeof(uvmexp_totals);
  487.                     sysctl(mib, 2, &uvmexp_totals, &len, NULL, 0);
  488. #endif
  489.                 }
  490. #elif defined(hpux10) || defined(hpux11)
  491.                 pstat_getdynamic(&pst_buf, sizeof(struct pst_dynamic), 1, 0);
  492. #elif defined(TOTAL_MEMORY_SYMBOL)
  493.                 auto_nlist(TOTAL_MEMORY_SYMBOL, (char *) &memory_totals,
  494.                            sizeof(struct vmtotal));
  495. #endif
  496. #if HAVE_KVM_GETSWAPINFO
  497. if (kd == NULL)
  498.     kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL);
  499. if (!kd) {
  500.     snmp_log_perror("kvm_openfiles");
  501.     goto try_next;
  502. }
  503. if (kvm_getswapinfo(kd, &swapinfo, 1, 0) < 0) {
  504.     snmp_log_perror("kvm_getswapinfo");
  505.     goto try_next;
  506. }
  507. #endif
  508.                 break;
  509. #if !defined(hpux10) && !defined(hpux11)
  510.             case HRS_TYPE_MBUF:
  511. #if HAVE_SYS_POOL_H
  512.                 auto_nlist(MBPOOL_SYMBOL, (char *) &mbpool,
  513.                            sizeof(mbpool));
  514.                 auto_nlist(MCLPOOL_SYMBOL, (char *) &mclpool,
  515.                            sizeof(mclpool));
  516. #endif
  517. #ifdef MBSTAT_SYMBOL
  518.                 auto_nlist(MBSTAT_SYMBOL, (char *) &mbstat,
  519.                            sizeof(mbstat));
  520. #endif
  521.                 break;
  522. #endif      /* !hpux10 && !hpux11 */
  523.             default:
  524.                 break;
  525.             }
  526. #endif                          /* !linux && !solaris2 */
  527.     }
  528.     switch (vp->magic) {
  529.     case HRSTORE_MEMSIZE:
  530.         long_return = physmem * (pagesize / 1024);
  531.         return (u_char *) & long_return;
  532.     case HRSTORE_INDEX:
  533.         long_return = store_idx;
  534.         return (u_char *) & long_return;
  535.     case HRSTORE_TYPE:
  536.         if (store_idx > HRS_TYPE_FIXED_MAX)
  537.             if (storageUseNFS && Check_HR_FileSys_NFS())
  538.                 storage_type_id[storage_type_len - 1] = 10;     /* Network Disk */
  539.             else
  540.                 storage_type_id[storage_type_len - 1] = 4;      /* Assume fixed */
  541.         else
  542.             switch (store_idx) {
  543.             case HRS_TYPE_MEM:
  544.                 storage_type_id[storage_type_len - 1] = 2;      /* RAM */
  545.                 break;
  546.             case HRS_TYPE_SWAP:
  547.                 storage_type_id[storage_type_len - 1] = 3;      /* Virtual Mem */
  548.                 break;
  549.             case HRS_TYPE_MBUF:
  550.                 storage_type_id[storage_type_len - 1] = 1;      /* Other */
  551.                 break;
  552.             default:
  553.                 storage_type_id[storage_type_len - 1] = 1;      /* Other */
  554.                 break;
  555.             }
  556.         *var_len = sizeof(storage_type_id);
  557.         return (u_char *) storage_type_id;
  558.     case HRSTORE_DESCR:
  559.         if (store_idx > HRS_TYPE_FIXED_MAX) {
  560.             strncpy(string, HRFS_entry->HRFS_mount, sizeof(string)-1);
  561.             string[ sizeof(string)-1 ] = 0;
  562.             *var_len = strlen(string);
  563.             return (u_char *) string;
  564.         } else {
  565.             /* store_idx = store_idx - 1; */
  566.             *var_len = strlen(hrs_descr[store_idx]);
  567.             return (u_char *) hrs_descr[store_idx];
  568.         }
  569.     case HRSTORE_UNITS:
  570.         if (store_idx > HRS_TYPE_FIXED_MAX)
  571. #if HRFS_HAS_FRSIZE
  572.             long_return = stat_buf.f_frsize;
  573. #else
  574.             long_return = stat_buf.f_bsize;
  575. #endif
  576.         else
  577.             switch (store_idx) {
  578.             case HRS_TYPE_MEM:
  579.             case HRS_TYPE_SWAP:
  580. #if defined(USE_SYSCTL) || defined(solaris2)
  581.                 long_return = pagesize;
  582. #elif defined(NBPG)
  583.                 long_return = NBPG;
  584. #else
  585.                 long_return = 1024;     /* Report in Kb */
  586. #endif
  587.                 break;
  588.             case HRS_TYPE_MBUF:
  589. #ifdef MSIZE
  590.                 long_return = MSIZE;
  591. #elif defined(linux)
  592.                 long_return = 1024;
  593. #else
  594.                 long_return = 256;
  595. #endif
  596.                 break;
  597.             default:
  598. #if NO_DUMMY_VALUES
  599.                 goto try_next;
  600. #endif
  601.                 long_return = 1024;     /* As likely as any! */
  602.                 break;
  603.             }
  604.         return (u_char *) & long_return;
  605.     case HRSTORE_SIZE:
  606.         if (store_idx > HRS_TYPE_FIXED_MAX)
  607.             long_return = stat_buf.f_blocks;
  608.         else
  609.             switch (store_idx) {
  610. #if defined(linux)
  611.             case HRS_TYPE_MEM:
  612.             case HRS_TYPE_SWAP:
  613.                 long_return = linux_mem(store_idx, HRSTORE_SIZE);
  614.                 break;
  615. #elif defined(solaris2)
  616.             case HRS_TYPE_MEM:
  617.                 long_return = physmem;
  618.                 break;
  619.             case HRS_TYPE_SWAP:
  620.                 sol_get_swapinfo(&swap_total, &swap_used);
  621.                 long_return = swap_total;
  622.                 break;
  623. #elif defined(hpux10) || defined(hpux11)
  624.             case HRS_TYPE_MEM:
  625.                 long_return = pst_buf.psd_rm;
  626.                 break;
  627.             case HRS_TYPE_SWAP:
  628.                 long_return = pst_buf.psd_vm;
  629.                 break;
  630. #elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM)
  631.             case HRS_TYPE_MEM:
  632.                 long_return = memory_totals.t_rm;
  633.                 break;
  634.             case HRS_TYPE_SWAP:
  635. #if HAVE_KVM_GETSWAPINFO
  636. long_return = swapinfo.ksw_total;
  637. #elif defined(VM_UVMEXP)
  638.                 long_return = uvmexp_totals.swpages;
  639. #else
  640.                 long_return = memory_totals.t_vm;
  641. #endif
  642.                 break;
  643. #else               /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */
  644.             case HRS_TYPE_MEM:
  645.                 long_return = physmem;
  646.                 break;
  647.             case HRS_TYPE_SWAP:
  648. #if NO_DUMMY_VALUES
  649.                 goto try_next;
  650. #endif
  651.                 long_return = 0;
  652.                 break;
  653. #endif              /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */
  654.             case HRS_TYPE_MBUF:
  655. #ifdef linux
  656.                 long_return = linux_mem(store_idx, HRSTORE_SIZE);
  657. #elif HAVE_SYS_POOL_H
  658.                 long_return = 0;
  659.                 for (i = 0;
  660.                      i <
  661.                      sizeof(mbstat.m_mtypes) / sizeof(mbstat.m_mtypes[0]);
  662.                      i++)
  663.                     long_return += mbstat.m_mtypes[i];
  664. #elif defined(MBSTAT_SYMBOL) && defined(STRUCT_MBSTAT_HAS_M_MBUFS)
  665.                 long_return = mbstat.m_mbufs;
  666. #elif defined(NO_DUMMY_VALUES)
  667.                 goto try_next;
  668. #else
  669.                 long_return = 0;
  670. #endif
  671.                 break;
  672.             default:
  673. #if NO_DUMMY_VALUES
  674.                 goto try_next;
  675. #endif
  676.                 long_return = 1024;
  677.                 break;
  678.             }
  679.         return (u_char *) & long_return;
  680.     case HRSTORE_USED:
  681.         if (store_idx > HRS_TYPE_FIXED_MAX)
  682.             long_return = (stat_buf.f_blocks - stat_buf.f_bfree);
  683.         else
  684.             switch (store_idx) {
  685. #if defined(linux)
  686.             case HRS_TYPE_MBUF:
  687.             case HRS_TYPE_MEM:
  688.             case HRS_TYPE_SWAP:
  689.                 long_return = linux_mem(store_idx, HRSTORE_USED);
  690.                 break;
  691. #elif defined(solaris2)
  692.             case HRS_TYPE_MEM:
  693.                 getKstatInt("unix", "system_pages", "freemem", &freemem);
  694.                 long_return = physmem - freemem;
  695.                 break;
  696.             case HRS_TYPE_SWAP:
  697.                 sol_get_swapinfo(&swap_total, &swap_used);
  698.                 long_return = swap_used;
  699.                 break;
  700. #elif defined(hpux10) || defined(hpux11)
  701.             case HRS_TYPE_MEM:
  702.                 long_return = pst_buf.psd_arm;
  703.                 break;
  704.             case HRS_TYPE_SWAP:
  705.                 long_return = pst_buf.psd_avm;
  706.                 break;
  707. #elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM)
  708.             case HRS_TYPE_MEM:
  709.                 long_return = memory_totals.t_arm;
  710.                 break;
  711.             case HRS_TYPE_SWAP:
  712. #if HAVE_KVM_GETSWAPINFO
  713. long_return = swapinfo.ksw_used;
  714. #elif defined(VM_UVMEXP)
  715. long_return = uvmexp_totals.swpginuse;
  716. #else
  717.                 long_return = memory_totals.t_avm;
  718. #endif
  719.                 break;
  720. #endif              /* linux || solaris2 || hpux10 || hpux11 || ... */
  721. #if !defined(linux) && !defined(solaris2) && !defined(hpux10) && !defined(hpux11)
  722.             case HRS_TYPE_MBUF:
  723. #if HAVE_SYS_POOL_H
  724.                 long_return =
  725.     (mbpool.pr_nget - mbpool.pr_nput) * mbpool.pr_size +
  726.     (mclpool.pr_nget - mclpool.pr_nput) * mclpool.pr_size;
  727. #ifdef MSIZE
  728. long_return /= MSIZE;
  729. #else
  730. long_return /= 256;
  731. #endif
  732. #elif defined(MBSTAT_SYMBOL) && defined(STRUCT_MBSTAT_HAS_M_CLUSTERS)
  733.                 long_return = mbstat.m_clusters - mbstat.m_clfree;      /* unlikely, but... */
  734. #elif defined(NO_DUMMY_VALUES)
  735.                 goto try_next;
  736. #else
  737.                 long_return = 0;
  738. #endif
  739.                 break;
  740. #endif                      /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */
  741.             default:
  742. #if NO_DUMMY_VALUES
  743.                 goto try_next;
  744. #endif
  745.                 long_return = 1024;
  746.                 break;
  747.             }
  748.         return (u_char *) & long_return;
  749.     case HRSTORE_FAILS:
  750.         if (store_idx > HRS_TYPE_FIXED_MAX)
  751. #if NO_DUMMY_VALUES
  752.     goto try_next;
  753. #else
  754.             long_return = 0;
  755. #endif
  756.         else
  757.             switch (store_idx) {
  758.             case HRS_TYPE_MEM:
  759.             case HRS_TYPE_SWAP:
  760. #if NO_DUMMY_VALUES
  761.                 goto try_next;
  762. #endif
  763.                 long_return = 0;
  764.                 break;
  765. #if !defined(linux) && !defined(solaris2) && !defined(hpux10) && !defined(hpux11)  && defined(MBSTAT_SYMBOL)
  766.             case HRS_TYPE_MBUF:
  767.                 long_return = mbstat.m_drops;
  768.                 break;
  769. #endif                          /* !linux && !solaris2 && !hpux10 && !hpux11 && MBSTAT_SYMBOL */
  770.             default:
  771. #if NO_DUMMY_VALUES
  772.                 goto try_next;
  773. #endif
  774.                 long_return = 0;
  775.                 break;
  776.             }
  777.         return (u_char *) & long_return;
  778.     default:
  779.         DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrstoren",
  780.                     vp->magic));
  781.     }
  782.     return NULL;
  783.   try_next:
  784.     if (!exact)
  785.         goto really_try_next;
  786.     return NULL;
  787. }
  788.         /*********************
  789.  *
  790.  *  Internal implementation functions
  791.  *
  792.  *********************/
  793. static int      FS_storage;
  794. static int      HRS_index;
  795. void
  796. Init_HR_Store(void)
  797. {
  798. #if !defined(solaris2) && !defined(hpux10) && !defined(hpux11)
  799.     HRS_index = 0;
  800. #else
  801.     HRS_index = HRS_TYPE_MBUF;
  802. #endif
  803.     Init_HR_FileSys();
  804.     FS_storage = 0;             /* Start with file-based storage */
  805. }
  806. int
  807. Get_Next_HR_Store(void)
  808. {
  809.     /*
  810.      * Fixed-style 'other' storage types
  811.      */
  812.     long_return = -1;
  813.     if (FS_storage == 0) {
  814.         ++HRS_index;
  815.         if (HRS_index <= HRS_TYPE_FIXED_MAX)
  816.             return HRS_index;
  817.         else {
  818.             FS_storage = 1;
  819.             HRS_index = 0;
  820.         }
  821.     }
  822.     /*
  823.      * File-based storage 
  824.      */
  825.     HRS_index = Get_Next_HR_FileSys();
  826.     if (HRS_index >= 0)
  827.         return HRS_index + HRS_TYPE_FIXED_MAX;
  828.     return -1;
  829. }
  830. #ifdef linux
  831. int
  832. linux_mem(int mem_type, int size_or_used)
  833. {
  834.     FILE           *fp;
  835.     char            buf[1024];
  836.     int             size = -1, free = -1, buffers = -1;
  837.     if ((fp = fopen("/proc/meminfo", "r")) == NULL)
  838.         return -1;
  839.     while (fgets(buf, sizeof(buf), fp) != NULL) {
  840.        if ((!strncmp(buf, "MemTotal:", 9) && (mem_type == HRS_TYPE_MEM || mem_type == HRS_TYPE_MBUF)) ||
  841.             (!strncmp(buf, "SwapTotal:", 10) && mem_type == HRS_TYPE_SWAP))
  842.             sscanf(buf, "%*s %d", &size);
  843.        if ((!strncmp(buf, "MemFree:", 8) && mem_type == HRS_TYPE_MEM) ||
  844.             (!strncmp(buf, "SwapFree:", 9) && mem_type == HRS_TYPE_SWAP))
  845.             sscanf(buf, "%*s %d", &free);
  846.        if ((!strncmp(buf, "Buffers:", 8) && mem_type == HRS_TYPE_MBUF))
  847. sscanf(buf, "%*s %d", &buffers);
  848.     }
  849.     fclose(fp);
  850.     switch (mem_type) {
  851.         case HRS_TYPE_MBUF:
  852.             return (size_or_used == HRSTORE_SIZE ? size : buffers);
  853.         default:
  854.             return (size_or_used == HRSTORE_SIZE ? size : (size - free));
  855.     } /* switch */
  856. }
  857. #endif
  858. #ifdef solaris2
  859. void
  860. sol_get_swapinfo(int *totalP, int *usedP)
  861. {
  862.     struct anoninfo ainfo;
  863.     if (swapctl(SC_AINFO, &ainfo) < 0) {
  864.         *totalP = *usedP = 0;
  865.         return;
  866.     }
  867.     *totalP = ainfo.ani_max;
  868.     *usedP = ainfo.ani_resv;
  869. }
  870. #endif                          /* solaris2 */