📄 memory.c
字号:
#include <net-snmp/net-snmp-config.h>#if HAVE_STDLIB_H#include <stdlib.h>#endif#if HAVE_UNISTD_H#include <unistd.h>#endif#if HAVE_FCNTL_H#include <fcntl.h>#endif#include <ctype.h>#include <signal.h>#if HAVE_MACHINE_PARAM_H#include <machine/param.h>#endif#if HAVE_SYS_VMMETER_H#if !defined(bsdi2) && !defined(netbsd1)#include <sys/vmmeter.h>#endif#endif#if HAVE_SYS_CONF_H#include <sys/conf.h>#endif#if HAVE_ASM_PAGE_H#include <asm/page.h>#endif#if HAVE_SYS_SWAP_H#include <sys/swap.h>#endif#if HAVE_SYS_FS_H#include <sys/fs.h>#else#if HAVE_UFS_FS_H#include <ufs/fs.h>#else#ifdef HAVE_SYS_STAT_H#include <sys/stat.h>#endif#ifdef HAVE_SYS_VNODE_H#include <sys/vnode.h>#endif#ifdef HAVE_UFS_UFS_QUOTA_H#include <ufs/ufs/quota.h>#endif#ifdef HAVE_UFS_UFS_INODE_H#include <ufs/ufs/inode.h>#endif#ifdef HAVE_SYS_PARAM_H#include <sys/param.h>#endif#if HAVE_UFS_FFS_FS_H#include <ufs/ffs/fs.h>#endif#endif#endif#if HAVE_MTAB_H#include <mtab.h>#endif#include <sys/stat.h>#include <errno.h>#if HAVE_FSTAB_H#include <fstab.h>#endif#if HAVE_SYS_STATVFS_H#include <sys/statvfs.h>#endif#if HAVE_SYS_VFS_H#include <sys/vfs.h>#endif#if (!defined(HAVE_STATVFS)) && defined(HAVE_STATFS)#if HAVE_SYS_PARAM_H#include <sys/param.h>#endif#if HAVE_SYS_MOUNT_H#include <sys/mount.h>#endif#if HAVE_SYS_SYSCTL_H#include <sys/sysctl.h>#endif#define statvfs statfs#endif#if HAVE_VM_SWAP_PAGER_H#include <vm/swap_pager.h>#endif#if HAVE_SYS_FIXPOINT_H#include <sys/fixpoint.h>#endif#if HAVE_MALLOC_H#include <malloc.h>#endif#if HAVE_STRING_H#include <string.h>#endif#if TIME_WITH_SYS_TIME# include <sys/time.h># include <time.h>#else# if HAVE_SYS_TIME_H# include <sys/time.h># else# include <time.h># endif#endif#if defined(hpux10) || defined(hpux11)#include <sys/pstat.h>#endif#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include <net-snmp/agent/auto_nlist.h>#include "mibdefs.h"#include "struct.h"#include "util_funcs.h"#include "memory.h"int minimumswap;#ifndef linuxstatic int pageshift; /* log base 2 of the pagesize */#elsestatic int log_procerr = 1;voidgetmem(unsigned long *memtotal, unsigned long *memfree, unsigned long *memshared, unsigned long *buffers, unsigned long *cached, unsigned long *swaptotal, unsigned long *swapfree);#endif#ifndef bsdi2#ifdef NSWAPDEV_SYMBOLint nswapdev=10; /* taken from <machine/space.h> */#endif#ifdef NSWAPFS_SYMBOLint nswapfs=10; /* taken from <machine/space.h> */#endif#endif /* !bsdi2 */#define DEFAULTMINIMUMSWAP 16000 /* kilobytes */static FindVarMethod var_extensible_mem;voidinit_memory(void){#ifdef linux unsigned long memtotal, memfree, memshared, buffers, cached, swaptotal, swapfree; /* * call once, to log errors for missing vars, then turn off logging * of those errors. */ getmem(&memtotal, &memfree, &memshared, &buffers, &cached, &swaptotal, &swapfree); log_procerr = 0;#else int pagesize;#ifdef PHYSMEM_SYMBOL auto_nlist(PHYSMEM_SYMBOL, 0, 0);#endif#ifdef TOTAL_MEMORY_SYMBOL auto_nlist(TOTAL_MEMORY_SYMBOL, 0, 0);#endif#ifdef MBSTAT_SYMBOL auto_nlist(MBSTAT_SYMBOL, 0, 0);#endif#ifdef SWDEVT_SYMBOL auto_nlist(SWDEVT_SYMBOL, 0, 0);#endif#ifdef FSWDEVT_SYMBOL auto_nlist(FSWDEVT_SYMBOL, 0, 0);#endif#ifdef NSWAPFS_SYMBOL auto_nlist(NSWAPFS_SYMBOL, 0, 0);#endif#ifdef NSWAPDEV_SYMBOL auto_nlist(NSWAPDEV_SYMBOL, 0, 0);#endif#ifndef bsdi2#ifdef NSWAPDEV_SYMBOL if (auto_nlist(NSWAPDEV_SYMBOL, (char *) &nswapdev, sizeof(nswapdev)) == 0) return;#endif#ifdef NSWAPFS_SYMBOL if (auto_nlist(NSWAPFS_SYMBOL, (char *) &nswapfs, sizeof(nswapfs)) == 0) return;#endif#endif /* bsdi2 */ pagesize = 1 << PGSHIFT; pageshift = 0; while (pagesize > 1) { pageshift++; pagesize >>= 1; } pageshift -= 10;#endif /* linux */ { struct variable2 extensible_mem_variables[] = { {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MIBINDEX}}, {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_mem, 1, {ERRORNAME}}, {MEMTOTALSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALSWAP}}, {MEMAVAILSWAP, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMAVAILSWAP}}, {MEMTOTALREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALREAL}}, {MEMAVAILREAL, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMAVAILREAL}}, {MEMTOTALSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALSWAPTXT}}, {MEMUSEDSWAPTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMUSEDSWAPTXT}}, {MEMTOTALREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALREALTXT}}, {MEMUSEDREALTXT, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMUSEDREALTXT}}, {MEMTOTALFREE, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMTOTALFREE}}, {MEMSWAPMINIMUM, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMSWAPMINIMUM}}, {MEMSHARED, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMSHARED}}, {MEMBUFFER, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMBUFFER}}, {MEMCACHED, ASN_INTEGER, RONLY, var_extensible_mem, 1, {MEMCACHED}}, {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_mem, 1, {ERRORFLAG}}, {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_mem, 1, {ERRORMSG}} }; /* * Define the OID pointer to the top of the mib tree that we're * registering underneath */ oid mem_variables_oid[] = { UCDAVIS_MIB, MEMMIBNUM }; /* * register ourselves with the agent to handle our mib tree */ REGISTER_MIB("ucd-snmp/memory", extensible_mem_variables, variable2, mem_variables_oid); snmpd_register_config_handler("swap", memory_parse_config, memory_free_config, "min-avail"); }}voidmemory_parse_config(const char *token, char *cptr){ minimumswap = atoi(cptr);}voidmemory_free_config(void){ minimumswap = DEFAULTMINIMUMSWAP;}#ifdef linux#define MEMINFO_FILE "/proc/meminfo"voidgetmem(unsigned long *memtotal, unsigned long *memfree, unsigned long *memshared, unsigned long *buffers, unsigned long *cached, unsigned long *swaptotal, unsigned long *swapfree){ int statfd; static char *buff = NULL; static int bsize = 0; if ((statfd = open(MEMINFO_FILE, O_RDONLY, 0)) != -1) { char *b; if (bsize == 0) { bsize = 128; buff = malloc(bsize); } while (read(statfd, buff, bsize) == bsize) { bsize += 256; buff = realloc(buff, bsize); close(statfd); statfd = open(MEMINFO_FILE, O_RDONLY, 0); } close(statfd); b = strstr(buff, "MemTotal: "); if (b) sscanf(b, "MemTotal: %lu", memtotal); else { if(log_procerr) snmp_log(LOG_ERR, "No MemTotal line in /proc/meminfo\n"); *memtotal = 0; } b = strstr(buff, "MemFree: "); if (b) sscanf(b, "MemFree: %lu", memfree); else { if(log_procerr) snmp_log(LOG_ERR, "No MemFree line in /proc/meminfo\n"); *memfree = 0; } b = strstr(buff, "MemShared: "); if (b) sscanf(b, "MemShared: %lu", memshared); else { if(log_procerr) { if (0 == netsnmp_os_prematch("Linux","2.4")) snmp_log(LOG_ERR, "No MemShared line in /proc/meminfo\n"); } *memshared = 0; } b = strstr(buff, "Buffers: "); if (b) sscanf(b, "Buffers: %lu", buffers); else { if(log_procerr) snmp_log(LOG_ERR, "No Buffers line in /proc/meminfo\n"); *buffers = 0; } b = strstr(buff, "Cached: "); if (b) sscanf(b, "Cached: %lu", cached); else { if(log_procerr) snmp_log(LOG_ERR, "No Cached line in /proc/meminfo\n"); *cached = 0; } b = strstr(buff, "SwapTotal: "); if (b) sscanf(b, "SwapTotal: %lu", swaptotal); else { if(log_procerr) snmp_log(LOG_ERR, "No SwapTotal line in /proc/meminfo\n"); *swaptotal = 0; } b = strstr(buff, "SwapFree: "); if (b) sscanf(b, "SwapFree: %lu", swapfree); else { if(log_procerr) snmp_log(LOG_ERR, "No SwapFree line in /proc/meminfo\n"); *swapfree = 0; } } else { snmp_log_perror(MEMINFO_FILE); }}enum memory_index { memtotal, memfree, memshared, buffers, cached, swaptotal, swapfree};unsignedmemory(int iindex){ unsigned long mem_total[2], mem_free[2], mem_shared[2], mem_buffers[2], mem_cached[2], swap_total[2], swap_free[2]; getmem(mem_total, mem_free, mem_shared, mem_buffers, mem_cached, swap_total, swap_free); switch (iindex) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -