📄 hr_storage.c
字号:
static const char *hrs_descr[] = { NULL, "Memory Buffers", /* HRS_TYPE_MBUF */ "Real Memory", /* HRS_TYPE_MEM */ "Swap Space" /* HRS_TYPE_SWAP */};u_char *var_hrstore(struct variable *vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method){ int store_idx = 0;#if !defined(linux)#if defined(solaris2) int freemem; int swap_total, swap_used;#elif defined(hpux10) || defined(hpux11) struct pst_dynamic pst_buf;#elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM) struct vmtotal memory_totals;#endif#if HAVE_SYS_POOL_H struct pool mbpool, mclpool; int i;#endif#ifdef MBSTAT_SYMBOL struct mbstat mbstat;#endif#endif /* !linux */ static char string[1024]; struct HRFS_statfs stat_buf; if (vp->magic == HRSTORE_MEMSIZE) { if (header_hrstore(vp, name, length, exact, var_len, write_method) == MATCH_FAILED) return NULL; } else {really_try_next: store_idx = header_hrstoreEntry(vp, name, length, exact, var_len, write_method); if (store_idx == MATCH_FAILED) return NULL; if (store_idx > HRS_TYPE_FIXED_MAX) { if (HRFS_statfs(HRFS_entry->HRFS_mount, &stat_buf) < 0) { snmp_log_perror(HRFS_entry->HRFS_mount); goto try_next; } }#if !defined(linux) && !defined(solaris2) else switch (store_idx) { case HRS_TYPE_MEM: case HRS_TYPE_SWAP:#ifdef USE_SYSCTL_VM { int mib[2]; size_t len = sizeof(memory_totals); mib[0] = CTL_VM; mib[1] = VM_METER; sysctl(mib, 2, &memory_totals, &len, NULL, 0); }#elif defined(hpux10) || defined(hpux11) pstat_getdynamic(&pst_buf, sizeof(struct pst_dynamic), 1, 0);#elif defined(TOTAL_MEMORY_SYMBOL) auto_nlist(TOTAL_MEMORY_SYMBOL, (char *) &memory_totals, sizeof(struct vmtotal));#endif break;#if !defined(hpux10) && !defined(hpux11) case HRS_TYPE_MBUF:#if HAVE_SYS_POOL_H auto_nlist(MBPOOL_SYMBOL, (char *) &mbpool, sizeof(mbpool)); auto_nlist(MCLPOOL_SYMBOL, (char *) &mclpool, sizeof(mclpool));#endif#ifdef MBSTAT_SYMBOL auto_nlist(MBSTAT_SYMBOL, (char *) &mbstat, sizeof(mbstat));#endif break;#endif /* !hpux10 && !hpux11 */ default: break; }#endif /* !linux && !solaris2 */ } switch (vp->magic) { case HRSTORE_MEMSIZE: long_return = physmem * (pagesize / 1024); return (u_char *) & long_return; case HRSTORE_INDEX: long_return = store_idx; return (u_char *) & long_return; case HRSTORE_TYPE: if (store_idx > HRS_TYPE_FIXED_MAX) if (storageUseNFS && Check_HR_FileSys_NFS()) storage_type_id[storage_type_len - 1] = 10; /* Network Disk */ else storage_type_id[storage_type_len - 1] = 4; /* Assume fixed */ else switch (store_idx) { case HRS_TYPE_MEM: storage_type_id[storage_type_len - 1] = 2; /* RAM */ break; case HRS_TYPE_SWAP: storage_type_id[storage_type_len - 1] = 3; /* Virtual Mem */ break; case HRS_TYPE_MBUF: storage_type_id[storage_type_len - 1] = 1; /* Other */ break; default: storage_type_id[storage_type_len - 1] = 1; /* Other */ break; } *var_len = sizeof(storage_type_id); return (u_char *) storage_type_id; case HRSTORE_DESCR: if (store_idx > HRS_TYPE_FIXED_MAX) { strncpy(string, HRFS_entry->HRFS_mount, sizeof(string)-1); string[ sizeof(string)-1 ] = 0; *var_len = strlen(string); return (u_char *) string; } else { /* store_idx = store_idx - 1; */ *var_len = strlen(hrs_descr[store_idx]); return (u_char *) hrs_descr[store_idx]; } case HRSTORE_UNITS: if (store_idx > HRS_TYPE_FIXED_MAX)#if HRFS_HAS_FRSIZE long_return = stat_buf.f_frsize;#else long_return = stat_buf.f_bsize;#endif else switch (store_idx) { case HRS_TYPE_MEM: case HRS_TYPE_SWAP:#if defined(USE_SYSCTL) || defined(solaris2) long_return = pagesize;#elif defined(NBPG) long_return = NBPG;#else long_return = 1024; /* Report in Kb */#endif break; case HRS_TYPE_MBUF:#ifdef MSIZE long_return = MSIZE;#elif defined(linux) long_return = 1024;#else long_return = 256;#endif break; default:#if NO_DUMMY_VALUES goto try_next;#endif long_return = 1024; /* As likely as any! */ break; } return (u_char *) & long_return; case HRSTORE_SIZE: if (store_idx > HRS_TYPE_FIXED_MAX) long_return = stat_buf.f_blocks; else switch (store_idx) {#if defined(linux) case HRS_TYPE_MBUF: case HRS_TYPE_MEM: case HRS_TYPE_SWAP: long_return = linux_mem(store_idx, HRSTORE_SIZE); break;#elif defined(solaris2) case HRS_TYPE_MEM: long_return = physmem; break; case HRS_TYPE_SWAP: sol_get_swapinfo(&swap_total, &swap_used); long_return = swap_total; break;#elif defined(hpux10) || defined(hpux11) case HRS_TYPE_MEM: long_return = pst_buf.psd_rm; break; case HRS_TYPE_SWAP: long_return = pst_buf.psd_vm; break;#elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM) case HRS_TYPE_MEM: long_return = memory_totals.t_rm; break; case HRS_TYPE_SWAP: long_return = memory_totals.t_vm; break;#else /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */ case HRS_TYPE_MEM: long_return = physmem; break; case HRS_TYPE_SWAP:#if NO_DUMMY_VALUES goto try_next;#endif long_return = 0; break; case HRS_TYPE_MBUF:#if HAVE_SYS_POOL_H long_return = 0; for (i = 0; i < sizeof(mbstat.m_mtypes) / sizeof(mbstat.m_mtypes[0]); i++) long_return += mbstat.m_mtypes[i];#elif defined(MBSTAT_SYMBOL) long_return = mbstat.m_mbufs;#elif defined(NO_DUMMY_VALUES) goto try_next;#else long_return = 0;#endif break;#endif /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */ default:#if NO_DUMMY_VALUES goto try_next;#endif long_return = 1024; break; } return (u_char *) & long_return; case HRSTORE_USED: if (store_idx > HRS_TYPE_FIXED_MAX) long_return = (stat_buf.f_blocks - stat_buf.f_bfree); else switch (store_idx) {#if defined(linux) case HRS_TYPE_MBUF: case HRS_TYPE_MEM: case HRS_TYPE_SWAP: long_return = linux_mem(store_idx, HRSTORE_USED); break;#elif defined(solaris2) case HRS_TYPE_MEM: getKstatInt("unix", "system_pages", "freemem", &freemem); long_return = physmem - freemem; break; case HRS_TYPE_SWAP: sol_get_swapinfo(&swap_total, &swap_used); long_return = swap_used; break;#elif defined(hpux10) || defined(hpux11) case HRS_TYPE_MEM: long_return = pst_buf.psd_arm; break; case HRS_TYPE_SWAP: long_return = pst_buf.psd_avm; break;#elif defined(TOTAL_MEMORY_SYMBOL) || defined(USE_SYSCTL_VM) case HRS_TYPE_MEM: long_return = memory_totals.t_arm; break; case HRS_TYPE_SWAP: long_return = memory_totals.t_avm; break;#endif /* linux || solaris2 || hpux10 || hpux11 || ... */#if !defined(linux) && !defined(solaris2) && !defined(hpux10) && !defined(hpux11) case HRS_TYPE_MBUF:#if HAVE_SYS_POOL_H long_return = (mbpool.pr_nget - mbpool.pr_nput) * mbpool.pr_size + (mclpool.pr_nget - mclpool.pr_nput) * mclpool.pr_size;#elif defined(MBSTAT_SYMBOL) && defined(STRUCT_MBSTAT_HAS_M_CLUSTERS) long_return = mbstat.m_clusters - mbstat.m_clfree; /* unlikely, but... */#elif defined(NO_DUMMY_VALUES) goto try_next;#else long_return = 0;#endif break;#endif /* !linux && !solaris2 && !hpux10 && !hpux11 && ... */ default:#if NO_DUMMY_VALUES goto try_next;#endif long_return = 1024; break; } return (u_char *) & long_return; case HRSTORE_FAILS: if (store_idx > HRS_TYPE_FIXED_MAX)#if NO_DUMMY_VALUES goto try_next;#else long_return = 0;#endif else switch (store_idx) { case HRS_TYPE_MEM: case HRS_TYPE_SWAP:#if NO_DUMMY_VALUES goto try_next;#endif long_return = 0; break;#if !defined(linux) && !defined(solaris2) && !defined(hpux10) && !defined(hpux11) && defined(MBSTAT_SYMBOL) case HRS_TYPE_MBUF: long_return = mbstat.m_drops; break;#endif /* !linux && !solaris2 && !hpux10 && !hpux11 && MBSTAT_SYMBOL */ default:#if NO_DUMMY_VALUES goto try_next;#endif long_return = 0; break; } return (u_char *) & long_return; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrstore\n", vp->magic)); } return NULL; try_next: if (!exact) goto really_try_next; return NULL;} /********************* * * Internal implementation functions * *********************/static int FS_storage;static int HRS_index;voidInit_HR_Store(void){#if !defined(solaris2) && !defined(hpux10) && !defined(hpux11) HRS_index = 0;#else HRS_index = HRS_TYPE_MBUF;#endif Init_HR_FileSys(); FS_storage = 0; /* Start with file-based storage */}intGet_Next_HR_Store(void){ /* * Fixed-style 'other' storage types */ long_return = -1; if (FS_storage == 0) { ++HRS_index; if (HRS_index <= HRS_TYPE_FIXED_MAX) return HRS_index; else { FS_storage = 1; HRS_index = 0; } } /* * File-based storage */ HRS_index = Get_Next_HR_FileSys(); if (HRS_index >= 0) return HRS_index + HRS_TYPE_FIXED_MAX; return -1;}#ifdef linuxintlinux_mem(int mem_type, int size_or_used){ FILE *fp; char buf[1024]; int size = -1, free = -1, buffers = -1; if ((fp = fopen("/proc/meminfo", "r")) == NULL) return -1; while (fgets(buf, sizeof(buf), fp) != NULL) { if ((!strncmp(buf, "MemTotal:", 9) && (mem_type == HRS_TYPE_MEM || mem_type == HRS_TYPE_MBUF)) || (!strncmp(buf, "SwapTotal:", 10) && mem_type == HRS_TYPE_SWAP)) sscanf(buf, "%*s %d", &size); if ((!strncmp(buf, "MemFree:", 8) && mem_type == HRS_TYPE_MEM) || (!strncmp(buf, "SwapFree:", 9) && mem_type == HRS_TYPE_SWAP)) sscanf(buf, "%*s %d", &free); if ((!strncmp(buf, "Buffers:", 8) && mem_type == HRS_TYPE_MBUF)) sscanf(buf, "%*s %d", &buffers); } fclose(fp); switch (mem_type) { case HRS_TYPE_MBUF: return (size_or_used == HRSTORE_SIZE ? size : buffers); default: return (size_or_used == HRSTORE_SIZE ? size : (size - free)); } /* switch */}#endif#ifdef solaris2voidsol_get_swapinfo(int *totalP, int *usedP){ struct anoninfo ainfo; if (swapctl(SC_AINFO, &ainfo) < 0) { *totalP = *usedP = 0; return; } *totalP = ainfo.ani_max; *usedP = ainfo.ani_resv;}#endif /* solaris2 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -