Make some of the linux-centric epplets work.

Submitted by: Chris McDermott <cmc@groupofnine.org>
Unresponsive: nakai
This commit is contained in:
Dan Moschuk 2001-08-11 20:18:19 +00:00
parent 60adc2eea9
commit 90246d357c
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=46092
5 changed files with 470 additions and 9 deletions

View file

@ -1,6 +1,70 @@
--- epplets/E-Load.c.orig Thu Jan 13 15:01:17 2000
+++ epplets/E-Load.c Thu Jan 13 15:01:37 2000
@@ -95,7 +95,7 @@
--- epplets/E-Load.c.orig Fri Nov 19 13:46:24 1999
+++ epplets/E-Load.c Fri Aug 3 18:45:55 2001
@@ -1,11 +1,17 @@
#include "config.h"
#include "epplet.h"
-#ifdef HAVE_LIBGTOP
+#ifdef __FreeBSD__
+
+#include <sys/sysctl.h>
+
+#elif defined(HAVE_LIBGTOP)
+
#include <glibtop.h>
#include <glibtop/loadavg.h>
#include <glibtop/cpu.h>
#include "proc.h"
+
#endif
int cpus = 0;
@@ -20,7 +26,22 @@
static void
cb_timer(void *data)
{
-#ifdef HAVE_LIBGTOP
+#ifdef __FreeBSD__
+
+ double val;
+
+ if(getloadavg(&val, 1) == -1)
+ return;
+
+ val *= 20;
+
+ if(val > 100)
+ val = 100;
+
+ load_val[0] = val;
+ Epplet_gadget_data_changed(load[0]);
+
+#elif defined(HAVE_LIBGTOP)
/* libgtop only handles total load, not per-CPU load */
@@ -89,13 +110,27 @@
int
count_cpus(void)
{
-#ifdef HAVE_LIBGTOP
+#ifdef __FreeBSD__
+
+ int ncpu, mib[2];
+ size_t size;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_NCPU;
+ size = sizeof(ncpu);
+
+ if(sysctl(mib, 2, &ncpu, &size, NULL, 0) == -1)
+ return 1;
+
+ return ncpu;
+
+#elif HAVE_LIBGTOP
int i,c = 0;
int bits;
glibtop_cpu cpu;
glibtop_get_cpu (&cpu);

View file

@ -1,6 +1,87 @@
--- epplets/E-Cpu.c.orig Thu Jan 13 15:06:17 2000
+++ epplets/E-Cpu.c Thu Jan 13 15:06:49 2000
@@ -328,7 +328,7 @@
--- epplets/E-Cpu.c.orig Wed Dec 29 06:08:09 1999
+++ epplets/E-Cpu.c Wed Aug 1 12:10:17 2001
@@ -7,10 +7,23 @@
#include "config.h"
#include "epplet.h"
-#ifdef HAVE_LIBGTOP
+#ifdef __FreeBSD__
+
+#include <sys/sysctl.h>
+#include <sys/dkstat.h>
+
+#ifndef KERN_CP_TIME
+#define KERN_CP_TIME 106
+#endif
+
+int cpu_old[CPUSTATES];
+
+#elif defined(HAVE_LIBGTOP)
+
#include <glibtop.h>
#include <glibtop/cpu.h>
#include "proc.h"
+
#endif
int cpus = 0;
@@ -201,7 +214,33 @@
static void
cb_timer(void *data)
{
-#ifdef HAVE_LIBGTOP
+#ifdef __FreeBSD__
+
+ int cpu_new[CPUSTATES];
+ int i, total, mib[2];
+ size_t cpu_size;
+ double val;
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_CP_TIME;
+ cpu_size = sizeof(cpu_new);
+
+ if(sysctl(mib, 2, cpu_new, &cpu_size, NULL, 0) == 0)
+ {
+ total=0;
+ for(i=0;i<CPUSTATES;i++)
+ total += cpu_new[i] - cpu_old[i];
+
+ val = 100.00 - (double)(cpu_new[CP_IDLE]-cpu_old[CP_IDLE])/total*100;
+
+ for(i=0;i<CPUSTATES;i++)
+ cpu_old[i] = cpu_new[i];
+
+ for(i=0;i<cpus;i++)
+ prev_val[i] = load_val[i] = val;
+ }
+
+#elif HAVE_LIBGTOP
glibtop_cpu cpu;
double val, val2;
@@ -322,13 +361,27 @@
static int
count_cpus(void)
{
-#ifdef HAVE_LIBGTOP
+#ifdef __FreeBSD__
+
+ int ncpu, mib[2];
+ size_t size;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_NCPU;
+ size = sizeof(ncpu);
+
+ if(sysctl(mib, 2, &ncpu, &size, NULL, 0) == -1)
+ return 1;
+
+ return ncpu;
+
+#elif defined(HAVE_LIBGTOP)
int i,c = 0;
int bits;
glibtop_cpu cpu;
glibtop_get_cpu (&cpu);

View file

@ -1,5 +1,5 @@
--- epplets/Makefile.in.orig Mon Jul 17 23:26:55 2000
+++ epplets/Makefile.in Mon Jul 17 23:32:29 2000
--- epplets/Makefile.in.orig Tue Jan 4 23:55:53 2000
+++ epplets/Makefile.in Fri Aug 10 13:38:45 2001
@@ -75,7 +75,7 @@
LD = @LD@
LDFLAGS = @LDFLAGS@
@ -80,7 +80,43 @@
# You can use the following command to generate this line:
# ABOUT_DOCS = `(cd epplets && ls -1d *.ABOUT/* 2>/dev/null | grep -v CVS)`
@@ -397,115 +397,115 @@
@@ -275,7 +275,7 @@
E_Time_epplet_OBJECTS = E-Time.o
E_Time_epplet_LDADD = $(LDADD)
E_Net_epplet_OBJECTS = E-Net.o net.o
-E_Net_epplet_LDADD = $(LDADD)
+E_Net_epplet_LDADD = $(LDADD) -lkvm
E_Cpu_epplet_OBJECTS = E-Cpu.o
E_Biff_epplet_OBJECTS = E-Biff.o mbox.o
E_Biff_epplet_LDADD = $(LDADD)
@@ -289,7 +289,7 @@
E_Magic_epplet_OBJECTS = E-Magic.o
E_Magic_epplet_LDADD = $(LDADD)
E_NetFlame_epplet_OBJECTS = E-NetFlame.o net.o
-E_NetFlame_epplet_LDADD = $(LDADD)
+E_NetFlame_epplet_LDADD = $(LDADD) -lkvm
E_Sys_epplet_OBJECTS = E-Sys.o
E_ScreenShoot_epplet_OBJECTS = E-ScreenShoot.o cloak.o utils.o
E_ScreenShoot_epplet_LDADD = $(LDADD)
@@ -306,7 +306,7 @@
E_ScreenSave_epplet_OBJECTS = E-ScreenSave.o cloak.o utils.o
E_ScreenSave_epplet_LDADD = $(LDADD)
E_NetGraph_epplet_OBJECTS = E-NetGraph.o net.o
-E_NetGraph_epplet_LDADD = $(LDADD)
+E_NetGraph_epplet_LDADD = $(LDADD) -lkvm
E_MoonClock_epplet_OBJECTS = E-MoonClock.o CalcEphem.o Moon.o
E_MoonClock_epplet_LDADD = $(LDADD)
E_UrlWatch_epplet_OBJECTS = E-UrlWatch.o utils.o
@@ -352,6 +352,8 @@
$(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
else :; fi; \
done
+ chgrp kmem $(bindir)/E-Net.epplet $(bindir)/E-NetFlame.epplet $(bindir)/E-NetGraph.epplet
+ chmod 2755 $(bindir)/E-Net.epplet $(bindir)/E-NetFlame.epplet $(bindir)/E-NetGraph.epplet
uninstall-binPROGRAMS:
@$(NORMAL_UNINSTALL)
@@ -397,115 +399,121 @@
maintainer-clean-libtool:
@ -128,6 +164,8 @@
+E-Net.epplet: $(E_Net_epplet_OBJECTS)
@rm -f E-Net.epplet
$(LINK) $(E_Net_epplet_LDFLAGS) $(E_Net_epplet_OBJECTS) $(E_Net_epplet_LDADD) $(LIBS)
+ @chgrp kmem E-Net.epplet
+ @chmod 2755 E-Net.epplet
-E-Cpu.epplet: $(E_Cpu_epplet_OBJECTS) $(E_Cpu_epplet_DEPENDENCIES)
+E-Cpu.epplet: $(E_Cpu_epplet_OBJECTS)
@ -168,6 +206,8 @@
+E-NetFlame.epplet: $(E_NetFlame_epplet_OBJECTS)
@rm -f E-NetFlame.epplet
$(LINK) $(E_NetFlame_epplet_LDFLAGS) $(E_NetFlame_epplet_OBJECTS) $(E_NetFlame_epplet_LDADD) $(LIBS)
+ @chgrp kmem E-NetFlame.epplet
+ @chmod 2755 E-NetFlame.epplet
-E-Sys.epplet: $(E_Sys_epplet_OBJECTS) $(E_Sys_epplet_DEPENDENCIES)
+E-Sys.epplet: $(E_Sys_epplet_OBJECTS)
@ -213,6 +253,8 @@
+E-NetGraph.epplet: $(E_NetGraph_epplet_OBJECTS)
@rm -f E-NetGraph.epplet
$(LINK) $(E_NetGraph_epplet_LDFLAGS) $(E_NetGraph_epplet_OBJECTS) $(E_NetGraph_epplet_LDADD) $(LIBS)
+ @chgrp kmem E-NetGraph.epplet
+ @chmod 2755 E-NetGraph.epplet
-E-MoonClock.epplet: $(E_MoonClock_epplet_OBJECTS) $(E_MoonClock_epplet_DEPENDENCIES)
+E-MoonClock.epplet: $(E_MoonClock_epplet_OBJECTS)

View file

@ -0,0 +1,36 @@
--- epplets/E-Net.c.orig Wed Aug 1 19:46:50 2001
+++ epplets/E-Net.c Wed Aug 1 19:52:34 2001
@@ -14,6 +14,7 @@
double upstream_max = 1540000;
double downstream_max = 1540000;
+char *netdev;
int up_val = 0;
int down_val = 0;
double up_last = 0;
@@ -34,7 +35,7 @@
double val = -1.0, val2 = -1.0, dval, dval2;
unsigned char invalid;
- invalid = net_get_bytes_inout("eth0", &val, &val2);
+ invalid = net_get_bytes_inout(netdev, &val, &val2);
if (invalid)
{
char err[255];
@@ -74,6 +75,7 @@
Epplet_modify_config("upstream_max", s);
Esnprintf(s, sizeof(s), "%f", downstream_max);
Epplet_modify_config("downstream_max", s);
+ Epplet_modify_config("device", netdev);
Epplet_save_config();
}
@@ -87,6 +89,8 @@
s = Epplet_query_config_def("downstream_max", "1540000");
downstream_max = (double)atof(s);
+
+ netdev = Epplet_query_config_def("device", "eth0");
}
static void

View file

@ -0,0 +1,238 @@
--- epplets/net.c.orig Tue Jul 31 23:50:29 2001
+++ epplets/net.c Fri Aug 10 14:54:32 2001
@@ -35,6 +35,22 @@
# include <kstat.h>
# include <sys/sysinfo.h>
#endif
+
+#ifdef __FreeBSD__
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#include <net/if_var.h>
+#include <netinet/in.h>
+#include <netinet/in_var.h>
+
+#include <kvm.h>
+#include <nlist.h>
+
+#endif
+
#include "epplet.h"
#include "net.h"
@@ -51,6 +67,18 @@
char buff[256], **names = NULL, *s;
unsigned long i;
+#ifdef __FreeBSD__
+
+ kvm_t *kd;
+ struct nlist magicsymbol[] = { {"_ifnet"}, {""} };
+ char name[32], type[16];
+ int num;
+ unsigned long ifnetaddr;
+ struct ifnet ifnet;
+ struct ifnethead ifnethead;
+
+#endif
+
names = (char **) malloc(sizeof(char *));
memset(names, 0, sizeof(char *));
@@ -80,6 +108,66 @@
return (names);
#elif defined(__sun__)
return ((char **) NULL);
+#elif defined(__FreeBSD__)
+
+ if((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) == NULL)
+ {
+ perror("kvm_open()");
+ return NULL;
+ }
+
+ if(kvm_nlist(kd, magicsymbol) == -1)
+ {
+ perror("kvm_nlist()");
+ kvm_close(kd);
+ return NULL;
+ }
+
+ if(kvm_read(kd, magicsymbol[0].n_value, &ifnethead, sizeof(ifnethead)) == -1)
+ {
+ perror("kread magic");
+ kvm_close(kd);
+ return NULL;
+ }
+
+ ifnetaddr = (unsigned long)TAILQ_FIRST(&ifnethead);
+
+ if(kvm_read(kd, ifnetaddr, &ifnet, sizeof(ifnet)) == -1)
+ {
+ perror("kvm_read ifnet\n");
+ kvm_close(kd);
+ return NULL;
+ }
+
+ num = 0;
+ while(ifnetaddr)
+ {
+ if(kvm_read(kd, ifnetaddr, &ifnet, sizeof(ifnet)) == -1 ||
+ kvm_read(kd, (long)ifnet.if_name, type, 16) == -1)
+ {
+ break;
+ }
+
+ type[15] = '\0';
+ ifnetaddr = (unsigned long)TAILQ_NEXT(&ifnet, if_link);
+
+ snprintf(name, 32, "%s%d", type, ifnet.if_unit);
+
+ if((names = (char **)realloc(names, (++num + 1)*sizeof(char *))) == NULL)
+ return NULL;
+
+ asprintf(&names[num-1], "%s", name);
+
+ names[num] = NULL;
+ }
+
+ kvm_close(kd);
+
+ if(count)
+ *count = num;
+
+ return names;
+
#else
return ((char **) NULL);
#endif
@@ -97,6 +185,21 @@
unsigned char match = 0;
FILE *fp;
char buff[256], *colon = NULL, dev[64], in_str[64], out_str[64];
+#elif defined(__FreeBSD__)
+
+ kvm_t *kd;
+ struct nlist magicsymbol[] = { {"_ifnet"}, {""} };
+ char name[32], tname[16];
+ int match, net_layer;
+ struct sockaddr *sa;
+ unsigned long ifaddraddr, ifnetaddr, ifnetfound;
+ struct ifnet ifnet;
+ struct ifnethead ifnethead;
+ union {
+ struct ifaddr ifa;
+ struct in_ifaddr in;
+ } ifaddr;
+
#endif
if (device == NULL) {
@@ -151,6 +254,104 @@
}
fclose(fp);
return ((match) ? (0) : (ENODEV));
+#elif defined(__FreeBSD__)
+
+ if((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL)) == NULL)
+ {
+ perror("kvm_open()");
+ return ENOENT;
+ }
+
+ if(kvm_nlist(kd, magicsymbol) == -1)
+ {
+ perror("kvm_nlist()");
+ kvm_close(kd);
+ return ENOENT;
+ }
+
+ if(kvm_read(kd, magicsymbol[0].n_value, &ifnethead, sizeof(ifnethead)) == -1)
+ {
+ perror("kread magic");
+ kvm_close(kd);
+ return ENOENT;
+ }
+
+ ifnetaddr = (unsigned long)TAILQ_FIRST(&ifnethead);
+
+ if(kvm_read(kd, ifnetaddr, &ifnet, sizeof(ifnet)) == -1)
+ {
+ perror("kvm_read ifnet\n");
+ kvm_close(kd);
+ return ENOENT;
+ }
+
+ ifaddraddr = 0;
+ while(ifnetaddr || ifaddraddr)
+ {
+ if(ifaddraddr == 0)
+ {
+ ifnetfound = ifnetaddr;
+ if(kvm_read(kd, ifnetaddr, &ifnet, sizeof(ifnet)) == -1 ||
+ kvm_read(kd, (long)ifnet.if_name, tname, 16) == -1)
+ {
+ perror("kread ifnet.if_name\n");
+ kvm_close(kd);
+ return ENOENT;
+ }
+
+ tname[15] = '\0';
+ ifnetaddr = (unsigned long)TAILQ_NEXT(&ifnet, if_link);
+ snprintf(name, 32, "%s%d", tname, ifnet.if_unit);
+
+ if(strncasecmp(name, device, 16) != 0)
+ continue;
+
+ ifaddraddr = (unsigned long)TAILQ_FIRST(&ifnet.if_addrhead);
+ }
+
+ *in_bytes = (double)ifnet.if_ibytes;
+ *out_bytes = (double)ifnet.if_obytes;
+
+ if(kvm_read(kd, ifaddraddr, &ifaddr, sizeof(ifaddr)) == -1)
+ {
+ printf("kread ifaddr\n");
+ ifaddraddr=0;
+ continue;
+ }
+
+ match = 1;
+
+ sa = (struct sockaddr *)((char *)ifaddr.ifa.ifa_addr -
+ (char *)ifaddraddr + (char *)&ifaddr);
+
+ switch(sa->sa_family)
+ {
+ case AF_INET:
+ net_layer = 1;
+ break;
+#ifdef AF_INET6
+ case AF_INET6:
+ net_layer = 1;
+ break;
+#endif
+ default:
+ net_layer = 0;
+ }
+
+ if(net_layer)
+ {
+ *in_bytes = (double)ifaddr.in.ia_ifa.if_ibytes;
+ *out_bytes = (double)ifaddr.in.ia_ifa.if_obytes;
+ }
+
+ break;
+ }
+
+ kvm_close(kd);
+
+ /* XXX: errno=ENODEV; return -1; ??? */
+ return (match ? 0 : ENODEV);
+
#else
/* Unsupported platform. */
if (in_bytes != NULL) {