=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/sndiod/dev_sioctl.c,v retrieving revision 1.6 retrieving revision 1.7 diff -c -r1.6 -r1.7 *** src/usr.bin/sndiod/dev_sioctl.c 2020/06/28 05:21:39 1.6 --- src/usr.bin/sndiod/dev_sioctl.c 2021/03/03 10:00:27 1.7 *************** *** 1,4 **** ! /* $OpenBSD: dev_sioctl.c,v 1.6 2020/06/28 05:21:39 ratchov Exp $ */ /* * Copyright (c) 2014-2020 Alexandre Ratchov * --- 1,4 ---- ! /* $OpenBSD: dev_sioctl.c,v 1.7 2021/03/03 10:00:27 ratchov Exp $ */ /* * Copyright (c) 2014-2020 Alexandre Ratchov * *************** *** 50,83 **** void dev_sioctl_ondesc(void *arg, struct sioctl_desc *desc, int val) { - #define GROUP_PREFIX "hw" - char group_buf[CTL_NAMEMAX], *group; struct dev *d = arg; ! int addr; if (desc == NULL) { dev_ctlsync(d); return; } ! addr = CTLADDR_END + desc->addr; ! dev_rmctl(d, addr); ! /* ! * prefix with "hw/" group names of controls we expose, to ! * ensure that all controls have unique names when multiple ! * sndiod's are chained ! */ ! if (strcmp(desc->group, "app") == 0 || (desc->group[0] == 0 && ! strcmp(desc->node0.name, "server") == 0)) { ! group = group_buf; ! if (snprintf(group_buf, CTL_NAMEMAX, GROUP_PREFIX "/%s", ! desc->group) >= CTL_NAMEMAX) return; ! } else ! group = desc->group; ! dev_addctl(d, group, desc->type, addr, desc->node0.name, desc->node0.unit, desc->func, desc->node1.name, desc->node1.unit, desc->maxval, val); } --- 50,76 ---- void dev_sioctl_ondesc(void *arg, struct sioctl_desc *desc, int val) { struct dev *d = arg; ! char *group, group_buf[CTL_NAMEMAX]; if (desc == NULL) { dev_ctlsync(d); return; } ! ctl_del(CTL_HW, d, &desc->addr); ! if (desc->group[0] == 0) ! group = d->name; ! else { ! if (snprintf(group_buf, CTL_NAMEMAX, "%s/%s", ! d->name, desc->group) >= CTL_NAMEMAX) return; ! group = group_buf; ! } ! ctl_new(CTL_HW, d, &desc->addr, ! desc->type, group, desc->node0.name, desc->node0.unit, desc->func, desc->node1.name, desc->node1.unit, desc->maxval, val); } *************** *** 88,95 **** struct dev *d = arg; struct ctl *c; - addr += CTLADDR_END; - dev_log(d); log_puts(": onctl: addr = "); log_putu(addr); --- 81,86 ---- *************** *** 97,104 **** log_putu(val); log_puts("\n"); ! for (c = d->ctl_list; c != NULL; c = c->next) { ! if (c->addr != addr) continue; ctl_log(c); log_puts(": new value -> "); --- 88,95 ---- log_putu(val); log_puts("\n"); ! for (c = ctl_list; c != NULL; c = c->next) { ! if (c->scope != CTL_HW || c->u.hw.addr != addr) continue; ctl_log(c); log_puts(": new value -> "); *************** *** 138,146 **** struct ctl *c, **pc; /* remove controls */ ! pc = &d->ctl_list; while ((c = *pc) != NULL) { ! if (c->addr >= CTLADDR_END) { c->refs_mask &= ~CTL_DEVMASK; if (c->refs_mask == 0) { *pc = c->next; --- 129,137 ---- struct ctl *c, **pc; /* remove controls */ ! pc = &ctl_list; while ((c = *pc) != NULL) { ! if (c->scope == CTL_HW && c->u.hw.dev == d) { c->refs_mask &= ~CTL_DEVMASK; if (c->refs_mask == 0) { *pc = c->next; *************** *** 162,169 **** struct ctl *c; int events = 0; ! for (c = d->ctl_list; c != NULL; c = c->next) { ! if (c->dirty) events |= POLLOUT; } return sioctl_pollfd(d->sioctl.hdl, pfd, events); --- 153,160 ---- struct ctl *c; int events = 0; ! for (c = ctl_list; c != NULL; c = c->next) { ! if (c->scope == CTL_HW && c->u.hw.dev == d && c->dirty) events |= POLLOUT; } return sioctl_pollfd(d->sioctl.hdl, pfd, events); *************** *** 195,205 **** * we've finished iterating on it. */ cnt = 0; ! for (c = d->ctl_list; c != NULL; c = c->next) { ! if (!c->dirty) continue; ! if (!sioctl_setval(d->sioctl.hdl, ! c->addr - CTLADDR_END, c->curval)) { ctl_log(c); log_puts(": set failed\n"); break; --- 186,195 ---- * we've finished iterating on it. */ cnt = 0; ! for (c = ctl_list; c != NULL; c = c->next) { ! if (c->scope != CTL_HW || c->u.hw.dev != d || !c->dirty) continue; ! if (!sioctl_setval(d->sioctl.hdl, c->u.hw.addr, c->curval)) { ctl_log(c); log_puts(": set failed\n"); break;