summaryrefslogtreecommitdiff
path: root/misc/upclient/files/patch-stats-bsd.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/upclient/files/patch-stats-bsd.c')
-rw-r--r--misc/upclient/files/patch-stats-bsd.c324
1 files changed, 256 insertions, 68 deletions
diff --git a/misc/upclient/files/patch-stats-bsd.c b/misc/upclient/files/patch-stats-bsd.c
index b5aea3fa6c2c..9e3eb46809dc 100644
--- a/misc/upclient/files/patch-stats-bsd.c
+++ b/misc/upclient/files/patch-stats-bsd.c
@@ -1,33 +1,108 @@
---- src/stats-bsd.c.orig Sat Jun 16 21:12:53 2001
-+++ src/stats-bsd.c Sun Nov 18 17:33:52 2001
-@@ -26,37 +26,50 @@
+--- src/stats-bsd.c.orig Mon Sep 30 02:58:36 2002
++++ src/stats-bsd.c Sat Oct 19 22:50:30 2002
+@@ -41,139 +41,171 @@
+ #include "upclient.h"
+ #include "options.h"
+ #include "stats.h"
+-#include "uplog.h" /* wrapper for <syslog.h> */
+
+ /* System includes */
+-#include <kvm.h>
+-#include <stdio.h>
++#include <err.h>
+ #include <errno.h>
+ #include <fcntl.h>
++#include <kvm.h>
+ #include <limits.h>
+-#include <sys/time.h>
+-#include <sys/param.h>
++#include <stdio.h>
++#include <syslog.h>
+ #include <sys/dkstat.h>
++#include <sys/param.h>
+ #include <sys/sysctl.h>
++#include <sys/time.h>
+ #include <sys/utsname.h>
+
+ /**
* @desc Get statistics
*/
- void getstats(unsigned long *puptime, double *pload, int *pidle, char *os, char *oslevel, char *cpu) {
-- struct utsname uts;
-- struct timeval boottime;
-- time_t now;
- size_t size;
-- double loadavgs[2];
- int mib[2];
-
-- /* Get uptime */
-- time(&now);
+-void getstats(unsigned long *puptime, double *pload, int *pidle, char *os, char *oslevel, char *cpu) {
+- struct utsname uts;
+- struct timeval boottime;
++void
++getstats(unsigned long *puptime, double *pload, int *pidle,
++ char *os, char *oslevel, char *cpu)
++{
++ size_t size;
++ int mib[2];
++
+ { /* ========== uptime ========== */
+ static struct timeval boottime;
+ static int initialized = 0;
-+ time_t now;
+ time_t now;
+- size_t size;
+- double loadavgs[2];
+- int mib[2];
+-
+- /* Get uptime */
+- time(&now);
+- mib[0] = CTL_KERN;
+- mib[1] = KERN_BOOTTIME;
+- size = sizeof(boottime);
+- if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && (boottime.tv_sec != 0)) {
+- *puptime = now - boottime.tv_sec;
+- *puptime /= 60;
+- }
+-
+- if (cfg_sendload) {
+- /* Get load average */
+- getloadavg(loadavgs, 3);
+- /* Use the 3rd element (15 minute load average) */
+- *pload = loadavgs[2];
+- }
+-
+- if (cfg_sendos) {
+- /* Get os info */
+- uname(&uts);
+- }
+-
+- if (cfg_sendcpu) {
+- /* Get CPU info */
+- mib[0] = CTL_HW;
+- if (cfg_sendcpulevel == 1) {
+- mib[1] = HW_MACHINE; /* Send architecture */
+- }
+- else {
+- mib[1] = HW_MODEL; /* Send architecture's specific model */
+- }
+- size = CPU_SIZE;
+- sysctl(mib, 2, cpu, &size, NULL, 0);
+- }
+-
+- if (cfg_sendos) {
+- strncpy(os, uts.sysname, OS_SIZE - 1);
+- if (cfg_sendoslevel) {
+- strncpy(oslevel, uts.release, OSLEVEL_SIZE - 1);
+- }
+- }
+-
+- if (cfg_sendidle) {
+- static kvm_t *kp;
+- static int initialized = 0;
+- static struct nlist namelist [] = {
+
+ if (!initialized) {
+ initialized = 1;
+
- mib[0] = CTL_KERN;
- mib[1] = KERN_BOOTTIME;
- size = sizeof(boottime);
-- if(sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && (boottime.tv_sec != 0)) {
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_BOOTTIME;
++ size = sizeof(boottime);
+
-+ if (sysctl (mib, 2, &boottime, &size, NULL, 0) == -1)
-+ err (1, "sysctl: kern.boottime");
++ if (sysctl(mib, 2, &boottime, &size, NULL, 0) == -1) {
++ uplog(LOG_ERR, "sysctl: kern.boottime");
++ err(1, "sysctl: kern.boottime");
++ }
+ }
+
+ if (boottime.tv_sec) {
@@ -35,52 +110,43 @@
+
+ time (&now);
+
- *puptime = now - boottime.tv_sec;
- *puptime /= 60;
- }
++ *puptime = now - boottime.tv_sec;
++ *puptime /= 60;
++ }
+ }
+
-+ if(cfg_sendload) { /* ========== loadavg ========== */
++ if (cfg_sendload) { /* ========== loadavg ========== */
+ double loadavgs[3] = { 0. };
-
-- if(cfg_sendload) {
-- /* Get load average */
- getloadavg(loadavgs, 3);
- /* Use the 3rd element (15 minute load average) */
- *pload = loadavgs[2];
- }
-
-- if(cfg_sendos) {
-- /* Get os info */
-- uname(&uts);
-- }
-+ if(cfg_sendcpu) { /* ========== cpu ========== */
-+ static char buf [CPU_SIZE] = "";
++
++ getloadavg(loadavgs, 3);
++ /* Use the 3rd element (15 minute load average) */
++ *pload = loadavgs[2];
++ }
++
++ if (cfg_sendcpu) { /* ========== cpu ========== */
++ static char buf[CPU_SIZE] = "";
+ static int initialized = 0;
+
+ if (!initialized) {
+ initialized = 1;
-
-- if(cfg_sendcpu) {
-- /* Get CPU info */
- mib[0] = CTL_HW;
- if(cfg_sendcpulevel == 1) {
- mib[1] = HW_MACHINE; /* Send architecture */
-@@ -64,17 +77,35 @@
- mib[1] = HW_MODEL; /* Send architecture's specific model */
- }
- size = CPU_SIZE;
-- sysctl(mib, 2, cpu, &size, NULL, 0);
+
-+ if (sysctl (mib, 2, buf, &size, NULL, 0) == -1)
-+ warn ("sysctl: hw.model");
++ mib[0] = CTL_HW;
++ if (cfg_sendcpulevel == 1)
++ mib[1] = HW_MACHINE; /* Send architecture */
++ else
++ mib[1] = HW_MODEL; /* Send architecture's specific model */
++ size = CPU_SIZE;
++
++ if (sysctl(mib, 2, buf, &size, NULL, 0) == -1) {
++ uplog(LOG_WARNING, "sysctl: hw.model");
++ /* warn("sysctl: hw.model"); */
++ }
+ }
+
-+ strncpy (cpu, buf, CPU_SIZE);
-+ cpu [CPU_SIZE - 1] = 0;
- }
-
- if(cfg_sendos) {
++ strlcpy(cpu, buf, CPU_SIZE);
++ }
++
++ if (cfg_sendos) {
+ static struct utsname uts;
+ static int initialized = 0;
+
@@ -90,17 +156,139 @@
+ uname(&uts);
+ }
+
- strncpy(os, uts.sysname, OS_SIZE - 1);
-+ os [OS_SIZE - 1] = 0;
++ strlcpy(os, uts.sysname, OS_SIZE);
++
++ if (cfg_sendoslevel)
++ strlcpy(oslevel, uts.release, OSLEVEL_SIZE);
++ }
+
- if(cfg_sendoslevel) {
- strncpy(oslevel, uts.release, OSLEVEL_SIZE - 1);
-+ oslevel [OSLEVEL_SIZE - 1] = 0;
++ if (cfg_sendidle) { /* ========== idle_time ========== */
++ static kvm_t *kp;
++ static int initialized = 0;
++ static struct nlist namelist[] = {
+ #define X_CP_TIME 0
+- { "_cp_time" },
+- { NULL },
+- };
+-
+- if (!initialized) {
+- char errbuf[_POSIX2_LINE_MAX];
+- initialized = 1;
+-
+- setgid(getgid());
+-
+- kp = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
+-
+- if (!kp) {
+- uplog(LOG_WARNING, "kvm_openfiles: %s. (Did you forget to start upclient as root?)", errbuf);
+-// warn("kvm_openfiles: %s", errbuf);
+- }
+- else if (kvm_nlist(kp,namelist) == -1) {
+- uplog(LOG_WARNING, "kvm_nlist: %s", kvm_geterr(kp));
+-// warn("kvm_nlist: %s", kvm_geterr(kp));
+- }
+- }
+-
+- if (kp) {
+- long ctime[CPUSTATES];
+- static long stime[CPUSTATES];
+- static int first_time = 1;
+-
+- if (first_time) {
+- first_time = 0;
+-
+- if (kvm_read(kp, namelist[X_CP_TIME].n_value, stime, sizeof(stime)) == -1) {
+- uplog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kp));
+-// warn("kvm_read: %s", kvm_geterr(kp));
+- }
+- else
+- sleep(1); /* to avoid the initial 0 idle value */
+- }
+-
+- if (kvm_read(kp, namelist[X_CP_TIME].n_value, ctime, sizeof(ctime)) == -1) {
+- uplog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kp));
+-// warn("kvm_read: %s", kvm_geterr(kp));
+- }
+- else {
+- int state;
+- double time = 0.;
+-
+- for(state = 0; state < CPUSTATES; state++)
+- time += ctime[state] - stime[state];
+-
+- if (time == 0.)
+- time = 1.;
+-
+- *pidle = (ctime[CP_IDLE] - stime[CP_IDLE]) * 100. / time;
+-
+- for(state = 0; state < CPUSTATES; state++)
+- stime[state] = ctime[state];
+- }
+- }
+- else {
+- cfg_sendidle = 0;
+- }
++ { "_cp_time" },
++ { NULL },
++ };
++
++ if (!initialized) {
++ char errbuf[_POSIX2_LINE_MAX];
++ initialized = 1;
++
++ setgid(getgid());
++
++ kp = kvm_openfiles(NULL,NULL,NULL,O_RDONLY,errbuf);
++
++ if (!kp) {
++ uplog(LOG_WARNING, "kvm_openfiles: %s",errbuf);
++ /* warn("kvm_openfiles: %s",errbuf); */
++ } else if (kvm_nlist(kp,namelist) == -1) {
++ uplog(LOG_WARNING, "kvm_nlist: %s",kvm_geterr(kp));
++ /* warn("kvm_nlist: %s",kvm_geterr(kp)); */
++ }
++ }
++
++ if (kp) {
++ long ctime[CPUSTATES];
++ static long stime[CPUSTATES];
++ static int first_time = 1;
++
++ if (first_time) {
++ first_time = 0;
++
++ if (kvm_read(kp, namelist[X_CP_TIME].n_value,
++ stime, sizeof(stime)) == -1) {
++ uplog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kp));
++ /* warn("kvm_read: %s", kvm_geterr(kp)); */
++ } else
++ sleep(1); /* to avoid the initial 0 idle value */
++ }
++
++ if (kvm_read(kp, namelist[X_CP_TIME].n_value,
++ ctime, sizeof(ctime)) == -1) {
++ uplog(LOG_WARNING, "kvm_read: %s", kvm_geterr(kp));
++ /* warn("kvm_read: %s", kvm_geterr(kp)); */
++ } else {
++ int state;
++ double time = 0.;
++
++ for (state = 0; state < CPUSTATES; state++)
++ time += ctime[state] - stime[state];
++
++ if (time == 0.)
++ time = 1.;
++
++ *pidle = (ctime[CP_IDLE] - stime[CP_IDLE]) * 100. / time;
++
++ for (state = 0; state < CPUSTATES; state++)
++ stime[state] = ctime[state];
++ }
++ } else {
++ cfg_sendidle = 0;
}
- }
-
-- if(cfg_sendidle) {
-+ if(cfg_sendidle) { /* ========== idle_time ========== */
- static kvm_t *kp;
- static int initialized = 0;
- static struct nlist namelist [] = {
++ }
+ }
+-#endif /* PLATFORM_BSD */
++
++#endif /* PLATFORM_BSD */