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