diff options
Diffstat (limited to 'src/libs/zbxsysinfo/freebsd/swap.c')
-rw-r--r-- | src/libs/zbxsysinfo/freebsd/swap.c | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/src/libs/zbxsysinfo/freebsd/swap.c b/src/libs/zbxsysinfo/freebsd/swap.c new file mode 100644 index 00000000..d4f13a53 --- /dev/null +++ b/src/libs/zbxsysinfo/freebsd/swap.c @@ -0,0 +1,270 @@ +/* +** ZABBIX +** Copyright (C) 2000-2005 SIA Zabbix +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +**/ + +#include "config.h" + +#include <errno.h> + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/stat.h> +#include <sys/types.h> + +/* Definitions of uint32_t under OS/X */ +#ifdef HAVE_STDINT_H + #include <stdint.h> +#endif +#ifdef HAVE_STRINGS_H + #include <strings.h> +#endif +#ifdef HAVE_FCNTL_H + #include <fcntl.h> +#endif +#ifdef HAVE_DIRENT_H + #include <dirent.h> +#endif +/* Linux */ +#ifdef HAVE_SYS_VFS_H + #include <sys/vfs.h> +#endif +#ifdef HAVE_SYS_SYSINFO_H + #include <sys/sysinfo.h> +#endif +/* Solaris */ +#ifdef HAVE_SYS_STATVFS_H + #include <sys/statvfs.h> +#endif +/* Solaris */ +#ifdef HAVE_SYS_PROCFS_H +/* This is needed to access the correct procfs.h definitions */ + #define _STRUCTURED_PROC 1 + #include <sys/procfs.h> +#endif +#ifdef HAVE_SYS_LOADAVG_H + #include <sys/loadavg.h> +#endif +#ifdef HAVE_SYS_SOCKET_H + #include <sys/socket.h> +#endif +#ifdef HAVE_NETINET_IN_H + #include <netinet/in.h> +#endif +#ifdef HAVE_ARPA_INET_H + #include <arpa/inet.h> +#endif +/* OpenBSD/Solaris */ +#ifdef HAVE_SYS_PARAM_H + #include <sys/param.h> +#endif + +#ifdef HAVE_SYS_MOUNT_H + #include <sys/mount.h> +#endif + +/* HP-UX */ +#ifdef HAVE_SYS_PSTAT_H + #include <sys/pstat.h> +#endif + +#ifdef HAVE_NETDB_H + #include <netdb.h> +#endif + +/* Solaris */ +#ifdef HAVE_SYS_SWAP_H + #include <sys/swap.h> +#endif + +/* FreeBSD */ +#ifdef HAVE_SYS_SYSCTL_H + #include <sys/sysctl.h> +#endif + +/* Solaris */ +#ifdef HAVE_SYS_SYSCALL_H + #include <sys/syscall.h> +#endif + +/* FreeBSD */ +#ifdef HAVE_VM_VM_PARAM_H + #include <vm/vm_param.h> +#endif +/* FreeBSD */ +#ifdef HAVE_SYS_VMMETER_H + #include <sys/vmmeter.h> +#endif +/* FreeBSD */ +#ifdef HAVE_SYS_TIME_H + #include <sys/time.h> +#endif + +#ifdef HAVE_MACH_HOST_INFO_H + #include <mach/host_info.h> +#endif +#ifdef HAVE_MACH_MACH_HOST_H + #include <mach/mach_host.h> +#endif + + +#ifdef HAVE_KSTAT_H + #include <kstat.h> +#endif + +#ifdef HAVE_LDAP + #include <ldap.h> +#endif + +#include "common.h" +#include "sysinfo.h" + +#include "md5.h" + +/* Solaris. */ +#ifndef HAVE_SYSINFO_FREESWAP +#ifdef HAVE_SYS_SWAP_SWAPTABLE +void get_swapinfo(double *total, double *fr) +{ + register int cnt, i, page_size; +/* Support for >2Gb */ +/* register int t, f;*/ + double t, f; + struct swaptable *swt; + struct swapent *ste; + static char path[256]; + + /* get total number of swap entries */ + cnt = swapctl(SC_GETNSWP, 0); + + /* allocate enough space to hold count + n swapents */ + swt = (struct swaptable *)malloc(sizeof(int) + + cnt * sizeof(struct swapent)); + + if (swt == NULL) + { + *total = 0; + *fr = 0; + return; + } + swt->swt_n = cnt; + +/* fill in ste_path pointers: we don't care about the paths, so we +point them all to the same buffer */ + ste = &(swt->swt_ent[0]); + i = cnt; + while (--i >= 0) + { + ste++->ste_path = path; + } + + /* grab all swap info */ + swapctl(SC_LIST, swt); + + /* walk thru the structs and sum up the fields */ + t = f = 0; + ste = &(swt->swt_ent[0]); + i = cnt; + while (--i >= 0) + { + /* dont count slots being deleted */ + if (!(ste->ste_flags & ST_INDEL) && + !(ste->ste_flags & ST_DOINGDEL)) + { + t += ste->ste_pages; + f += ste->ste_free; + } + ste++; + } + + page_size=getpagesize(); + + /* fill in the results */ + *total = page_size*t; + *fr = page_size*f; + free(swt); +} +#endif +#endif + +int SYSTEM_SWAP_FREE(const char *cmd, const char *parameter,double *value) +{ +#ifdef HAVE_SYSINFO_FREESWAP + struct sysinfo info; + + if( 0 == sysinfo(&info)) + { +#ifdef HAVE_SYSINFO_MEM_UNIT + *value=(double)info.freeswap * (double)info.mem_unit; +#else + *value=(double)info.freeswap; +#endif + return SYSINFO_RET_OK; + } + else + { + return SYSINFO_RET_FAIL; + } +/* Solaris */ +#else +#ifdef HAVE_SYS_SWAP_SWAPTABLE + double swaptotal,swapfree; + + get_swapinfo(&swaptotal,&swapfree); + + *value=swapfree; + return SYSINFO_RET_OK; +#else + return SYSINFO_RET_FAIL; +#endif +#endif +} + +int SYSTEM_SWAP_TOTAL(const char *cmd, const char *parameter,double *value) +{ +#ifdef HAVE_SYSINFO_TOTALSWAP + struct sysinfo info; + + if( 0 == sysinfo(&info)) + { +#ifdef HAVE_SYSINFO_MEM_UNIT + *value=(double)info.totalswap * (double)info.mem_unit; +#else + *value=(double)info.totalswap; +#endif + return SYSINFO_RET_OK; + } + else + { + return SYSINFO_RET_FAIL; + } +/* Solaris */ +#else +#ifdef HAVE_SYS_SWAP_SWAPTABLE + double swaptotal,swapfree; + + get_swapinfo(&swaptotal,&swapfree); + + *value=(double)swaptotal; + return SYSINFO_RET_OK; +#else + return SYSINFO_RET_FAIL; +#endif +#endif +} |