This just replaces kernel mixer(4) ioctls with appropriate
sioctl_open(3) calls.
OK?
Index: Makefile
===================================================================
RCS file: /cvs/ports/sysutils/xstatbar/Makefile,v
retrieving revision 1.21
diff -u -p -r1.21 Makefile
--- Makefile 12 Jul 2019 20:49:55 -0000 1.21
+++ Makefile 10 Apr 2020 15:32:32 -0000
@@ -5,7 +5,7 @@ ONLY_FOR_ARCHS= ${APM_ARCHS}
COMMENT= simple system monitor bar
DISTNAME= xstatbar-0.5
-REVISION= 10
+REVISION= 11
FIX_EXTRACT_PERMISSIONS=Yes
CATEGORIES= sysutils x11
Index: patches/patch-Makefile
===================================================================
RCS file: /cvs/ports/sysutils/xstatbar/patches/patch-Makefile,v
retrieving revision 1.5
diff -u -p -r1.5 patch-Makefile
--- patches/patch-Makefile 1 Jun 2018 14:16:46 -0000 1.5
+++ patches/patch-Makefile 10 Apr 2020 15:32:32 -0000
@@ -2,15 +2,17 @@ $OpenBSD: patch-Makefile,v 1.5 2018/06/0
Index: Makefile
--- Makefile.orig
+++ Makefile
-@@ -4,7 +4,7 @@ MANDIR=/usr/local/man/man1
+@@ -4,8 +4,8 @@ MANDIR=/usr/local/man/man1
# build flags
CC?=/usr/bin/cc
-CFLAGS+=-c -std=c89 -Wall -O2 -I/usr/X11R6/include
+-LDFLAGS+=-L/usr/X11R6/lib -lX11 -lXext -lXrender -lXau -lXdmcp -lm
+CFLAGS+=-c -std=c89 -Wall -I/usr/X11R6/include
- LDFLAGS+=-L/usr/X11R6/lib -lX11 -lXext -lXrender -lXau -lXdmcp -lm
++LDFLAGS+=-L/usr/X11R6/lib -lX11 -lXext -lXrender -lXau -lXdmcp -lm -lsndio
OBJS=xstatbar.o stats.o
+
@@ -16,8 +16,8 @@ xstatbar: $(OBJS)
$(CC) $(CFLAGS) $<
Index: patches/patch-stats_c
===================================================================
RCS file: /cvs/ports/sysutils/xstatbar/patches/patch-stats_c,v
retrieving revision 1.10
diff -u -p -r1.10 patch-stats_c
--- patches/patch-stats_c 24 Feb 2019 15:02:19 -0000 1.10
+++ patches/patch-stats_c 10 Apr 2020 15:32:32 -0000
@@ -6,19 +6,208 @@ progress and loop forever. Fix it by try
Index: stats.c
--- stats.c.orig
+++ stats.c
-@@ -101,8 +101,10 @@ volume_init()
- devinfo.index = 0;
- while (ioctl(volume.dev_fd, AUDIO_MIXER_DEVINFO, &devinfo) >= 0) {
+@@ -61,118 +61,101 @@ fmtmem(int m)
+ * volume stuff
+ ****************************************************************************/
+
+-int
+-volume_check_dev(int fd, int class, char *name)
++/*
++ * new control
++ */
++void
++volume_ondesc(void *unused, struct sioctl_desc *d, int val)
+ {
+- mixer_devinfo_t devinfo;
++ if (d == NULL)
++ return;
+
+- if (class < 0 || name == NULL)
+- return (-1);
++ if (d->addr == volume.left_addr)
++ volume.left_addr = -1;
++ if (d->addr == volume.right_addr)
++ volume.right_addr = -1;
+
+- devinfo.index = 0;
+- while (ioctl(fd, AUDIO_MIXER_DEVINFO, &devinfo) >= 0) {
+- if ((devinfo.type == AUDIO_MIXER_VALUE)
+- && (devinfo.mixer_class == class)
+- && (strncmp(devinfo.label.name, name, MAX_AUDIO_DEV_LEN) == 0))
+- return (devinfo.index);
++ if (d->type == SIOCTL_NUM &&
++ strcmp(d->group, "") == 0 &&
++ strcmp(d->node0.name, "output") == 0 &&
++ strcmp(d->func, "level") == 0) {
+
+- devinfo.index++;
++ switch (d->node0.unit) {
++ case -1: /* mono */
++ case 0: /* left */
++ volume.left_addr = d->addr;
++ volume.left_max = d->maxval;
++ break;
++ case 1: /* right */
++ volume.right_addr = d->addr;
++ volume.right_max = d->maxval;
++ }
+ }
++}
+
+- return (-1);
++/*
++ * control value changed
++ */
++void
++volume_onval(void *unused, unsigned int addr, unsigned int value)
++{
++ if (addr == volume.left_addr)
++ volume.left = value;
++ if (addr == volume.right_addr)
++ volume.right = value;
+ }
+
+ void
+ volume_init()
+ {
+- mixer_devinfo_t devinfo;
+- int oclass_idx, iclass_idx;
+-
+ volume.is_setup = false;
+- /* open mixer */
+- if ((volume.dev_fd = open("/dev/mixer", O_RDWR)) < 0) {
+- warn("volume: failed to open /dev/mixer");
++ if ((volume.hdl = sioctl_open(SIO_DEVANY, SIOCTL_READ, 0)) == NULL) {
++ warn("volume: failed to open default device");
+ return;
+ }
+
+- /* find the outputs and inputs classes */
+- oclass_idx = iclass_idx = -1;
+- devinfo.index = 0;
+- while (ioctl(volume.dev_fd, AUDIO_MIXER_DEVINFO, &devinfo) >= 0) {
+-
- if (devinfo.type != AUDIO_MIXER_CLASS)
-+ if (devinfo.type != AUDIO_MIXER_CLASS) {
-+ devinfo.index++;
- continue;
-+ }
+- continue;
+-
+- if (strncmp(devinfo.label.name, AudioCoutputs, MAX_AUDIO_DEV_LEN) == 0)
+- oclass_idx = devinfo.index;
+- if (strncmp(devinfo.label.name, AudioCinputs, MAX_AUDIO_DEV_LEN) == 0)
+- iclass_idx = devinfo.index;
+-
+- if (oclass_idx != -1 && iclass_idx != -1)
+- break;
+-
+- devinfo.index++;
++ volume.pfds = calloc(sioctl_nfds(volume.hdl), sizeof(struct pollfd));
++ if (volume.pfds == NULL) {
++ warnx("volume: cannot allocate pfds\n");
++ goto bad_close;
+ }
++
+
+- /* find the master device */
+- volume.master_idx = volume_check_dev(volume.dev_fd, oclass_idx,
AudioNmaster);
+- if (volume.master_idx == -1)
+- volume.master_idx = volume_check_dev(volume.dev_fd, iclass_idx,
AudioNdac);
+- if (volume.master_idx == -1)
+- volume.master_idx = volume_check_dev(volume.dev_fd, oclass_idx,
AudioNdac);
+- if (volume.master_idx == -1)
+- volume.master_idx = volume_check_dev(volume.dev_fd, oclass_idx,
AudioNoutput);
+-
+- if (volume.master_idx == -1) {
+- warnx("volume: failed to find \"master\" mixer device");
+- return;
++ if (!sioctl_ondesc(volume.hdl, volume_ondesc, NULL)) {
++ warnx("volume: cannot get descriptions\n");
++ goto bad_free;
+ }
+
+- devinfo.index = volume.master_idx;
+- if (ioctl(volume.dev_fd, AUDIO_MIXER_DEVINFO, &devinfo) == -1) {
+- warn("AUDIO_MIXER_DEVINFO");
+- return;
++ if (!sioctl_onval(volume.hdl, volume_onval, NULL)) {
++ warnx("volume: cannot get values\n");
++ goto bad_free;
+ }
+
+- volume.max = AUDIO_MAX_GAIN;
+- volume.nchan = devinfo.un.v.num_channels;
+-
+- /* finished... now close the device and reopen as read only */
+- close(volume.dev_fd);
+- volume.dev_fd = open("/dev/mixer", O_RDONLY);
+- if (volume.dev_fd < 0) {
+- warn("volume: failed to re-open /dev/mixer");
+- return;
+- }
+-
+ volume.is_setup = true;
++ return;
++bad_free:
++ free(volume.pfds);
++bad_close:
++ sioctl_close(volume.hdl);
+ }
+
+ void
+ volume_update()
+ {
+- static mixer_ctrl_t vinfo;
++ int n;
- if (strncmp(devinfo.label.name, AudioCoutputs, MAX_AUDIO_DEV_LEN) == 0)
- oclass_idx = devinfo.index;
-@@ -358,7 +360,7 @@ sysinfo_init(int hist_size)
+ if (!volume.is_setup)
+ return;
+
+- /* query info */
+- vinfo.dev = volume.master_idx;
+- vinfo.type = AUDIO_MIXER_VALUE;
+- vinfo.un.value.num_channels = volume.nchan;
+- if (ioctl(volume.dev_fd, AUDIO_MIXER_READ, &(vinfo)) < 0) {
+- warn("volume update: AUDIO_MIXER_READ");
+- return;
++ n = sioctl_pollfd(volume.hdl, volume.pfds, POLLIN);
++ if (n > 0) {
++ n = poll(volume.pfds, n, 0);
++ if (n == -1)
++ return;
++ if (n > 0)
++ sioctl_revents(volume.hdl, volume.pfds);
+ }
+-
+- /* record in global struct */
+- if (volume.nchan == 1)
+- volume.left = volume.right =
vinfo.un.value.level[AUDIO_MIXER_LEVEL_MONO];
+- else {
+- volume.left = vinfo.un.value.level[AUDIO_MIXER_LEVEL_LEFT];
+- volume.right = vinfo.un.value.level[AUDIO_MIXER_LEVEL_RIGHT];
+- }
+ }
+
+ void
+@@ -180,7 +163,7 @@ volume_close() {
+ if (!volume.is_setup)
+ return;
+
+- close(volume.dev_fd);
++ sioctl_close(volume.hdl);
+ }
+
+ int
+@@ -199,8 +182,8 @@ volume_draw(XColor color, int x, int y)
+ width = 5;
+
+ /* get volume as percents */
+- left = roundf(100.0 * (float)volume.left / (float)volume.max);
+- right = roundf(100.0 * (float)volume.right / (float)volume.max);
++ left = roundf(100.0 * (float)volume.left / (float)volume.left_max);
++ right = roundf(100.0 * (float)volume.right / (float)volume.right_max);
+
+ /* determine height of green-part of bar graphs */
+ lheight = (int)(left * (float)XINFO.height / 100.0);
+@@ -358,7 +341,7 @@ sysinfo_init(int hist_size)
err(1, "sysinfo init: memory calloc failed");
for (i = 0; i < hist_size; i++) {
@@ -27,7 +216,7 @@ Index: stats.c
err(1, "sysinfo init: memory[%d] calloc failed", i);
for (j = 0; j < 3; j++)
-@@ -372,6 +374,7 @@ sysinfo_init(int hist_size)
+@@ -372,6 +355,7 @@ sysinfo_init(int hist_size)
/* allocate cpu history */
sysinfo.cpu_raw = calloc(sysinfo.ncpu, sizeof(uint64_t**));
@@ -35,7 +224,7 @@ Index: stats.c
sysinfo.cpu_pcnts = calloc(sysinfo.ncpu, sizeof(int**));
if (sysinfo.cpu_raw == NULL || sysinfo.cpu_pcnts == NULL)
err(1, "sysinfo init: cpu_raw/cpu_pcnts calloc failed");
-@@ -404,10 +407,14 @@ sysinfo_update()
+@@ -404,10 +388,14 @@ sysinfo_update()
{
static int mib_nprocs[] = { CTL_KERN, KERN_NPROCS };
static int mib_vm[] = { CTL_VM, VM_METER };
@@ -51,7 +240,7 @@ Index: stats.c
size_t size;
int cpu, state;
int cur, prev;
-@@ -431,9 +438,16 @@ sysinfo_update()
+@@ -431,9 +419,16 @@ sysinfo_update()
if (sysctl(mib_vm, 2, &vminfo, &size, NULL, 0) < 0)
err(1, "sysinfo update: VM.METER failed");
@@ -68,7 +257,7 @@ Index: stats.c
/* get swap status */
if ((nswaps = swapctl(SWAP_NSWAP, 0, 0)) == 0)
-@@ -454,24 +468,15 @@ sysinfo_update()
+@@ -454,24 +449,15 @@ sysinfo_update()
/* get states for each cpu. note this is raw # of ticks */
size = CPUSTATES * sizeof(int64_t);
@@ -102,7 +291,7 @@ Index: stats.c
}
/* convert ticks to percentages */
-@@ -509,12 +514,16 @@ int
+@@ -509,12 +495,16 @@ int
cpu_draw(int cpu, XColor color, int x, int y)
{
static char str[1000];
@@ -121,7 +310,7 @@ Index: stats.c
startx = x;
snprintf(str, sizeof(str), "cpu%d:", cpu);
-@@ -531,7 +540,7 @@ cpu_draw(int cpu, XColor color, int x, int y)
+@@ -531,7 +521,7 @@ cpu_draw(int cpu, XColor color, int x, int y)
/* user time */
h = 0;
@@ -130,7 +319,7 @@ Index: stats.c
h = h * XINFO.height / 100;
XSetForeground(XINFO.disp, XINFO.gc, COLOR_RED.pixel);
XDrawLine(XINFO.disp, XINFO.buf, XINFO.gc,
-@@ -540,7 +549,7 @@ cpu_draw(int cpu, XColor color, int x, int y)
+@@ -540,7 +530,7 @@ cpu_draw(int cpu, XColor color, int x, int y)
/* nice time */
h = 0;
@@ -139,7 +328,7 @@ Index: stats.c
h = h * XINFO.height / 100;
XSetForeground(XINFO.disp, XINFO.gc, COLOR_BLUE.pixel);
XDrawLine(XINFO.disp, XINFO.buf, XINFO.gc,
-@@ -549,15 +558,24 @@ cpu_draw(int cpu, XColor color, int x, int y)
+@@ -549,15 +539,24 @@ cpu_draw(int cpu, XColor color, int x, int y)
/* system time */
h = 0;
@@ -166,7 +355,7 @@ Index: stats.c
h = h * XINFO.height / 100;
XSetForeground(XINFO.disp, XINFO.gc, COLOR_MAGENTA.pixel);
XDrawLine(XINFO.disp, XINFO.buf, XINFO.gc,
-@@ -594,7 +612,8 @@ mem_draw(XColor color, int x, int y)
+@@ -594,7 +593,8 @@ mem_draw(XColor color, int x, int y)
/* determine total memory */
total = sysinfo.memory[cur][MEM_ACT]
+ sysinfo.memory[cur][MEM_TOT]
@@ -176,7 +365,7 @@ Index: stats.c
/* start drawing ... */
x += render_text(color, x, y, "mem:") + 1;
-@@ -610,7 +629,8 @@ mem_draw(XColor color, int x, int y)
+@@ -610,7 +610,8 @@ mem_draw(XColor color, int x, int y)
if ((sysinfo.memory[time][MEM_ACT] != 0)
|| (sysinfo.memory[time][MEM_TOT] != 0)
@@ -186,7 +375,7 @@ Index: stats.c
/* draw yellow (total) bar */
-@@ -627,6 +647,13 @@ mem_draw(XColor color, int x, int y)
+@@ -627,6 +628,13 @@ mem_draw(XColor color, int x, int y)
XDrawLine(XINFO.disp, XINFO.buf, XINFO.gc,
x + col, XINFO.height - h,
x + col, XINFO.height);
@@ -200,7 +389,7 @@ Index: stats.c
}
time = (time + 1) % sysinfo.hist_size;
-@@ -639,6 +666,8 @@ mem_draw(XColor color, int x, int y)
+@@ -639,6 +647,8 @@ mem_draw(XColor color, int x, int y)
x += render_text(COLOR_YELLOW, x, y, fmtmem(sysinfo.memory[cur][MEM_TOT]));
x += render_text(color, x, y, "/");
x += render_text(COLOR_GREEN, x, y, fmtmem(sysinfo.memory[cur][MEM_FRE]));
Index: patches/patch-stats_h
===================================================================
RCS file: /cvs/ports/sysutils/xstatbar/patches/patch-stats_h,v
retrieving revision 1.3
diff -u -p -r1.3 patch-stats_h
--- patches/patch-stats_h 24 Feb 2019 15:02:19 -0000 1.3
+++ patches/patch-stats_h 10 Apr 2020 15:32:32 -0000
@@ -2,8 +2,15 @@ $OpenBSD: patch-stats_h,v 1.3 2019/02/24
Index: stats.h
--- stats.h.orig
+++ stats.h
-@@ -30,10 +30,12 @@
- #include <sys/audioio.h>
+@@ -25,15 +25,18 @@
+ #include <fcntl.h>
+ #include <math.h>
+ #include <err.h>
++#include <poll.h>
++#include <sndio.h>
+
+ #include <machine/apmvar.h>
+-#include <sys/audioio.h>
#include <sys/ioctl.h>
#include <sys/param.h>
+#include <sys/mount.h>
@@ -15,7 +22,30 @@ Index: stats.h
#include "xstatbar.h"
-@@ -74,6 +76,8 @@ typedef struct {
+@@ -45,14 +48,14 @@
+ /* volume */
+ typedef struct {
+ bool is_setup;
+-
+- int dev_fd;
+- int master_idx;
+-
+- int max;
+- int nchan;
+- int left;
+- int right;
++ struct sioctl_hdl *hdl;
++ struct pollfd *pfds;
++ int left;
++ int left_addr;
++ int left_max;
++ int right;
++ int right_addr;
++ int right_max;
+ } volume_info_t;
+ extern volume_info_t volume;
+
+@@ -74,6 +77,8 @@ typedef struct {
int swap_used; /* swap space used */
int swap_total; /* total amount of swap space */
@@ -24,7 +54,7 @@ Index: stats.h
/* cpu/memory historical stuff (for graphs) */
-@@ -84,6 +88,7 @@ typedef struct {
+@@ -84,6 +89,7 @@ typedef struct {
#define MEM_ACT 0
#define MEM_TOT 1
#define MEM_FRE 2