diff options
Diffstat (limited to 'src/libs/zbxsysinfo/freebsd/cpu.c')
-rw-r--r-- | src/libs/zbxsysinfo/freebsd/cpu.c | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/src/libs/zbxsysinfo/freebsd/cpu.c b/src/libs/zbxsysinfo/freebsd/cpu.c new file mode 100644 index 00000000..da971b3a --- /dev/null +++ b/src/libs/zbxsysinfo/freebsd/cpu.c @@ -0,0 +1,437 @@ +/* +** 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 + +/* AIX CPU */ +#ifdef HAVE_KNLIST_H + #include <knlist.h> +#endif + +#ifdef HAVE_KSTAT_H + #include <kstat.h> +#endif + +#ifdef HAVE_LDAP + #include <ldap.h> +#endif + +#include "common.h" +#include "sysinfo.h" + +int SYSTEM_CPU_IDLE1(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[idle1]",value); +} + +int SYSTEM_CPU_IDLE5(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[idle5]",value); +} + +int SYSTEM_CPU_IDLE15(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[idle15]",value); +} + +int SYSTEM_CPU_NICE1(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[nice1]",value); +} + +int SYSTEM_CPU_NICE5(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[nice5]",value); +} +int SYSTEM_CPU_NICE15(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[nice15]",value); +} + +int SYSTEM_CPU_USER1(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[user1]",value); +} + +int SYSTEM_CPU_USER5(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[user5]",value); +} + +int SYSTEM_CPU_USER15(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[user15]",value); +} + +int SYSTEM_CPU_SYS1(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[system1]",value); +} + +int SYSTEM_CPU_SYS5(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[system5]",value); +} + +int SYSTEM_CPU_SYS15(const char *cmd, const char *param,double *value) +{ + return get_stat("cpu[system15]",value); +} + +/* AIX CPU info */ +#ifdef HAVE_KNLIST_H +static int getloadavg_kmem(double loadavg[], int nelem) +{ + struct nlist nl; + int kmem, i; + long avenrun[3]; + + nl.n_name = "avenrun"; + nl.n_value = 0; + + if(knlist(&nl, 1, sizeof(nl))) + { + return FAIL; + } + if((kmem = open("/dev/kmem", 0, 0)) <= 0) + { + return FAIL; + } + + if(pread(kmem, avenrun, sizeof(avenrun), nl.n_value) < + sizeof(avenrun)) + { + return FAIL; + } + + for(i=0;i<nelem;i++) + { + loadavg[i] = (double) avenrun[i] / 65535; + } + return SUCCEED; +} +#endif + +int SYSTEM_CPU_LOAD1(const char *cmd, const char *parameter,double *value) +{ +#ifdef HAVE_GETLOADAVG + double load[3]; + + if(getloadavg(load, 3)) + { + *value=load[0]; + return SYSINFO_RET_OK; + } + else + { + return SYSINFO_RET_FAIL; + } +#else +#ifdef HAVE_SYS_PSTAT_H + struct pst_dynamic dyn; + + if (pstat_getdynamic(&dyn, sizeof(dyn), 1, 0) == -1) + { + return SYSINFO_RET_FAIL; + } + else + { + *value=(double)dyn.psd_avg_1_min; + return SYSINFO_RET_OK; + } +#else +#ifdef HAVE_PROC_LOADAVG + return getPROC("/proc/loadavg",1,1,value); +#else +#ifdef HAVE_KSTAT_H + static kstat_ctl_t *kc = NULL; + kstat_t *ks; + kstat_named_t *kn; + + if (!kc && !(kc = kstat_open())) + { + return SYSINFO_RET_FAIL; + } + if (!(ks = kstat_lookup(kc, "unix", 0, "system_misc")) || + kstat_read(kc, ks, 0) == -1 || + !(kn = kstat_data_lookup(ks,"avenrun_1min"))) + { + return SYSINFO_RET_FAIL; + } + *value=(double)kn->value.ul/256.0; + return SYSINFO_RET_OK; +#else +#ifdef HAVE_KNLIST_H + double loadavg[3]; + + if(getloadavg_kmem(loadavg,3) == FAIL) + { + return SYSINFO_RET_FAIL; + } + + *value=loadavg[0]; + return SYSINFO_RET_OK; +#else + return SYSINFO_RET_FAIL; +#endif +#endif +#endif +#endif +#endif +} + +int SYSTEM_CPU_LOAD5(const char *cmd, const char *parameter,double *value) +{ +#ifdef HAVE_GETLOADAVG + double load[3]; + + if(getloadavg(load, 3)) + { + *value=load[1]; + return SYSINFO_RET_OK; + } + else + { + return SYSINFO_RET_FAIL; + } +#else +#ifdef HAVE_SYS_PSTAT_H + struct pst_dynamic dyn; + + if (pstat_getdynamic(&dyn, sizeof(dyn), 1, 0) == -1) + { + return SYSINFO_RET_FAIL; + } + else + { + *value=(double)dyn.psd_avg_5_min; + return SYSINFO_RET_OK; + } +#else +#ifdef HAVE_PROC_LOADAVG + return getPROC("/proc/loadavg",1,2,value); +#else +#ifdef HAVE_KSTAT_H + static kstat_ctl_t *kc = NULL; + kstat_t *ks; + kstat_named_t *kn; + + if (!kc && !(kc = kstat_open())) + { + return SYSINFO_RET_FAIL; + } + if (!(ks = kstat_lookup(kc, "unix", 0, "system_misc")) || + kstat_read(kc, ks, 0) == -1 || + !(kn = kstat_data_lookup(ks,"avenrun_5min"))) + { + return SYSINFO_RET_FAIL; + } + *value=(double)kn->value.ul/256.0; + return SYSINFO_RET_OK; +#else +#ifdef HAVE_KNLIST_H + double loadavg[3]; + + if(getloadavg_kmem(loadavg,3) == FAIL) + { + return STSINFO_RET_FAIL; + } + + *value=loadavg[1]; + return SYSINFO_RET_OK; +#else + return SYSINFO_RET_FAIL; +#endif +#endif +#endif +#endif +#endif +} + +int SYSTEM_CPU_LOAD15(const char *cmd, const char *parameter,double *value) +{ +#ifdef HAVE_GETLOADAVG + double load[3]; + + if(getloadavg(load, 3)) + { + *value=load[2]; + return SYSINFO_RET_OK; + } + else + { + return SYSINFO_RET_FAIL; + } +#else +#ifdef HAVE_SYS_PSTAT_H + struct pst_dynamic dyn; + + if (pstat_getdynamic(&dyn, sizeof(dyn), 1, 0) == -1) + { + return SYSINFO_RET_FAIL; + } + else + { + *value=(double)dyn.psd_avg_15_min; + return SYSINFO_RET_OK; + } +#else +#ifdef HAVE_PROC_LOADAVG + return getPROC("/proc/loadavg",1,3,value); +#else +#ifdef HAVE_KSTAT_H + static kstat_ctl_t *kc = NULL; + kstat_t *ks; + kstat_named_t *kn; + + if (!kc && !(kc = kstat_open())) + { + return SYSINFO_RET_FAIL; + } + if (!(ks = kstat_lookup(kc, "unix", 0, "system_misc")) || + kstat_read(kc, ks, 0) == -1 || + !(kn = kstat_data_lookup(ks,"avenrun_15min"))) + { + return SYSINFO_RET_FAIL; + } + *value=(double)kn->value.ul/256.0; + return SYSINFO_RET_OK; +#else +#ifdef HAVE_KNLIST_H + double loadavg[3]; + + if(getloadavg_kmem(loadavg,3) == FAIL) + { + return STSINFO_RET_FAIL; + } + + *value=loadavg[2]; + return SYSINFO_RET_OK; +#else + return SYSINFO_RET_FAIL; +#endif +#endif +#endif +#endif +#endif +} |