summaryrefslogtreecommitdiffstats
path: root/src/libs/zbxsysinfo/freebsd/cpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/zbxsysinfo/freebsd/cpu.c')
-rw-r--r--src/libs/zbxsysinfo/freebsd/cpu.c437
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
+}