summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAl 'netstar' Poole <netstar@gmail.com>2017-02-15 15:48:09 -0600
committerStephen 'Okra' Houston <smhouston88@gmail.com>2017-02-15 15:53:29 -0600
commit784ebcb18710c147004f749033fec579bc2b80d4 (patch)
treeecf490d5854484d559c0ef0ff74345bd4a824f16
parent6becc2b1796bad6f09264821259dcb8402a03b85 (diff)
downloadenlightenment-784ebcb18710c147004f749033fec579bc2b80d4.tar.gz
Sysinfo Gadgets: Add sysctl/bsd support to the remaining sysinfo gadgets.
These gadgets include cpumonitor, memusage, and netstatus
-rw-r--r--src/modules/Makefile_sysinfo.mk20
-rw-r--r--src/modules/sysinfo/cpumonitor/cpumonitor.c8
-rw-r--r--src/modules/sysinfo/cpumonitor/cpumonitor.h2
-rw-r--r--src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c140
-rw-r--r--src/modules/sysinfo/memusage/memusage.c6
-rw-r--r--src/modules/sysinfo/memusage/memusage.h8
-rw-r--r--src/modules/sysinfo/memusage/memusage_sysctl.c147
-rw-r--r--src/modules/sysinfo/netstatus/netstatus.c5
-rw-r--r--src/modules/sysinfo/netstatus/netstatus.h2
-rw-r--r--src/modules/sysinfo/netstatus/netstatus_sysctl.c203
10 files changed, 537 insertions, 4 deletions
diff --git a/src/modules/Makefile_sysinfo.mk b/src/modules/Makefile_sysinfo.mk
index ae2a95098c..e4af9a10f1 100644
--- a/src/modules/Makefile_sysinfo.mk
+++ b/src/modules/Makefile_sysinfo.mk
@@ -44,22 +44,34 @@ else
if HAVE_OPENBSD
src_modules_sysinfo_module_la_SOURCES += src/modules/sysinfo/batman/batman_sysctl.c \
src/modules/sysinfo/thermal/thermal_sysctl.c \
- src/modules/sysinfo/cpuclock/cpuclock_sysctl.c
+ src/modules/sysinfo/cpuclock/cpuclock_sysctl.c \
+ src/modules/sysinfo/netstatus/netstatus_sysctl.c \
+ src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c \
+ src/modules/sysinfo/memusage/memusage_sysctl.c
else
if HAVE_NETBSD
src_modules_sysinfo_module_la_SOURCES += src/modules/sysinfo/batman/batman_sysctl.c \
src/modules/sysinfo/thermal/thermal_sysctl.c \
- src/modules/sysinfo/cpuclock/cpuclock_sysctl.c
+ src/modules/sysinfo/cpuclock/cpuclock_sysctl.c \
+ src/modules/sysinfo/netstatus/netstatus_sysctl.c \
+ src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c \
+ src/modules/sysinfo/memusage/memusage_sysctl.c
else
if HAVE_DRAGONFLY
src_modules_sysinfo_module_la_SOURCES += src/modules/sysinfo/batman/batman_sysctl.c \
src/modules/sysinfo/thermal/thermal_sysctl.c \
- src/modules/sysinfo/cpuclock/cpuclock_sysctl.c
+ src/modules/sysinfo/cpuclock/cpuclock_sysctl.c \
+ src/modules/sysinfo/netstatus/netstatus_sysctl.c \
+ src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c \
+ src/modules/sysinfo/memusage/memusage_sysctl.c
else
if HAVE_FREEBSD
src_modules_sysinfo_module_la_SOURCES += src/modules/sysinfo/batman/batman_sysctl.c \
src/modules/sysinfo/thermal/thermal_sysctl.c \
- src/modules/sysinfo/cpuclock/cpuclock_sysctl.c
+ src/modules/sysinfo/cpuclock/cpuclock_sysctl.c \
+ src/modules/sysinfo/netstatus/netstatus_sysctl.c \
+ src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c \
+ src/modules/sysinfo/memusage/memusage_sysctl.c
else
src_modules_sysinfo_module_la_SOURCES += src/modules/sysinfo/batman/batman_upower.c \
src/modules/sysinfo/thermal/thermal_sysctl.c \
diff --git a/src/modules/sysinfo/cpumonitor/cpumonitor.c b/src/modules/sysinfo/cpumonitor/cpumonitor.c
index beb7bc3f3f..f0ea58673b 100644
--- a/src/modules/sysinfo/cpumonitor/cpumonitor.c
+++ b/src/modules/sysinfo/cpumonitor/cpumonitor.c
@@ -160,7 +160,11 @@ _cpumonitor_cb_usage_check_main(void *data, Ecore_Thread *th)
for (;;)
{
if (ecore_thread_check(th)) break;
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
+ _cpumonitor_sysctl_getusage(thc->inst);
+#else
_cpumonitor_proc_getusage(thc->inst);
+#endif
ecore_thread_feedback(th, NULL);
if (ecore_thread_check(th)) break;
usleep((1000000.0 / 8.0) * (double)thc->interval);
@@ -226,7 +230,11 @@ _cpumonitor_config_updated(Instance *inst)
{
thc->inst = inst;
thc->interval = inst->cfg->cpumonitor.poll_interval;
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
+ thc->cores = _cpumonitor_sysctl_getcores();
+#else
thc->cores = _cpumonitor_proc_getcores();
+#endif
for (i = 0; i < thc->cores; i++)
{
core = E_NEW(CPU_Core, 1);
diff --git a/src/modules/sysinfo/cpumonitor/cpumonitor.h b/src/modules/sysinfo/cpumonitor/cpumonitor.h
index ebbc00407a..3821140669 100644
--- a/src/modules/sysinfo/cpumonitor/cpumonitor.h
+++ b/src/modules/sysinfo/cpumonitor/cpumonitor.h
@@ -6,5 +6,7 @@
void _cpumonitor_config_updated(Instance *inst);
int _cpumonitor_proc_getcores(void);
void _cpumonitor_proc_getusage(Instance *inst);
+int _cpumonitor_sysctl_getcores(void);
+void _cpumonitor_sysctl_getusage(Instance *inst);
Evas_Object *cpumonitor_configure(Instance *inst);
#endif
diff --git a/src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c b/src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c
new file mode 100644
index 0000000000..8c3a53c74a
--- /dev/null
+++ b/src/modules/sysinfo/cpumonitor/cpumonitor_sysctl.c
@@ -0,0 +1,140 @@
+#include "cpumonitor.h"
+
+#if defined(__FreeBSD__) || defined (__DragonFly__)
+# include <sys/types.h>
+# include <sys/sysctl.h>
+# define CPU_STATES 5
+#endif
+
+#if defined(__OpenBSD__)
+# include <sys/sysctl.h>
+# define CPU_STATES 6
+#endif
+
+ int
+_cpumonitor_sysctl_getcores(void)
+{
+ int cores = 0;
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
+ size_t len;
+ int mib[2] = { CTL_HW, HW_NCPU };
+
+ len = sizeof(cores);
+ if (sysctl(mib, 2, &cores, &len, NULL, 0) < 0) return 0;
+#endif
+ return cores;
+}
+
+
+void
+_cpumonitor_sysctl_getusage(Instance *inst)
+{
+ CPU_Core *core;
+ size_t size;
+ unsigned long percent_all = 0, total_all = 0, idle_all = 0;
+ int i, j;
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+ int ncpu = _cpumonitor_sysctl_getcores();
+ if (!ncpu) return;
+ size = sizeof(long) * (CPU_STATES * ncpu);
+ long cpu_times[ncpu][CPU_STATES];
+
+ if (sysctlbyname("kern.cp_times", cpu_times, &size, NULL, 0) < 0)
+ return;
+
+ for (i = 0; i < ncpu; i++)
+ {
+ long *cpu = cpu_times[i];
+ double total = 0;
+
+ for (j = 0; j < CPU_STATES; j++)
+ total += cpu[j];
+
+ double used = total - (cpu[4]); // + cpu[2] + cpu[1] + cpu[0]);
+ double ratio = (float) total / 100.0;
+
+ double percent = ((double)used / (double)ratio);
+ if (percent > 100)
+ percent = 100;
+ else if (percent < 0)
+ percent = 0;
+
+ core = eina_list_nth(inst->cfg->cpumonitor.cores, i);
+ core->percent = (int) percent;
+ core->total = total;
+ core->idle = cpu[4];
+
+ percent_all += (int) percent;
+ total_all += total;
+ idle_all += core->idle;
+ }
+ inst->cfg->cpumonitor.total = total_all / ncpu;
+ inst->cfg->cpumonitor.idle = idle_all / ncpu;
+ inst->cfg->cpumonitor.percent = (int) (percent_all / ncpu);
+#elif defined(__OpenBSD__)
+ int ncpu = _cpumonitor_sysctl_getcores();
+ if (!ncpu) return;
+ if (ncpu == 1)
+ {
+ long cpu_times[CPU_STATES];
+ int cpu_time_mib[] = { CTL_KERN, KERN_CPTIME };
+ size = CPU_STATES * sizeof(long);
+ if (sysctl(cpu_time_mib, 2, &cpu_times, &size, NULL, 0) < 0)
+ return;
+
+ long total = 0;
+ for (j = 0; j < CPU_STATES; j++)
+ total += cpu_times[j];
+
+ //user", "nice", "system", "interrupt", "idle", NULL
+ long used = total - cpu_times[0] + cpu_times[1] + cpu_times[2] + cpu_times[3];
+ double ratio = (double) total / 100.0;
+ double percent = 100.0 - ((double) used / (double) ratio);
+ if (percent > 100)
+ percent = 100;
+ else if (percent < 0)
+ percent = 0;
+
+ inst->cfg->cpumonitor.total = total;
+ inst->cfg->cpumonitor.idle = cpu_times[3];
+ inst->cfg->cpumonitor.percent = (int) percent;
+ }
+ else if (ncpu > 1)
+ {
+ for (i = 0; i < ncpu; i++)
+ {
+ long cpu_times[CPU_STATES];
+ size = CPU_STATES * sizeof(long);
+ int cpu_time_mib[] = { CTL_KERN, KERN_CPTIME2, 0 };
+ cpu_time_mib[2] = i;
+ if (sysctl(cpu_time_mib, 3, &cpu_times, &size, NULL, 0) < 0)
+ return;
+
+ long total = 0;
+ for (j = 0; j < CPU_STATES - 1; j++)
+ total += cpu_times[j];
+
+ long used = total - (cpu_times[4]);
+ double ratio = (float) total / 100.0;
+ int percent = used / ratio;
+ if (percent > 100)
+ percent = 100;
+ else if (percent < 0)
+ percent = 0;
+ core = eina_list_nth(inst->cfg->cpumonitor.cores, i);
+ core->percent = (int) percent;
+ core->total = total;
+ core->idle = cpu_times[4];
+
+ percent_all += (int) percent;
+ total_all += total;
+ idle_all += core->idle;
+ }
+
+ inst->cfg->cpumonitor.total = total_all / ncpu;
+ inst->cfg->cpumonitor.idle = idle_all / ncpu;
+ inst->cfg->cpumonitor.percent = (percent_all / ncpu) + (percent_all % ncpu);
+ }
+#endif
+}
+
diff --git a/src/modules/sysinfo/memusage/memusage.c b/src/modules/sysinfo/memusage/memusage.c
index 0260d4d7f4..ef44cffa6a 100644
--- a/src/modules/sysinfo/memusage/memusage.c
+++ b/src/modules/sysinfo/memusage/memusage.c
@@ -275,9 +275,15 @@ _memusage_cb_usage_check_main(void *data, Ecore_Thread *th)
for (;;)
{
if (ecore_thread_check(th)) break;
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
+ _memusage_sysctl_getusage(&thc->mem_total, &thc->mem_used,
+ &thc->mem_cached, &thc->mem_buffers, &thc->mem_shared,
+ &thc->swp_total, &thc->swp_used);
+#else
_memusage_proc_getusage(&thc->mem_total, &thc->mem_used,
&thc->mem_cached, &thc->mem_buffers, &thc->mem_shared,
&thc->swp_total, &thc->swp_used);
+#endif
if (thc->mem_total > 0)
thc->mem_percent = 100 * ((float)thc->mem_used / (float)thc->mem_total);
if (thc->swp_total > 0)
diff --git a/src/modules/sysinfo/memusage/memusage.h b/src/modules/sysinfo/memusage/memusage.h
index 7788cf2294..4088daa21e 100644
--- a/src/modules/sysinfo/memusage/memusage.h
+++ b/src/modules/sysinfo/memusage/memusage.h
@@ -14,4 +14,12 @@ void _memusage_proc_getusage(unsigned long *mem_total,
unsigned long *swp_total,
unsigned long *swp_used);
+void _memusage_sysctl_getusage(unsigned long *mem_total,
+ unsigned long *mem_used,
+ unsigned long *mem_cached,
+ unsigned long *mem_buffers,
+ unsigned long *mem_shared,
+ unsigned long *swp_total,
+ unsigned long *swp_used);
+
#endif
diff --git a/src/modules/sysinfo/memusage/memusage_sysctl.c b/src/modules/sysinfo/memusage/memusage_sysctl.c
new file mode 100644
index 0000000000..1694861d5c
--- /dev/null
+++ b/src/modules/sysinfo/memusage/memusage_sysctl.c
@@ -0,0 +1,147 @@
+#include "memusage.h"
+
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+# include <sys/types.h>
+# include <sys/sysctl.h>
+# include <vm/vm_param.h>
+#endif
+
+#if defined(__OpenBSD__)
+# include <sys/param.h>
+# include <sys/sysctl.h>
+# include <sys/swap.h>
+# include <sys/mount.h>
+#endif
+
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+static long int
+_sysctlfromname(const char *name, void *mib, int depth, size_t *len)
+{
+ long int result;
+
+ if (sysctlnametomib(name, mib, len) < 0) return -1;
+
+ *len = sizeof(result);
+ if (sysctl(mib, depth, &result, len, NULL, 0) < 0) return -1;
+
+ return result;
+}
+#endif
+
+void _memusage_sysctl_getusage(unsigned long *mem_total,
+ unsigned long *mem_used,
+ unsigned long *mem_cached,
+ unsigned long *mem_buffers,
+ unsigned long *mem_shared,
+ unsigned long *swp_total,
+ unsigned long *swp_used)
+{
+ size_t len;
+ int i = 0;
+ *mem_total = *mem_used = *mem_cached = *mem_buffers = *mem_shared = 0;
+ *swp_total = *swp_used = 0;
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+ int total_pages = 0, free_pages = 0, inactive_pages = 0;
+ long int result = 0;
+ int page_size = getpagesize();
+
+ int *mib = malloc(sizeof(int) * 4);
+ if (mib == NULL) return;
+
+ mib[0] = CTL_HW; mib[1] = HW_PHYSMEM;
+ len = sizeof(*mem_total);
+ if (sysctl(mib, 2, mem_total, &len, NULL, 0) == -1)
+ return;
+ *mem_total /= 1024;
+
+ total_pages = _sysctlfromname("vm.stats.vm.v_page_count", mib, 4, &len);
+ if (total_pages < 0) return;
+
+ free_pages = _sysctlfromname("vm.stats.vm.v_free_count", mib, 4, &len);
+ if (free_pages < 0) return;
+
+ inactive_pages = _sysctlfromname("vm.stats.vm.v_inactive_count", mib, 4, &len);
+ if (inactive_pages < 0) return;
+
+ *mem_used = (total_pages - free_pages - inactive_pages) * page_size >> 10;
+
+ result = _sysctlfromname("vfs.bufspace", mib, 2, &len);
+ if (result < 0) return;
+ *mem_buffers = (result / 1024);
+
+ result = _sysctlfromname("vm.stats.vm.v_active_count", mib, 4, &len);
+ if (result < 0) return;
+ *mem_cached = ((result * page_size) / 1024);
+
+ result = _sysctlfromname("vm.stats.vm.v_cache_count", mib, 4, &len);
+ if (result < 0) return;
+ *mem_shared = (result * page_size) / 1024;
+
+ result = _sysctlfromname("vm.swap_total", mib, 2, &len);
+ if (result < 0) return;
+ *swp_total = (result / 1024);
+
+ struct xswdev xsw;
+ // previous mib is important for this one...
+
+ while (i++)
+ {
+ mib[2] = i;
+ len = sizeof(xsw);
+ if (sysctl(mib, 3, &xsw, &len, NULL, 0) == -1) break;
+
+ *swp_used += xsw.xsw_used * page_size;
+ }
+
+ *swp_used >>= 10;
+
+ free(mib);
+#elif defined(__OpenBSD__)
+ static int mib[] = { CTL_HW, HW_PHYSMEM64 };
+ static int bcstats_mib[] = { CTL_VFS, VFS_GENERIC, VFS_BCACHESTAT };
+ struct bcachestats bcstats;
+ static int uvmexp_mib[] = { CTL_VM, VM_UVMEXP };
+ struct uvmexp uvmexp;
+ int nswap, rnswap;
+ struct swapent *swdev = NULL;
+
+ len = sizeof(*mem_total);
+ if (sysctl(mib, 2, mem_total, &len, NULL, 0) == -1)
+ return;
+
+ len = sizeof(uvmexp);
+ if (sysctl(uvmexp_mib, 2, &uvmexp, &len, NULL, 0) == -1)
+ return;
+
+ len = sizeof(bcstats);
+ if (sysctl(bcstats_mib, 3, &bcstats, &len, NULL, 0) == -1)
+ return;
+
+ // Don't fail if there's not swap!
+ nswap = swapctl(SWAP_NSWAP, 0, 0);
+ if (nswap == 0) goto swap_out;
+
+ swdev = calloc(nswap, sizeof(*swdev));
+ if (swdev == NULL) goto swap_out;
+
+ rnswap = swapctl(SWAP_STATS, swdev, nswap);
+ if (rnswap == -1) goto swap_out;
+
+ for (i = 0; i < nswap; i++)// nswap; i++)
+ {
+ if (swdev[i].se_flags & SWF_ENABLE)
+ {
+ *swp_used += (swdev[i].se_inuse / (1024 / DEV_BSIZE));
+ *swp_total += (swdev[i].se_nblks / (1024 / DEV_BSIZE));
+ }
+ }
+swap_out:
+ if (swdev) free(swdev);
+
+ *mem_total /= 1024;
+ *mem_cached = (uvmexp.pagesize * bcstats.numbufpages) / 1024;
+ *mem_used = (uvmexp.active * uvmexp.pagesize) / 1024 ;
+ *mem_buffers = (uvmexp.pagesize * (uvmexp.npages - uvmexp.free)) / 1024;
+ *mem_shared = (uvmexp.pagesize * uvmexp.wired) / 1024;
+#endif
+}
diff --git a/src/modules/sysinfo/netstatus/netstatus.c b/src/modules/sysinfo/netstatus/netstatus.c
index b5ebf836df..ce1494bb15 100644
--- a/src/modules/sysinfo/netstatus/netstatus.c
+++ b/src/modules/sysinfo/netstatus/netstatus.c
@@ -128,8 +128,13 @@ _netstatus_cb_usage_check_main(void *data, Ecore_Thread *th)
for (;;)
{
if (ecore_thread_check(th)) break;
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
+ _netstatus_sysctl_getrstatus(thc->inst);
+ _netstatus_sysctl_gettstatus(thc->inst);
+#else
_netstatus_proc_getrstatus(thc->inst);
_netstatus_proc_gettstatus(thc->inst);
+#endif
ecore_thread_feedback(th, NULL);
if (ecore_thread_check(th)) break;
usleep((1000000.0 / 8.0) * (double)thc->interval);
diff --git a/src/modules/sysinfo/netstatus/netstatus.h b/src/modules/sysinfo/netstatus/netstatus.h
index 5f1772ed85..3b21ec4f35 100644
--- a/src/modules/sysinfo/netstatus/netstatus.h
+++ b/src/modules/sysinfo/netstatus/netstatus.h
@@ -19,5 +19,7 @@ struct _Netstatus_Config
void _netstatus_config_updated(Instance *inst);
void _netstatus_proc_getrstatus(Instance *inst);
void _netstatus_proc_gettstatus(Instance *inst);
+void _netstatus_sysctl_getrstatus(Instance *inst);
+void _netstatus_sysctl_gettstatus(Instance *inst);
Evas_Object *netstatus_configure(Instance *inst);
#endif
diff --git a/src/modules/sysinfo/netstatus/netstatus_sysctl.c b/src/modules/sysinfo/netstatus/netstatus_sysctl.c
new file mode 100644
index 0000000000..e37b8af95d
--- /dev/null
+++ b/src/modules/sysinfo/netstatus/netstatus_sysctl.c
@@ -0,0 +1,203 @@
+#include "netstatus.h"
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+# include <sys/socket.h>
+# include <sys/sysctl.h>
+# include <net/if.h>
+# include <net/if_mib.h>
+#endif
+
+#if defined(__OpenBSD__)
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <sys/sysctl.h>
+# include <sys/sockio.h>
+# include <sys/ioctl.h>
+# include <net/if.h>
+# include <net/if_types.h>
+# include <ifaddrs.h>
+#endif
+
+#if defined(__FreeBSD__) || defined(__DragonFly__)
+
+static int
+get_ifmib_general(int row, struct ifmibdata *data)
+{
+ int mib[6];
+ size_t len;
+
+ mib[0] = CTL_NET;
+ mib[1] = PF_LINK;
+ mib[2] = NETLINK_GENERIC;
+ mib[3] = IFMIB_IFDATA;
+ mib[4] = row;
+ mib[5] = IFDATA_GENERAL;
+
+ len = sizeof(*data);
+
+ return sysctl(mib, 6, data, &len, NULL, 0);
+}
+
+static void
+_freebsd_generic_network_status(unsigned long int *in, unsigned long int *out)
+{
+ struct ifmibdata *ifmd;
+ size_t len;
+ int i, count;
+
+ len = sizeof(count);
+ if (sysctlbyname("net.link.generic.system.ifcount", &count, &len, NULL, 0) < 0)
+ return;
+
+ ifmd = malloc(sizeof(struct ifmibdata));
+ if (!ifmd)
+ return;
+
+ for (i = 1; i <= count; i++)
+ {
+ get_ifmib_general(i, ifmd);
+ *in += ifmd->ifmd_data.ifi_ibytes;
+ *out += ifmd->ifmd_data.ifi_obytes;
+ }
+
+ free(ifmd);
+}
+
+#endif
+
+#if defined(__OpenBSD__)
+static void
+_openbsd_generic_network_status(unsigned long int *in, unsigned long int *out)
+{
+ struct ifaddrs *interfaces, *ifa;
+
+ if (getifaddrs(&interfaces) < 0)
+ return;
+
+ int sock = socket(AF_INET, SOCK_STREAM, 0);
+ if (sock < 0)
+ return;
+
+ for (ifa = interfaces; ifa; ifa = ifa->ifa_next)
+ {
+ struct ifreq ifreq;
+ struct if_data if_data;
+
+ ifreq.ifr_data = (void *)&if_data;
+ strncpy(ifreq.ifr_name, ifa->ifa_name, IFNAMSIZ-1);
+ if (ioctl(sock, SIOCGIFDATA, &ifreq) < 0)
+ return;
+
+ struct if_data * const ifi = &if_data;
+ if (ifi->ifi_type == IFT_ETHER || ifi->ifi_type == IFT_IEEE80211)
+ {
+ if (ifi->ifi_ibytes)
+ *in += ifi->ifi_ibytes;
+ else
+ *in += 0;
+
+ if (ifi->ifi_obytes)
+ *out += ifi->ifi_obytes;
+ else
+ *out += 0;
+ }
+ }
+ close(sock);
+}
+#endif
+
+void
+_netstatus_sysctl_getrstatus(Instance *inst)
+{
+ char rin[256];
+ long tot_in = 0, diffin;
+ int percent = 0;
+ unsigned long int incoming = 0, outgoing = 0;
+#if defined(__OpenBSD__)
+ _openbsd_generic_network_status(&incoming, &outgoing);
+#elif defined(__FreeBSD__) || defined(__DragonFly__)
+ _freebsd_generic_network_status(&incoming, &outgoing);
+#endif
+
+ tot_in = incoming;
+ diffin = tot_in - inst->cfg->netstatus.in;
+ if (!inst->cfg->netstatus.in)
+ inst->cfg->netstatus.in = tot_in;
+ else
+ {
+ inst->cfg->netstatus.in = tot_in;
+ if (inst->cfg->netstatus.automax)
+ {
+ if (diffin > inst->cfg->netstatus.inmax)
+ inst->cfg->netstatus.inmax = diffin;
+ }
+ inst->cfg->netstatus.incurrent = diffin;
+ if (inst->cfg->netstatus.inmax > 0)
+ percent = 100 * ((float)inst->cfg->netstatus.incurrent / (float)inst->cfg->netstatus.inmax);
+ if (percent > 100) percent = 100;
+ else if (percent < 0) percent = 0;
+ inst->cfg->netstatus.inpercent = percent;
+ }
+ if (!diffin)
+ {
+ snprintf(rin, sizeof(rin), "%s: 0 B/s", _("Receiving"));
+ }
+ else
+ {
+ if (diffin > 1048576)
+ snprintf(rin, sizeof(rin), "%s: %.2f MB/s", _("Receiving"), ((float)diffin / 1048576));
+ else if ((diffin > 1024) && (diffin < 1048576))
+ snprintf(rin, sizeof(rin), "%s: %lu KB/s", _("Receiving"), (diffin / 1024));
+ else
+ snprintf(rin, sizeof(rin), "%s: %lu B/s", _("Receiving"), diffin);
+ }
+ eina_stringshare_replace(&inst->cfg->netstatus.instring, rin);
+}
+
+void
+_netstatus_sysctl_gettstatus(Instance *inst)
+{
+ char rout[256];
+ long tot_out = 0, diffout;
+ int percent = 0;
+ unsigned long int incoming = 0, outgoing = 0;
+#if defined(__OpenBSD__)
+ _openbsd_generic_network_status(&incoming, &outgoing);
+#elif defined(__FreeBSD__) || defined(__DragonFly__)
+ _freebsd_generic_network_status(&incoming, &outgoing);
+#endif
+ tot_out = outgoing;
+
+ diffout = tot_out - inst->cfg->netstatus.out;
+ if (!inst->cfg->netstatus.out)
+ inst->cfg->netstatus.out = tot_out;
+ else
+ {
+ inst->cfg->netstatus.out = tot_out;
+ if (inst->cfg->netstatus.automax)
+ {
+ if (diffout > inst->cfg->netstatus.outmax)
+ inst->cfg->netstatus.outmax = diffout;
+ }
+ inst->cfg->netstatus.outcurrent = diffout;
+ if (inst->cfg->netstatus.outcurrent > 0)
+ percent = 100 * ((float)inst->cfg->netstatus.outcurrent / (float)inst->cfg->netstatus.outmax);
+ if (percent > 100) percent = 100;
+ else if (percent < 0) percent = 0;
+ inst->cfg->netstatus.outpercent = percent;
+ }
+ if (!diffout)
+ {
+ snprintf(rout, sizeof(rout), "%s: 0 B/s", _("Sending"));
+ }
+ else
+ {
+ if (diffout > 1048576)
+ snprintf(rout, sizeof(rout), "%s: %.2f MB/s", _("Sending"), ((float)diffout / 1048576));
+ else if ((diffout > 1024) && (diffout < 1048576))
+ snprintf(rout, sizeof(rout), "%s: %lu KB/s", _("Sending"), (diffout / 1024));
+ else
+ snprintf(rout, sizeof(rout), "%s: %lu B/s", _("Sending"), diffout);
+ }
+ eina_stringshare_replace(&inst->cfg->netstatus.outstring, rout);
+}
+