diff options
author | Tilman Keskinoz <arved@FreeBSD.org> | 2003-01-13 17:44:54 +0000 |
---|---|---|
committer | Tilman Keskinoz <arved@FreeBSD.org> | 2003-01-13 17:44:54 +0000 |
commit | fdc0747a9cc18b11f0814cb7e399ef648b7c3953 (patch) | |
tree | 7b7166589da2ecfd0a3e7a6efcb97328e1d91663 /sysutils/asmon | |
parent | Update to 0.18. (diff) |
Fix Build on -CURRENT
Submitted by: hiten pandya <hiten@uk.FreeBSD.org>
Notes
Notes:
svn path=/head/; revision=73062
Diffstat (limited to 'sysutils/asmon')
-rw-r--r-- | sysutils/asmon/files/patch-aa | 577 | ||||
-rw-r--r-- | sysutils/asmon/files/patch-ab | 570 |
2 files changed, 576 insertions, 571 deletions
diff --git a/sysutils/asmon/files/patch-aa b/sysutils/asmon/files/patch-aa index 3fde759d3512..f2906e1d77ec 100644 --- a/sysutils/asmon/files/patch-aa +++ b/sysutils/asmon/files/patch-aa @@ -1,25 +1,552 @@ -*** Makefile.orig Tue Jun 8 15:54:04 1999 ---- Makefile Tue Jun 8 15:54:36 1999 -*************** -*** 0 **** ---- 1,20 ---- -+ LIBDIR = -L${X11BASE}/lib -+ LIBS = -lXpm -lXext -lX11 -lkvm -+ OBJS = asmon/asmon.o \ -+ wmgeneral/wmgeneral.o \ -+ wmgeneral/misc.o \ -+ wmgeneral/list.o -+ -+ all: asmon -+ -+ .c.o: -+ $(CC) $(CFLAGS) -c -Wall -I${X11BASE}/include $< -o $*.o -+ -+ asmon: $(OBJS) -+ $(CC) -o asmon/asmon $^ $(LIBDIR) $(LIBS) -+ -+ clean:: -+ for i in $(OBJS) ; do \ -+ rm $$i;\ -+ done -+ rm asmon/asmon +--- asmon/asmon.c Sun Jun 27 20:38:26 1999 ++++ asmon/asmon.c.new Sat Oct 26 06:26:34 2002 +@@ -21,6 +21,24 @@ + #include "asmon-master.xpm" + #include "asmon-mask.xbm" + ++#ifdef __FreeBSD__ ++#include <err.h> ++#include <kvm.h> ++#include <nlist.h> ++#include <sys/conf.h> ++#include <sys/proc.h> ++#include <sys/user.h> ++#include <sys/vmmeter.h> ++#include <sys/sysctl.h> ++#include <vm/vm.h> ++#include <vm/vm_map.h> ++#include <vm/vm_param.h> ++#include <sys/time.h> ++#if __FreeBSD_version < 400000 ++#include <sys/rlist.h> ++#endif ++#endif ++ + #ifdef __solaris__ + #include <utmp.h> + #endif +@@ -47,6 +65,56 @@ + #define B_RED (1) + #define B_GREEN (2) + ++#ifdef __FreeBSD__ ++kvm_t *kd; ++ ++#define SVAR(var) __STRING(var) /* to force expansion */ ++#define KGET(idx, var) \ ++ KGET1(idx, &var, sizeof(var), SVAR(var)) ++#define KGET1(idx, p, s, msg) \ ++ KGET2(nl[idx].n_value, p, s, msg) ++#define KGET2(addr, p, s, msg) \ ++ if (kvm_read(kd, (u_long)(addr), p, s) != s) \ ++ warnx("cannot read %s: %s", msg, kvm_geterr(kd)) ++ ++struct nlist nl[] = { ++#if __FreeBSD_version < 400000 ++#define VM_SWAPLIST 0 ++ { "_swaplist" },/* list of free swap areas */ ++#define VM_SWDEVT 1 ++ { "_swdevt" }, /* list of swap devices and sizes */ ++#define VM_NSWAP 2 ++ { "_nswap" }, /* size of largest swap device */ ++#define VM_NSWDEV 3 ++ { "_nswdev" }, /* number of swap devices */ ++#define VM_DMMAX 4 ++ { "_dmmax" }, /* maximum size of a swap block */ ++#define X_CNT 5 ++ { "_cnt" }, ++#define X_BUFSPACE 6 ++ { "_bufspace" }, /* K in buffer cache */ ++#define X_CP_TIME 7 ++ { "_cp_time" }, ++ { "" } ++}; ++#else ++#define X_CCPU 0 ++ { "_ccpu" }, ++#define X_CP_TIME 1 ++ { "_cp_time" }, ++#define X_AVENRUN 2 ++ { "_averunnable" }, ++#define X_BUFSPACE 3 ++ { "_bufspace" }, /* K in buffer cache */ ++#define X_CNT 4 ++ { "_cnt" }, /* struct vmmeter cnt */ ++#define X_LASTPID 5 ++ { "_nextpid" }, /* Last pid */ ++ { 0 } ++}; ++#endif ++#endif ++ + /* Evil globals I haven't removed yet */ + long last_pageins=0, last_pageouts=0; + long last_swapins=0, last_swapouts=0; +@@ -77,6 +145,11 @@ + float DrawMemSwap(float total, int allmem); + #endif + ++#ifdef __FreeBSD__ ++void open_kvm(void); ++void close_kvm(void); ++#endif ++ + int main(int argc, char *argv[]) + { + FILE *fp; +@@ -151,7 +224,17 @@ + #endif + /* Open 64x64 window */ + openXwindow(argc, argv, asmon_master_xpm, asmon_mask_bits, asmon_mask_width, asmon_mask_height); ++ ++#ifdef __FreeBSD__ ++ open_kvm(); ++#endif ++ + asmon_routine(Xpid, allmem); ++ ++#ifdef __FreeBSD__ ++ close_kvm(); ++#endif ++ + return(0); + } + +@@ -160,7 +243,11 @@ + void usage(void) { + fprintf(stderr, "\nasmon %s - by Brad Hall (brad@rio.dhs.org)\n\t\toriginally based on Timecop's wmcpu\n\n", ASMON_VERSION); + fprintf(stderr, "The top bar: left is the CPU usage, right is the load average\n"); ++#ifdef __FreeBSD__ ++ fprintf(stderr, "The middle bar: left memory usage devided by ticks into active, inactive,\n\t\twired, cached + buffers, respectively, and the number\n\t\tof megs used\n"); ++#else + fprintf(stderr, "The middle bar: left memory usage devided by ticks into shared, buffers, and\n\t\t cached, respectively, and the number of megs used\n"); ++#endif + fprintf(stderr, "The lower bar: the left swap usage and the number of megs swappedd avg\n"); + fprintf(stderr, "The bottom: the left is a set of LED's marking page's and swap's, the right is\n\t\t a bar representing the amount of memory that the X server \n\t\t is taking up, and the exact megs\n\n usage:\n"); + fprintf(stderr, "\t-display <display name>\n"); +@@ -168,8 +255,13 @@ + fprintf(stderr, "\t-v\tprint the version number\n"); + #ifndef __solaris__ + fprintf(stderr, "\t-u\tforce asmon to show uptime, rather than X mem use\n"); ++#else ++#ifdef __FreeBSD__ ++ fprintf(stderr, "\t-m\tmake asmon show only active mem\n"); ++#else + fprintf(stderr, "\t-m\tmake asmon show only shared mem, like most other mem meters\n"); + #endif ++#endif + #ifdef EXEC_ON_CLICK + fprintf(stderr, "\t-e cmd\texecute 'cmd' on mouse click\n"); + #endif +@@ -229,6 +321,10 @@ + #if 0 + fprintf(stderr,"system(%s)\n",Command); + #endif ++ if (setgid(getgid()) != 0) ++ err(1, "Can't drop setgid privileges."); ++ if (setuid(getuid()) != 0) ++ err(1, "Can't drop setuid privileges."); + if (Command[ 0 ]) system(Command); + break; + #endif +@@ -323,12 +419,13 @@ + /* CPU Usage Meter */ + void DrawCPU(void) + { +- FILE *fp; + static float cpustat[4]; /* remember the statistics read last time */ + float fields[4], info[4], cputotal=0.0; + long pageins=0, pageouts=0, swapins=0, swapouts=0; +- char buf[128]; + int i; ++#ifndef __FreeBSD__ ++ char buf[128]; ++ FILE *fp; + + if( (fp = fopen("/proc/stat", "r")) != NULL) + { +@@ -345,7 +442,15 @@ + sscanf(buf, "swap %ld %ld", &swapins, &swapouts); + } + fclose(fp); +- ++#else ++ { ++ long cputime[4]; ++ struct vmmeter sum; ++ ++ kvm_read(kd, nl[X_CP_TIME].n_value, &cputime, sizeof(cputime)); ++ for(i = 0; i < 4; i++) ++ info[i] = (float)cputime[i]; ++#endif + // Calculate CPU stuff + for(i = 0; i < 4; i++) + { +@@ -365,6 +470,13 @@ + } + + // Page In/Out ++#ifdef __FreeBSD__ ++ KGET(X_CNT, sum); ++ pageins = sum.v_vnodepgsin; ++ pageouts = sum.v_vnodepgsout; ++ swapins = sum.v_swappgsin; ++ swapouts = sum.v_swappgsout; ++#endif + if (pageins > last_pageins) + { + DrawLite(B_RED, 5, 48); +@@ -414,12 +526,19 @@ + #ifdef __solaris__ + if (getLoad(&ftmp) != -1) + { +-#else ++#else ++#ifndef __FreeBSD__ + FILE *fp; + if( (fp = fopen("/proc/loadavg", "r")) != NULL) + { + fscanf(fp, "%f", &ftmp); + fclose(fp); ++#else ++ { ++ double avg[1]; ++ getloadavg(avg, 1); ++ ftmp = (float)avg[0]; ++#endif + #endif + if(oldv != ftmp) + { +@@ -540,6 +659,7 @@ + /* Mem/Swap Meter */ + float DrawMemSwap(float total, int allmem) + { ++#ifndef __FreeBSD__ + FILE *fp; + if( (fp = fopen("/proc/meminfo", "r")) != NULL) + { +@@ -553,6 +673,149 @@ + fgets(junk, 80, fp); + fscanf(fp, "Mem: %f %f %f %f %f %f\nSwap: %f %f %f", &total, &used, &freeM, &shared, &buffers, &cached, &swaptotal, &swapused, &swapfreeM); + fclose(fp); ++#else ++ { ++ static float stotal=0.0, sshared=0.0, sbuffers=0.0, scached=0.0; ++#if __FreeBSD_version >= 400000 ++ float used, active, inactive, wired, buffers, cached, shared = 0; ++ static float swaptotal=0, swapused=0; ++ static u_int swappgsin= - 1, swappgsout = -1; ++ int n, bufspace = 0; ++ int pagesize = getpagesize(); ++ struct kvm_swap swapary[1]; ++#else ++ float used, active, inactive, wired, buffers, cached, swaptotal, ++ swapused, shared; ++ int nswap, nswdev, dmmax; ++ int i, avail, nfree, kmemused, bufspace = 0; ++ struct swdevt *sw; ++ long *perdev; ++ struct rlist head; ++ struct rlisthdr swaplist; ++ struct rlist *swapptr; ++ u_long ptr; ++#endif ++ struct vmmeter sum; ++ int tempy, tempa; ++ unsigned long MEMactive,MEMinactive,MEMwired,MEMbuff,MEMcach, MEMswap; ++ ++#if __FreeBSD_version >= 400000 ++#define CONVERT(v) ((quad_t)(v) * pagesize / 1024) ++ KGET(X_CNT, sum); ++ KGET(X_BUFSPACE, bufspace); ++ if(swappgsin < 0 || swappgsin != sum.v_swappgsin || ++ swappgsout != sum.v_swappgsout){ ++ n = kvm_getswapinfo(kd, swapary, 1, 0); ++ if (n < 0 || swapary[0].ksw_total == 0){ ++ swaptotal = 0; ++ swapused = 0; ++ } else { ++ swaptotal = CONVERT(swapary[0].ksw_total); ++ swapused = CONVERT(swapary[0].ksw_used); ++ swaptotal *= 1024; ++ swapused *= 1024; ++ } ++ swappgsin = sum.v_swappgsin; ++ swappgsout = sum.v_swappgsout; ++ } ++ total = sum.v_page_size * sum.v_page_count; ++ cached = sum.v_page_size * sum.v_cache_count; ++ used = sum.v_page_size * (sum.v_page_count - sum.v_free_count); ++ buffers = bufspace; ++ active = sum.v_page_size * sum.v_active_count; ++ inactive = sum.v_page_size * sum.v_inactive_count; ++ wired = sum.v_page_size * sum.v_wire_count; ++#else ++ KGET(VM_NSWAP, nswap); ++ KGET(VM_NSWDEV, nswdev); ++ KGET(VM_DMMAX, dmmax); ++ KGET1(VM_SWAPLIST, &swaplist, sizeof swaplist, "swaplist"); ++ if ((sw = (struct swdevt*)malloc(nswdev * sizeof(*sw))) == NULL || ++ (perdev = (long *)malloc(nswdev * sizeof(*perdev))) == NULL) ++ errx(1, "malloc"); ++ KGET1(VM_SWDEVT, &ptr, sizeof ptr, "swdevt"); ++ KGET2(ptr, sw, nswdev * sizeof(*sw), "*swdevt"); ++ ++ /* Count up swap space. */ ++ nfree = 0; ++ memset(perdev, 0, nswdev * sizeof(*perdev)); ++ swapptr = swaplist.rlh_list; ++ while (swapptr) { ++ int top, bottom, next_block; ++ ++ KGET2(swapptr, &head, sizeof(struct rlist), "swapptr"); ++ ++ top = head.rl_end; ++ bottom = head.rl_start; ++ ++ nfree += top - bottom + 1; ++ ++ /* ++ * Swap space is split up among the configured disks. ++ * ++ * For interleaved swap devices, the first dmmax blocks ++ * of swap space some from the first disk, the next dmmax ++ * blocks from the next, and so on up to nswap blocks. ++ * ++ * The list of free space joins adjacent free blocks, ++ * ignoring device boundries. If we want to keep track ++ * of this information per device, we'll just have to ++ * extract it ourselves. ++ */ ++ while (top / dmmax != bottom / dmmax) { ++ next_block = ((bottom + dmmax) / dmmax); ++ perdev[(bottom / dmmax) % nswdev] += ++ next_block * dmmax - bottom; ++ bottom = next_block * dmmax; ++ } ++ perdev[(bottom / dmmax) % nswdev] += ++ top - bottom + 1; ++ ++ swapptr = head.rl_next; ++ } ++ ++ avail = 0; ++ for (i = 0; i < nswdev; i++) { ++ int xsize, xfree; ++ ++ /* ++ * Don't report statistics for partitions which have not ++ * yet been activated via swapon(8). ++ */ ++ if (!(sw[i].sw_flags & SW_FREED)) ++ continue; ++ ++ /* The first dmmax is never allocated to avoid trashing of ++ * disklabels ++ */ ++ xsize = sw[i].sw_nblks - dmmax; ++ xfree = perdev[i]; ++ kmemused = xsize - xfree; ++ avail += xsize; ++ } ++ ++ /* ++ * If only one partition has been set up via swapon(8), we don't ++ * need to bother with totals. ++ */ ++ kmemused = avail - nfree; ++ KGET(X_CNT, sum); ++ KGET(X_BUFSPACE, bufspace); ++ free(sw); ++ free(perdev); ++ ++ swaptotal = avail * 512; ++ swapused = kmemused * 512; ++#endif ++ ++ total = sum.v_page_size * sum.v_page_count; ++ cached = sum.v_page_size * sum.v_cache_count; ++ used = sum.v_page_size * (sum.v_page_count - sum.v_free_count); ++ buffers = bufspace; ++ active = sum.v_page_size * sum.v_active_count; ++ inactive = sum.v_page_size * sum.v_inactive_count; ++ wired = sum.v_page_size * sum.v_wire_count; ++#endif + + if ( allmem == 1) { + /* All mem areas */ +@@ -561,11 +824,23 @@ + stotal = total; sshared = shared; sbuffers = buffers; scached = cached; + if ( (total/101048576) >= 1) + { ++#ifdef __FreeBSD__ ++ MEMactive=(active/total)*27; ++ MEMinactive=(inactive/total)*27; ++ MEMwired=(wired/total)*27; ++#else + MEMshar=(shared/total)*27; ++#endif + MEMbuff=(buffers/total)*27; + MEMcach=(cached/total)*27; + } else { ++#ifdef __FreeBSD__ ++ MEMactive=(active/total)*33; ++ MEMinactive=(inactive/total)*33; ++ MEMwired=(wired/total)*33; ++#else + MEMshar=(shared/total)*33; ++#endif + MEMbuff=(buffers/total)*33; + MEMcach=(cached/total)*33; + } +@@ -579,9 +854,15 @@ + copyXPMArea(3,75,((used/total)*34),9,5,19); + } + // Separators ++#ifdef __FreeBSD__ ++ copyXPMArea(15,105,1,9,5+MEMactive,19); ++ copyXPMArea(15,105,1,9,6+MEMactive+MEMinactive,19); ++ copyXPMArea(15,105,1,9,7+MEMactive+MEMinactive+MEMwired,19); ++#else + copyXPMArea(15,105,1,9,5+MEMshar,19); + copyXPMArea(15,105,1,9,7+MEMshar+MEMbuff,19); + copyXPMArea(15,105,(36-(used/total)*34),9,(5+(used/total)*34),19); ++#endif + // Numbers + tempa=used/1048576; + tempy=tempa%10; +@@ -601,6 +882,16 @@ + if(stotal != total || sshared != shared) + { + stotal = total; sshared = shared; sbuffers = buffers; scached = cached; ++#ifdef __FreeBSD__ ++ if ( (total/101048576) >= 1) { ++ MEMactive=(active/total)*27; ++ } else { ++ MEMactive=(active/total)*35; ++ } ++ // Bar ++ copyXPMArea(3,75,MEMactive,9,5,19); ++ copyXPMArea(3,102,(36-(active/total)*36),9,(5+(active/total)*36),19) ; ++#else + if ( (total/101048576) >= 1) { + MEMshar=(shared/total)*27; + } else { +@@ -609,8 +900,13 @@ + // Bar + copyXPMArea(3,75,MEMshar,9,5,19); + copyXPMArea(15,105,(36-(shared/total)*36),9,(5+(shared/total)*36),19); ++#endif + // Numbers ++#ifdef __FreeBSD__ ++ tempa=active/1048576; ++#else + tempa=shared/1048576; ++#endif + tempy=tempa%10; + copyXPMArea(3+(tempy*6),66,6,9,50,19); + tempy=(tempa/10)%10; +@@ -662,10 +957,11 @@ + /* X Mem Usage */ + void DrawXmem(int Xpid, float total) + { +- FILE *fp; +- char buf[128], XFileName[256]; + float ratio; + long old_Xsize=-1, Xsize=0; ++#ifndef __FreeBSD__ ++ FILE *fp; ++ char buf[128], XFileName[256]; + + sprintf(XFileName, "/proc/%d/status", Xpid); + +@@ -676,6 +974,18 @@ + if (strstr(buf, "VmSize")) + sscanf(buf, "VmSize: %ld", &Xsize); + } ++#else ++ { ++ struct kinfo_proc *kproc; ++ int kcnt; ++ ++ kproc = kvm_getprocs(kd, KERN_PROC_PID, Xpid, &kcnt); ++#if __FreeBSD_version < 500000 ++ Xsize = kproc->kp_eproc.e_vm.vm_map.size / 1024; ++#else ++ Xsize = kproc->ki_size / 1024; ++#endif ++#endif + if(old_Xsize!=Xsize) + { + int tempy, tempa; +@@ -692,7 +1002,9 @@ + copyXPMArea(3,84,((ratio)*22),11,18,47); + copyXPMArea(15,105,(23-((ratio)*22)),11,(18+(ratio*22)),47); + } ++#ifndef __FreeBSD__ + fclose(fp); ++#endif + } + } + +@@ -713,10 +1025,28 @@ + pUtmp = getutid(&idUtmp); + upt = (time(0) - pUtmp->ut_time); + #else ++#ifndef __FreeBSD__ + FILE *fp; + if( (fp = fopen("/proc/uptime", "r")) != NULL) + fscanf(fp, "%d",&upt); + fclose(fp); ++#else ++ int mib[2]; ++ struct timeval boottime; ++ size_t bt_size; ++ ++ bt_size = sizeof(boottime); ++ mib[0] = CTL_KERN; ++ mib[1] = KERN_BOOTTIME; ++ ++ if (sysctl(mib, 2, &boottime, &bt_size, NULL, 0) != -1 && ++ boottime.tv_sec != 0) { ++ upt = time(NULL) - boottime.tv_sec; ++ upt += 30; /* top(1) does this ???? */ ++ } else { ++ upt = 0; ++ } ++#endif + #endif + mins=(upt/60)%60; + hours=(upt/3600)%24; +@@ -777,6 +1107,31 @@ + break; + } + ++} ++ ++void ++open_kvm() ++{ ++ if (kd == 0) { ++ kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, 0); ++ if (kd != NULL) { ++ if (kvm_nlist(kd, nl) < 0) { ++ errx(1, "kvm_nlist: %s", kvm_geterr(kd)); ++ } ++ if (nl[0].n_type == 0) { ++ errx(1, "no namelist"); ++ } ++ } else { ++ warnx("kvm not available"); ++ } ++ } ++} ++ ++void ++close_kvm() ++{ ++ kvm_close(kd); ++ kd = NULL; + } + + /* EOF */ diff --git a/sysutils/asmon/files/patch-ab b/sysutils/asmon/files/patch-ab index 60e495ec4250..a331b5a3c60e 100644 --- a/sysutils/asmon/files/patch-ab +++ b/sysutils/asmon/files/patch-ab @@ -1,546 +1,24 @@ ---- asmon/asmon.c.orig Sun Jun 27 15:38:26 1999 -+++ asmon/asmon.c Sun Jul 16 16:30:18 2000 -@@ -21,6 +21,21 @@ - #include "asmon-master.xpm" - #include "asmon-mask.xbm" - -+#ifdef __FreeBSD__ -+#include <err.h> -+#include <kvm.h> -+#include <nlist.h> -+#include <sys/conf.h> -+#include <sys/user.h> -+#include <sys/vmmeter.h> -+#include <sys/sysctl.h> -+#include <vm/vm_param.h> -+#include <sys/time.h> -+#if __FreeBSD_version < 400000 -+#include <sys/rlist.h> -+#endif -+#endif -+ - #ifdef __solaris__ - #include <utmp.h> - #endif -@@ -47,6 +62,56 @@ - #define B_RED (1) - #define B_GREEN (2) - -+#ifdef __FreeBSD__ -+kvm_t *kd; -+ -+#define SVAR(var) __STRING(var) /* to force expansion */ -+#define KGET(idx, var) \ -+ KGET1(idx, &var, sizeof(var), SVAR(var)) -+#define KGET1(idx, p, s, msg) \ -+ KGET2(nl[idx].n_value, p, s, msg) -+#define KGET2(addr, p, s, msg) \ -+ if (kvm_read(kd, (u_long)(addr), p, s) != s) \ -+ warnx("cannot read %s: %s", msg, kvm_geterr(kd)) -+ -+struct nlist nl[] = { -+#if __FreeBSD_version < 400000 -+#define VM_SWAPLIST 0 -+ { "_swaplist" },/* list of free swap areas */ -+#define VM_SWDEVT 1 -+ { "_swdevt" }, /* list of swap devices and sizes */ -+#define VM_NSWAP 2 -+ { "_nswap" }, /* size of largest swap device */ -+#define VM_NSWDEV 3 -+ { "_nswdev" }, /* number of swap devices */ -+#define VM_DMMAX 4 -+ { "_dmmax" }, /* maximum size of a swap block */ -+#define X_CNT 5 -+ { "_cnt" }, -+#define X_BUFSPACE 6 -+ { "_bufspace" }, /* K in buffer cache */ -+#define X_CP_TIME 7 -+ { "_cp_time" }, -+ { "" } -+}; -+#else -+#define X_CCPU 0 -+ { "_ccpu" }, -+#define X_CP_TIME 1 -+ { "_cp_time" }, -+#define X_AVENRUN 2 -+ { "_averunnable" }, -+#define X_BUFSPACE 3 -+ { "_bufspace" }, /* K in buffer cache */ -+#define X_CNT 4 -+ { "_cnt" }, /* struct vmmeter cnt */ -+#define X_LASTPID 5 -+ { "_nextpid" }, /* Last pid */ -+ { 0 } -+}; -+#endif -+#endif -+ - /* Evil globals I haven't removed yet */ - long last_pageins=0, last_pageouts=0; - long last_swapins=0, last_swapouts=0; -@@ -77,6 +142,11 @@ - float DrawMemSwap(float total, int allmem); - #endif - -+#ifdef __FreeBSD__ -+void open_kvm(void); -+void close_kvm(void); -+#endif -+ - int main(int argc, char *argv[]) - { - FILE *fp; -@@ -151,7 +221,17 @@ - #endif - /* Open 64x64 window */ - openXwindow(argc, argv, asmon_master_xpm, asmon_mask_bits, asmon_mask_width, asmon_mask_height); -+ -+#ifdef __FreeBSD__ -+ open_kvm(); -+#endif -+ - asmon_routine(Xpid, allmem); -+ -+#ifdef __FreeBSD__ -+ close_kvm(); -+#endif -+ - return(0); - } - -@@ -160,7 +240,11 @@ - void usage(void) { - fprintf(stderr, "\nasmon %s - by Brad Hall (brad@rio.dhs.org)\n\t\toriginally based on Timecop's wmcpu\n\n", ASMON_VERSION); - fprintf(stderr, "The top bar: left is the CPU usage, right is the load average\n"); -+#ifdef __FreeBSD__ -+ fprintf(stderr, "The middle bar: left memory usage devided by ticks into active, inactive,\n\t\twired, cached + buffers, respectively, and the number\n\t\tof megs used\n"); -+#else - fprintf(stderr, "The middle bar: left memory usage devided by ticks into shared, buffers, and\n\t\t cached, respectively, and the number of megs used\n"); -+#endif - fprintf(stderr, "The lower bar: the left swap usage and the number of megs swappedd avg\n"); - fprintf(stderr, "The bottom: the left is a set of LED's marking page's and swap's, the right is\n\t\t a bar representing the amount of memory that the X server \n\t\t is taking up, and the exact megs\n\n usage:\n"); - fprintf(stderr, "\t-display <display name>\n"); -@@ -168,8 +252,13 @@ - fprintf(stderr, "\t-v\tprint the version number\n"); - #ifndef __solaris__ - fprintf(stderr, "\t-u\tforce asmon to show uptime, rather than X mem use\n"); -+#else -+#ifdef __FreeBSD__ -+ fprintf(stderr, "\t-m\tmake asmon show only active mem\n"); -+#else - fprintf(stderr, "\t-m\tmake asmon show only shared mem, like most other mem meters\n"); - #endif -+#endif - #ifdef EXEC_ON_CLICK - fprintf(stderr, "\t-e cmd\texecute 'cmd' on mouse click\n"); - #endif -@@ -229,6 +318,10 @@ - #if 0 - fprintf(stderr,"system(%s)\n",Command); - #endif -+ if (setgid(getgid()) != 0) -+ err(1, "Can't drop setgid privileges."); -+ if (setuid(getuid()) != 0) -+ err(1, "Can't drop setuid privileges."); - if (Command[ 0 ]) system(Command); - break; - #endif -@@ -323,12 +416,13 @@ - /* CPU Usage Meter */ - void DrawCPU(void) - { -- FILE *fp; - static float cpustat[4]; /* remember the statistics read last time */ - float fields[4], info[4], cputotal=0.0; - long pageins=0, pageouts=0, swapins=0, swapouts=0; -- char buf[128]; - int i; -+#ifndef __FreeBSD__ -+ char buf[128]; -+ FILE *fp; - - if( (fp = fopen("/proc/stat", "r")) != NULL) - { -@@ -345,7 +439,15 @@ - sscanf(buf, "swap %ld %ld", &swapins, &swapouts); - } - fclose(fp); -- -+#else -+ { -+ long cputime[4]; -+ struct vmmeter sum; -+ -+ kvm_read(kd, nl[X_CP_TIME].n_value, &cputime, sizeof(cputime)); -+ for(i = 0; i < 4; i++) -+ info[i] = (float)cputime[i]; -+#endif - // Calculate CPU stuff - for(i = 0; i < 4; i++) - { -@@ -365,6 +467,13 @@ - } - - // Page In/Out -+#ifdef __FreeBSD__ -+ KGET(X_CNT, sum); -+ pageins = sum.v_vnodepgsin; -+ pageouts = sum.v_vnodepgsout; -+ swapins = sum.v_swappgsin; -+ swapouts = sum.v_swappgsout; -+#endif - if (pageins > last_pageins) - { - DrawLite(B_RED, 5, 48); -@@ -414,12 +523,19 @@ - #ifdef __solaris__ - if (getLoad(&ftmp) != -1) - { --#else -+#else -+#ifndef __FreeBSD__ - FILE *fp; - if( (fp = fopen("/proc/loadavg", "r")) != NULL) - { - fscanf(fp, "%f", &ftmp); - fclose(fp); -+#else -+ { -+ double avg[1]; -+ getloadavg(avg, 1); -+ ftmp = (float)avg[0]; -+#endif - #endif - if(oldv != ftmp) - { -@@ -540,6 +656,7 @@ - /* Mem/Swap Meter */ - float DrawMemSwap(float total, int allmem) - { -+#ifndef __FreeBSD__ - FILE *fp; - if( (fp = fopen("/proc/meminfo", "r")) != NULL) - { -@@ -553,6 +670,149 @@ - fgets(junk, 80, fp); - fscanf(fp, "Mem: %f %f %f %f %f %f\nSwap: %f %f %f", &total, &used, &freeM, &shared, &buffers, &cached, &swaptotal, &swapused, &swapfreeM); - fclose(fp); -+#else -+ { -+ static float stotal=0.0, sshared=0.0, sbuffers=0.0, scached=0.0; -+#if __FreeBSD_version >= 400000 -+ float used, active, inactive, wired, buffers, cached, shared; -+ static float swaptotal, swapused; -+ static u_int swappgsin= - 1, swappgsout = -1; -+ int n, bufspace = 0; -+ int pagesize = getpagesize(); -+ struct kvm_swap swapary[1]; -+#else -+ float used, active, inactive, wired, buffers, cached, swaptotal, -+ swapused, shared; -+ int nswap, nswdev, dmmax; -+ int i, avail, nfree, kmemused, bufspace = 0; -+ struct swdevt *sw; -+ long *perdev; -+ struct rlist head; -+ struct rlisthdr swaplist; -+ struct rlist *swapptr; -+ u_long ptr; -+#endif -+ struct vmmeter sum; -+ int tempy, tempa; -+ unsigned long MEMactive,MEMinactive,MEMwired,MEMbuff,MEMcach, MEMswap; -+ -+#if __FreeBSD_version >= 400000 -+#define CONVERT(v) ((quad_t)(v) * pagesize / 1024) -+ KGET(X_CNT, sum); -+ KGET(X_BUFSPACE, bufspace); -+ if(swappgsin < 0 || swappgsin != sum.v_swappgsin || -+ swappgsout != sum.v_swappgsout){ -+ n = kvm_getswapinfo(kd, swapary, 1, 0); -+ if (n < 0 || swapary[0].ksw_total == 0){ -+ swaptotal = 0; -+ swapused = 0; -+ } else { -+ swaptotal = CONVERT(swapary[0].ksw_total); -+ swapused = CONVERT(swapary[0].ksw_used); -+ swaptotal *= 1024; -+ swapused *= 1024; -+ } -+ swappgsin = sum.v_swappgsin; -+ swappgsout = sum.v_swappgsout; -+ } -+ total = sum.v_page_size * sum.v_page_count; -+ cached = sum.v_page_size * sum.v_cache_count; -+ used = sum.v_page_size * (sum.v_page_count - sum.v_free_count); -+ buffers = bufspace; -+ active = sum.v_page_size * sum.v_active_count; -+ inactive = sum.v_page_size * sum.v_inactive_count; -+ wired = sum.v_page_size * sum.v_wire_count; -+#else -+ KGET(VM_NSWAP, nswap); -+ KGET(VM_NSWDEV, nswdev); -+ KGET(VM_DMMAX, dmmax); -+ KGET1(VM_SWAPLIST, &swaplist, sizeof swaplist, "swaplist"); -+ if ((sw = (struct swdevt*)malloc(nswdev * sizeof(*sw))) == NULL || -+ (perdev = (long *)malloc(nswdev * sizeof(*perdev))) == NULL) -+ errx(1, "malloc"); -+ KGET1(VM_SWDEVT, &ptr, sizeof ptr, "swdevt"); -+ KGET2(ptr, sw, nswdev * sizeof(*sw), "*swdevt"); -+ -+ /* Count up swap space. */ -+ nfree = 0; -+ memset(perdev, 0, nswdev * sizeof(*perdev)); -+ swapptr = swaplist.rlh_list; -+ while (swapptr) { -+ int top, bottom, next_block; -+ -+ KGET2(swapptr, &head, sizeof(struct rlist), "swapptr"); -+ -+ top = head.rl_end; -+ bottom = head.rl_start; -+ -+ nfree += top - bottom + 1; -+ -+ /* -+ * Swap space is split up among the configured disks. -+ * -+ * For interleaved swap devices, the first dmmax blocks -+ * of swap space some from the first disk, the next dmmax -+ * blocks from the next, and so on up to nswap blocks. -+ * -+ * The list of free space joins adjacent free blocks, -+ * ignoring device boundries. If we want to keep track -+ * of this information per device, we'll just have to -+ * extract it ourselves. -+ */ -+ while (top / dmmax != bottom / dmmax) { -+ next_block = ((bottom + dmmax) / dmmax); -+ perdev[(bottom / dmmax) % nswdev] += -+ next_block * dmmax - bottom; -+ bottom = next_block * dmmax; -+ } -+ perdev[(bottom / dmmax) % nswdev] += -+ top - bottom + 1; -+ -+ swapptr = head.rl_next; -+ } -+ -+ avail = 0; -+ for (i = 0; i < nswdev; i++) { -+ int xsize, xfree; -+ -+ /* -+ * Don't report statistics for partitions which have not -+ * yet been activated via swapon(8). -+ */ -+ if (!(sw[i].sw_flags & SW_FREED)) -+ continue; -+ -+ /* The first dmmax is never allocated to avoid trashing of -+ * disklabels -+ */ -+ xsize = sw[i].sw_nblks - dmmax; -+ xfree = perdev[i]; -+ kmemused = xsize - xfree; -+ avail += xsize; -+ } -+ -+ /* -+ * If only one partition has been set up via swapon(8), we don't -+ * need to bother with totals. -+ */ -+ kmemused = avail - nfree; -+ KGET(X_CNT, sum); -+ KGET(X_BUFSPACE, bufspace); -+ free(sw); -+ free(perdev); -+ -+ swaptotal = avail * 512; -+ swapused = kmemused * 512; -+#endif -+ -+ total = sum.v_page_size * sum.v_page_count; -+ cached = sum.v_page_size * sum.v_cache_count; -+ used = sum.v_page_size * (sum.v_page_count - sum.v_free_count); -+ buffers = bufspace; -+ active = sum.v_page_size * sum.v_active_count; -+ inactive = sum.v_page_size * sum.v_inactive_count; -+ wired = sum.v_page_size * sum.v_wire_count; -+#endif - - if ( allmem == 1) { - /* All mem areas */ -@@ -561,11 +821,23 @@ - stotal = total; sshared = shared; sbuffers = buffers; scached = cached; - if ( (total/101048576) >= 1) - { -+#ifdef __FreeBSD__ -+ MEMactive=(active/total)*27; -+ MEMinactive=(inactive/total)*27; -+ MEMwired=(wired/total)*27; -+#else - MEMshar=(shared/total)*27; -+#endif - MEMbuff=(buffers/total)*27; - MEMcach=(cached/total)*27; - } else { -+#ifdef __FreeBSD__ -+ MEMactive=(active/total)*33; -+ MEMinactive=(inactive/total)*33; -+ MEMwired=(wired/total)*33; -+#else - MEMshar=(shared/total)*33; -+#endif - MEMbuff=(buffers/total)*33; - MEMcach=(cached/total)*33; - } -@@ -579,9 +851,15 @@ - copyXPMArea(3,75,((used/total)*34),9,5,19); - } - // Separators -+#ifdef __FreeBSD__ -+ copyXPMArea(15,105,1,9,5+MEMactive,19); -+ copyXPMArea(15,105,1,9,6+MEMactive+MEMinactive,19); -+ copyXPMArea(15,105,1,9,7+MEMactive+MEMinactive+MEMwired,19); -+#else - copyXPMArea(15,105,1,9,5+MEMshar,19); - copyXPMArea(15,105,1,9,7+MEMshar+MEMbuff,19); - copyXPMArea(15,105,(36-(used/total)*34),9,(5+(used/total)*34),19); -+#endif - // Numbers - tempa=used/1048576; - tempy=tempa%10; -@@ -601,6 +879,16 @@ - if(stotal != total || sshared != shared) - { - stotal = total; sshared = shared; sbuffers = buffers; scached = cached; -+#ifdef __FreeBSD__ -+ if ( (total/101048576) >= 1) { -+ MEMactive=(active/total)*27; -+ } else { -+ MEMactive=(active/total)*35; -+ } -+ // Bar -+ copyXPMArea(3,75,MEMactive,9,5,19); -+ copyXPMArea(3,102,(36-(active/total)*36),9,(5+(active/total)*36),19) ; -+#else - if ( (total/101048576) >= 1) { - MEMshar=(shared/total)*27; - } else { -@@ -609,8 +897,13 @@ - // Bar - copyXPMArea(3,75,MEMshar,9,5,19); - copyXPMArea(15,105,(36-(shared/total)*36),9,(5+(shared/total)*36),19); -+#endif - // Numbers -+#ifdef __FreeBSD__ -+ tempa=active/1048576; -+#else - tempa=shared/1048576; -+#endif - tempy=tempa%10; - copyXPMArea(3+(tempy*6),66,6,9,50,19); - tempy=(tempa/10)%10; -@@ -662,10 +955,11 @@ - /* X Mem Usage */ - void DrawXmem(int Xpid, float total) - { -- FILE *fp; -- char buf[128], XFileName[256]; - float ratio; - long old_Xsize=-1, Xsize=0; -+#ifndef __FreeBSD__ -+ FILE *fp; -+ char buf[128], XFileName[256]; - - sprintf(XFileName, "/proc/%d/status", Xpid); - -@@ -676,6 +970,15 @@ - if (strstr(buf, "VmSize")) - sscanf(buf, "VmSize: %ld", &Xsize); - } -+#else -+ { -+ struct kinfo_proc *kproc; -+ int kcnt; -+ -+ kproc = kvm_getprocs(kd, KERN_PROC_PID, Xpid, &kcnt); -+ -+ Xsize = kproc->kp_eproc.e_vm.vm_map.size / 1024; -+#endif - if(old_Xsize!=Xsize) - { - int tempy, tempa; -@@ -692,7 +995,9 @@ - copyXPMArea(3,84,((ratio)*22),11,18,47); - copyXPMArea(15,105,(23-((ratio)*22)),11,(18+(ratio*22)),47); - } -+#ifndef __FreeBSD__ - fclose(fp); -+#endif - } - } - -@@ -713,10 +1018,28 @@ - pUtmp = getutid(&idUtmp); - upt = (time(0) - pUtmp->ut_time); - #else -+#ifndef __FreeBSD__ - FILE *fp; - if( (fp = fopen("/proc/uptime", "r")) != NULL) - fscanf(fp, "%d",&upt); - fclose(fp); -+#else -+ int mib[2]; -+ struct timeval boottime; -+ size_t bt_size; -+ -+ bt_size = sizeof(boottime); -+ mib[0] = CTL_KERN; -+ mib[1] = KERN_BOOTTIME; -+ -+ if (sysctl(mib, 2, &boottime, &bt_size, NULL, 0) != -1 && -+ boottime.tv_sec != 0) { -+ upt = time(NULL) - boottime.tv_sec; -+ upt += 30; /* top(1) does this ???? */ -+ } else { -+ upt = 0; -+ } -+#endif - #endif - mins=(upt/60)%60; - hours=(upt/3600)%24; -@@ -777,6 +1100,31 @@ - break; - } - -+} -+ -+void -+open_kvm() -+{ -+ if (kd == 0) { -+ kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, 0); -+ if (kd != NULL) { -+ if (kvm_nlist(kd, nl) < 0) { -+ errx(1, "kvm_nlist: %s", kvm_geterr(kd)); -+ } -+ if (nl[0].n_type == 0) { -+ errx(1, "no namelist"); -+ } -+ } else { -+ warnx("kvm not available"); -+ } -+ } -+} -+ -+void -+close_kvm() -+{ -+ kvm_close(kd); -+ kd = NULL; - } - - /* EOF */ +*** Makefile.orig Tue Jun 8 15:54:04 1999 +--- Makefile Tue Jun 8 15:54:36 1999 +*************** +*** 0 **** +--- 1,20 ---- ++ LIBDIR = -L${X11BASE}/lib ++ LIBS = -lXpm -lXext -lX11 -lkvm ++ OBJS = asmon/asmon.o \ ++ wmgeneral/wmgeneral.o \ ++ wmgeneral/misc.o \ ++ wmgeneral/list.o ++ ++ all: asmon ++ ++ .c.o: ++ $(CC) $(CFLAGS) -c -Wall -I${X11BASE}/include $< -o $*.o ++ ++ asmon: $(OBJS) ++ $(CC) -o asmon/asmon $^ $(LIBDIR) $(LIBS) ++ ++ clean:: ++ for i in $(OBJS) ; do \ ++ rm -f $$i;\ ++ done |