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

Reply via email to