9 Commits

Author SHA1 Message Date
Christian Barthel
fcd19adc54 makefile update 2019-01-11 22:53:40 +01:00
bch
75987c50d6 freebsd memory usage 2018-12-26 18:46:16 +00:00
bch
3b3d39c18c formatting, add freebsd support 2018-12-26 18:46:04 +00:00
bch
06227deb08 Summary: minor update 2017-03-15 20:26:11 +00:00
bch
53ca874f25 Summary: improved installation, make dist target 2017-03-15 20:26:03 +00:00
bch
fbedd2a351 install copyright file 2017-02-26 18:53:55 +00:00
bch
fb1974ef9b Summary: some copyright things added/changed 2017-02-26 18:47:28 +00:00
bch
00ce2bed2a wrong filename 2017-02-26 17:22:13 +00:00
bch
a1d643c4ca Summary: remove object file 2017-02-26 16:07:03 +00:00
7 changed files with 327 additions and 146 deletions

View File

@@ -1,28 +1,54 @@
CFLAGS += -Wall -I/usr/X11R6/include/
BINDIR=/usr/local/bin
MANDIR=/usr/local/man/man1
LDFLAGS=-L/usr/X11R6/lib -lX11 -lXt -lXaw -lXmu
# OS=$(uname) make
xmem: xmem.o get_mem.o MemStripChart.o
$(CC) -o xmem xmem.o get_mem.o MemStripChart.o $(LDFLAGS)
### OS = FreeBSD
PROG= xmem
VERSION= 1.27
FreeBSD_lflag= -lkvm
LDFLAGS+= -L/usr/X11R6/lib -L/usr/local/lib/ -lX11 -lXt -lXaw -lXmu
LDFLAGS+= $($(OS)_lflag)
CFLAGS+= -Wall -I/usr/X11R6/include/ -I/usr/local/include/
OBJECTS= xmem.o MemStripChart.o
FreeBSD_stub = get_mem_fbsd.o
OpenBSD_stub = get_mem.o
OBJECTS += $($(OS)_stub)
xmem.o: xmem.c
$(CC) $(CFLAGS) -c xmem.c
get_mem.o: get_mem.c
$(CC) $(CFLAGS) -c get_mem.c
MemStripChart.o: MemStripChart.c
$(CC) $(CFLAGS) -c MemStripChart.c
clean:
-rm xmem *.o *~
all: xmem
install: all
/usr/bin/install -c -m 0555 xmem $(DESTDIR)$(BINDIR)
/usr/bin/install -c -m 0444 xmem.1 $(DESTDIR)$(MANDIR)
/usr/bin/install -c -m 0644 XMem.ad $(DESTDIR)/usr/local/lib/X11/app-defaults/XMem
/usr/bin/install -d -m 0755 $(DESTDIR)/usr/local/share/xmem/
/usr/bin/install -c -m 0644 xmem.bit $(DESTDIR)/usr/local/share/xmem/
xmem.full:
echo "full not supported yet"
xmem.debug:
echo "debug not supported yet"
xmem: $(OBJECTS)
$(CC) -o xmem $(OBJECTS) $(LDFLAGS)
%.o: %c
$(CC) $(CFLAGS) -c $<
clean:
-rm -rf $(OBJECTS) $(PROG)
dist:
mkdir -p ${PROG}-${VERSION}
cp *.h *.c Makefile xmem.1 xmem.bit copyright XMem.ad ${PROG}-${VERSION}
tar cfvz ${PROG}-${VERSION}.tar.gz ${PROG}-${VERSION}
rm -rf ${PROG}-${VERSION}
dist-clean:
-rm ${PROG}-${VERSION}.tar.gz
install:
install -d -m 755 {PREFIX}/bin/
install -c -S -s -o root -g bin -m 755 xmem ${PREFIX}/bin/xmem
install -d -m 755 ${PREFIX}/man/man1/
install -c -o root -g bin -m 644 xmem.1 ${PREFIX}/man/man1/xmem.1
install -d -m 755 ${PREFIX}/lib/X11/app-defaults/
install -c -o root -g bin -m 644 XMem.ad ${PREFIX}/lib/X11/app-defaults/XMem
install -d -m 755 ${PREFIX}/share/${PROG}/
install -c -o root -g bin -m 644 xmem.bit ${PREFIX}/share/${PROG}/xmem.bit
install -c -o root -g bin -m 644 copyright ${PREFIX}/share/${PROG}/copyright
.include <bsd.prog.mk>

Binary file not shown.

37
copyright Normal file
View File

@@ -0,0 +1,37 @@
This package was debianized by Daniel Baumann <daniel@debian.org> on
Sun, 22 Jan 2006 14:26:00 +0100.
This xmem was resurrected from the xfree86 sources of the bo release.
Copyright Holder: X Consortium
License:
Copyright (C) 1987 X Consortium
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of the X Consortium shall
not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization from
the X Consortium.
The Debian packaging is (C) 2006-2007, Daniel Baumann <daniel@debian.org> and
is licensed under the GPL, see `/usr/share/common-licenses/GPL'.

View File

@@ -1,6 +1,7 @@
/* $Id: get_mem.c,v 1.4 2017/02/26 16:03:48 bch Exp $
/* $Id: get_mem.c,v 1.5 2018/12/26 18:46:04 bch Exp $
*
* Adapted: get memory usage on OpenBSD
* Author: Christian Barthel <bch@vcs.onfire.org>
* Author: Christian Barthel <bch@online.de>
*
* get memory usage, from get_load.c derived
*
@@ -9,6 +10,7 @@
* Modified for more recent kernels Helmut Geyer Oct. 1996
*/
#include <sys/param.h> /* DEV_BSIZE MAXCOMLEN PZERO */
#include <sys/sysctl.h>
#include <sys/swap.h>

113
get_mem_fbsd.c Normal file
View File

@@ -0,0 +1,113 @@
/* $Id: get_mem_fbsd.c,v 1.1 2018/12/26 18:46:16 bch Exp $
*
* Author: Christian Barthel <bch@online.de>
*/
#include <sys/types.h> /* DEV_BSIZE MAXCOMLEN PZERO */
#include <sys/sysctl.h>
#include <unistd.h>
#include <kvm.h>
#include <X11/Xos.h>
#include <X11/Intrinsic.h>
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include "MemStripChart.h"
static int pageshift = -1;
static int pagesize = 0;
static kvm_t *kd = 0;
#define pagetok(size) ((size) << pageshift)
#define LOG1024 10
static unsigned int allmem_pages = 0;
static void initPageShift(void)
{
pagesize = getpagesize();
size_t len = sizeof(allmem_pages);
int mib[len];
pageshift = 0;
while (pagesize > 1) {
pageshift++;
pagesize >>= 1;
}
pageshift -= LOG1024;
kd = kvm_open(NULL, "/dev/null" ,NULL, O_RDONLY, "kvm_open");
if (sysctlbyname("vm.stats.vm.v_page_count", &allmem_pages, &len, NULL, 0) == -1)
perror("sysctl");
#ifdef DEBUG
printf("page_count: %d\n", allmem_pages);
#endif
}
static double getSwapFrac()
{
/* XXX Borrowed from top(1) code: */
int n;
struct kvm_swap swapary[1];
static int pagesize = 0;
static unsigned long swap_maxpages = 0;
size_t sz = sizeof(swap_maxpages);
int retavail = 0;
int retfree = 0;
n = kvm_getswapinfo(kd, swapary, 1, 0);
if (n < 0 || swapary[0].ksw_total == 0)
return (0);
if (swap_maxpages == 0)
sysctlbyname("vm.swap_maxpages", &swap_maxpages, &sz, NULL, 0);
if ( swapary[0].ksw_total > swap_maxpages )
swapary[0].ksw_total = swap_maxpages;
retavail = swapary[0].ksw_total;
retfree = swapary[0].ksw_total - swapary[0].ksw_used;
#ifdef DEBUG
printf("swap: %d %d %d %d\n", retavail, retavail, swapary[0].ksw_total,
swapary[0].ksw_used);
#endif
return (double)(retavail-retfree)/(double)retavail;
}
void GetMemLoadPoint(Widget w, caddr_t closure, caddr_t call_data)
{
MemStripChartCallbackData ret;
int a, b;
size_t sz = sizeof(int);
double cache = 0;
if (pageshift < 0)
initPageShift();
sysctlbyname("vm.stats.vm.v_wire_count", &a, &sz, NULL, 0);
ret.code = (double)a / (double)allmem_pages;
sysctlbyname("vm.stats.vm.v_active_count", &a, &sz, NULL, 0);
ret.buffer = (double)a / (double)allmem_pages;
/* v_cache_count and v_inactive_count are treated similarly */
sysctlbyname("vm.stats.vm.v_inactive_count", &a, &sz, NULL, 0);
sysctlbyname("vm.stats.vm.v_cache_count", &b, &sz, NULL, 0);
ret.cached = (double)(a + b) / allmem_pages;
sysctlbyname("vm.stats.vm.v_free_count", &a, &sz, NULL, 0);
ret.free = (double)a / allmem_pages;
ret.swap = getSwapFrac();
#ifdef DEBUG
printf("%u %lf %lf %lf %lf\n", allmem_pages,
ret.code, ret.cached, ret.free, ret.swap);
#endif
memcpy(call_data, &ret, sizeof(MemStripChartCallbackData));
}

12
xmem.1
View File

@@ -1,4 +1,4 @@
.TH XMEM 1x "Release 5, X Version 11" "memory display utility"
.TH XMEM 1 "Release 5, X Version 11" "memory display utility"
.SH NAME
xmem \- memory/swap usage display utility for X
.SH SYNOPSIS
@@ -55,15 +55,15 @@ second. The default is 10.
(Xresource: *mem.update)
.TP
.B \-codecolor color
Color for used code and stack memory. The default is red.
Color for used code and stack memory. The default is blue.
(Xresource: *mem.codecolor)
.TP
.B \-cachedcolor color
Color for cached memory. The default is yellow.
Color for cached memory. The default is orange.
(Xresource: *mem.cachedcolor)
.TP
.B \-buffercolor color
Color for buffer memory. The default is blue.
Color for buffer memory. See BUGS.
(Xresource: *mem.buffercolor)
.TP
.B \-freecolor color
@@ -109,7 +109,7 @@ stored in the RESOURCE_MANAGER property.
.SH SEE ALSO
X(1), xrdb(1), mem(4), Athena StripChart Widget.
.SH BUGS
The buffer-memory is always 0.
The buffer-memory is always 0. There is no distinction on BSDs.
.SH COPYRIGHT
Copyright 1988, Massachusetts Institute of Technology.
.br
@@ -121,4 +121,4 @@ Della Fera (MIT-Athena), and Chris Peterson (MIT-LCS).
.P
Updated 2007/04 by Michelle Konzack <linux4michelle@freenet.de>
.P
Update by Christian Barthel <bch@onfire.org>, 2017/01, OpenBSD support.
Update by Christian Barthel <bch@onfire.org>, 2017/01, OpenBSD support.

233
xmem.c
View File

@@ -1,7 +1,8 @@
/*
* xmem - display memory/swap usage utility for X
*
* Copyright 2017 Christian Barthel <bch@onfire.org>
* Updated by Christian Barthel <bch@online.de>
*
* Copyright 1989 Massachusetts Institute of Technology
*
* $XConsortium: xload.c,v 1.36 91/05/24 16:57:46 converse Exp $
@@ -46,19 +47,19 @@ typedef struct _XLoadResources {
*/
static XrmOptionDescRec options_mem[] = {
{"-scale", "*mem.minScale", XrmoptionSepArg, NULL},
{"-update", "*mem.update", XrmoptionSepArg, NULL},
{"-hl", "*mem.highlight", XrmoptionSepArg, NULL},
{"-highlight", "*mem.highlight", XrmoptionSepArg, NULL},
{"-codecolor", "*mem.codecolor", XrmoptionSepArg, NULL},
{"-cachedcolor", "*mem.cachedcolor", XrmoptionSepArg, NULL},
{"-buffercolor", "*mem.buffercolor", XrmoptionSepArg, NULL},
{"-freecolor", "*mem.freecolor", XrmoptionSepArg, NULL},
{"-swapcolor", "*mem.swapcolor", XrmoptionSepArg, NULL},
{"-jumpscroll", "*mem.jumpScroll", XrmoptionSepArg, NULL},
{"-label", "*label.label", XrmoptionSepArg, NULL},
{"-nolabel", "*showLabel", XrmoptionNoArg, "False"},
{"-lights", "*useLights", XrmoptionNoArg, "True"},
{"-scale", "*mem.minScale", XrmoptionSepArg, NULL},
{"-update", "*mem.update", XrmoptionSepArg, NULL},
{"-hl", "*mem.highlight", XrmoptionSepArg, NULL},
{"-highlight", "*mem.highlight", XrmoptionSepArg, NULL},
{"-codecolor", "*mem.codecolor", XrmoptionSepArg, NULL},
{"-cachedcolor", "*mem.cachedcolor", XrmoptionSepArg, NULL},
{"-buffercolor", "*mem.buffercolor", XrmoptionSepArg, NULL},
{"-freecolor", "*mem.freecolor", XrmoptionSepArg, NULL},
{"-swapcolor", "*mem.swapcolor", XrmoptionSepArg, NULL},
{"-jumpscroll", "*mem.jumpScroll", XrmoptionSepArg, NULL},
{"-label", "*label.label", XrmoptionSepArg, NULL},
{"-nolabel", "*showLabel", XrmoptionNoArg, "False"},
{"-lights", "*useLights", XrmoptionNoArg, "True"},
};
/*
@@ -70,7 +71,7 @@ static XrmOptionDescRec options_mem[] = {
static XtResource my_resources_mem[] = {
{"showLabel", XtCBoolean, XtRBoolean, sizeof(Boolean),
Offset(show_label), XtRImmediate, (XtPointer) TRUE},
Offset(show_label), XtRImmediate, (XtPointer) TRUE},
};
#undef Offset
@@ -78,7 +79,7 @@ static XtResource my_resources_mem[] = {
static XLoadResources resources;
static XtActionsRec xload_actions[] = {
{ "quit", quit },
{ "quit", quit },
};
static Atom wm_delete_window;
@@ -91,38 +92,38 @@ void usage(char *progname)
fprintf (stderr, "usage: %s [-options ...]\n\n", progname);
fprintf (stderr, "where options include:\n");
fprintf (stderr,
" -display dpy X server on which to display\n");
" -display dpy X server on which to display\n");
fprintf (stderr,
" -geometry geom size and location of window\n");
" -geometry geom size and location of window\n");
fprintf (stderr,
" -fn font font to use in label\n");
" -fn font font to use in label\n");
fprintf (stderr,
" -update seconds interval between updates\n");
" -update seconds interval between updates\n");
fprintf (stderr,
" -label string annotation text\n");
" -label string annotation text\n");
fprintf (stderr,
" -bg color background color\n");
" -bg color background color\n");
fprintf (stderr,
" -fg color text color\n");
" -fg color text color\n");
fprintf (stderr,
" -hl color scale color\n");
" -hl color scale color\n");
fprintf (stderr,
" -codecolor color used code and stack memory color\n");
" -codecolor color used code and stack memory color\n");
fprintf (stderr,
" -cachedcolor color used cached memory color\n");
" -cachedcolor color used cached memory color\n");
fprintf (stderr,
" -buffercolor color used buffer memory color\n");
" -buffercolor color used buffer memory color\n");
fprintf (stderr,
" -freecolor color used free memory color\n");
" -freecolor color used free memory color\n");
fprintf (stderr,
" -swapcolor color used swap memory color\n");
" -swapcolor color used swap memory color\n");
fprintf (stderr,
" -nolabel removes the label from above the chart.\n");
" -nolabel removes the label from above the chart.\n");
fprintf (stderr,
" -jumpscroll value number of pixels to scroll on overflow\n");
" -jumpscroll value number of pixels to scroll on overflow\n");
fprintf (stderr,
"The reference line refers to the avaible installed ram\n");
"The reference line refers to the avaible installed ram\n");
fprintf (stderr, "\n");
exit(1);
@@ -130,94 +131,96 @@ void usage(char *progname)
int main(int argc, char **argv)
{
XtAppContext app_con;
Widget toplevel, load, pane, label_wid, load_parent;
Arg args[1];
Pixmap icon_pixmap = None;
char *label, host[256];
/* For security reasons, we reset our uid/gid after doing the necessary
system initialization and before calling any X routines. */
if (setgid(getgid()) == -1)
errx(1, "%s: setgid failed: %s\n", argv[0], strerror(errno));
if (setuid(getuid()) == -1)
errx(1, "%s: setuid failed: %s\n", argv[0], strerror(errno));
toplevel = XtAppInitialize(&app_con, "XMem", options_mem, XtNumber(options_mem),
&argc, argv, NULL, NULL, (Cardinal) 0);
if (argc != 1) usage(argv[0]);
XtGetApplicationResources( toplevel, (XtPointer) &resources,
my_resources_mem, XtNumber(my_resources_mem),
NULL, (Cardinal) 0);
/*
* This is a hack so that f.delete will do something useful in this
* single-window application.
*/
XtAppAddActions (app_con, xload_actions, XtNumber(xload_actions));
XtOverrideTranslations(toplevel,
XtParseTranslationTable ("<Message>WM_PROTOCOLS: quit()"));
XtSetArg (args[0], XtNiconPixmap, &icon_pixmap);
XtGetValues(toplevel, args, ONE);
if (icon_pixmap == None) {
XtSetArg(args[0], XtNiconPixmap,
XCreateBitmapFromData(XtDisplay(toplevel),
XtScreen(toplevel)->root,
(char *)xload_bits,
xload_width, xload_height));
XtSetValues (toplevel, args, ONE);
}
if (resources.show_label) {
pane = XtCreateManagedWidget ("paned", panedWidgetClass,
toplevel, NULL, ZERO);
label_wid = XtCreateManagedWidget ("label", labelWidgetClass,
pane, NULL, ZERO);
XtSetArg (args[0], XtNlabel, &label);
XtGetValues(label_wid, args, ONE);
if ( strcmp("label", label) == 0 ) {
(void) XmuGetHostname (host, 255);
XtSetArg (args[0], XtNlabel, host);
XtSetValues (label_wid, args, ONE);
}
load_parent = pane;
}
else
load_parent = toplevel;
load = XtCreateManagedWidget ("mem", memStripChartWidgetClass,
load_parent, NULL, ZERO);
XtAddCallback(load, XtNgetValue, (void*)GetMemLoadPoint, NULL);
XtRealizeWidget (toplevel);
wm_delete_window = XInternAtom (XtDisplay(toplevel), "WM_DELETE_WINDOW",
False);
(void) XSetWMProtocols (XtDisplay(toplevel), XtWindow(toplevel),
&wm_delete_window, 1);
XtAppContext app_con;
Widget toplevel, load, pane, label_wid, load_parent;
Arg args[1];
Pixmap icon_pixmap = None;
char *label, host[256];
/* For security reasons, we reset our uid/gid after doing the necessary
system initialization and before calling any X routines. */
if (setgid(getgid()) == -1)
errx(1, "%s: setgid failed: %s\n", argv[0], strerror(errno));
if (setuid(getuid()) == -1)
errx(1, "%s: setuid failed: %s\n", argv[0], strerror(errno));
toplevel = XtAppInitialize(&app_con, "XMem", options_mem, XtNumber(options_mem),
&argc, argv, NULL, NULL, (Cardinal) 0);
if (argc != 1) usage(argv[0]);
XtGetApplicationResources( toplevel, (XtPointer) &resources,
my_resources_mem, XtNumber(my_resources_mem),
NULL, (Cardinal) 0);
/*
* This is a hack so that f.delete will do something useful in this
* single-window application.
*/
XtAppAddActions (app_con, xload_actions, XtNumber(xload_actions));
XtOverrideTranslations(toplevel,
XtParseTranslationTable ("<Message>WM_PROTOCOLS: quit()"));
XtSetArg (args[0], XtNiconPixmap, &icon_pixmap);
XtGetValues(toplevel, args, ONE);
if (icon_pixmap == None) {
XtSetArg(args[0], XtNiconPixmap,
XCreateBitmapFromData(XtDisplay(toplevel),
XtScreen(toplevel)->root,
(char *)xload_bits,
xload_width, xload_height));
XtSetValues (toplevel, args, ONE);
}
if (resources.show_label) {
pane = XtCreateManagedWidget ("paned", panedWidgetClass,
toplevel, NULL, ZERO);
label_wid = XtCreateManagedWidget ("label", labelWidgetClass,
pane, NULL, ZERO);
XtSetArg (args[0], XtNlabel, &label);
XtGetValues(label_wid, args, ONE);
if ( strcmp("label", label) == 0 ) {
(void) XmuGetHostname (host, 255);
XtSetArg (args[0], XtNlabel, host);
XtSetValues (label_wid, args, ONE);
}
load_parent = pane;
}
else
load_parent = toplevel;
load = XtCreateManagedWidget ("mem", memStripChartWidgetClass,
load_parent, NULL, ZERO);
XtAddCallback(load, XtNgetValue, (void*)GetMemLoadPoint, NULL);
XtRealizeWidget (toplevel);
wm_delete_window = XInternAtom (XtDisplay(toplevel), "WM_DELETE_WINDOW",
False);
(void) XSetWMProtocols (XtDisplay(toplevel), XtWindow(toplevel),
&wm_delete_window, 1);
if (pledge("ps vminfo stdio", NULL) == -1)
errx(1, "pledge failed: %s", strerror(errno));
#if __OpenBSD__
if (pledge("ps vminfo stdio", NULL) == -1)
errx(1, "pledge failed: %s", strerror(errno));
#endif
XtAppMainLoop(app_con);
return 0;
XtAppMainLoop(app_con);
return 0;
}
static void quit (Widget w, XEvent *event, String *params, Cardinal *num_params)
{
if (event->type == ClientMessage &&
event->xclient.data.l[0] != wm_delete_window) {
XBell (XtDisplay(w), 0);
return;
}
XtDestroyApplicationContext(XtWidgetToApplicationContext(w));
exit (0);
if (event->type == ClientMessage &&
event->xclient.data.l[0] != wm_delete_window) {
XBell (XtDisplay(w), 0);
return;
}
XtDestroyApplicationContext(XtWidgetToApplicationContext(w));
exit (0);
}