=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/sndiod/sock.c,v retrieving revision 1.41 retrieving revision 1.42 diff -c -r1.41 -r1.42 *** src/usr.bin/sndiod/sock.c 2021/01/29 11:38:23 1.41 --- src/usr.bin/sndiod/sock.c 2021/03/03 10:00:27 1.42 *************** *** 1,4 **** ! /* $OpenBSD: sock.c,v 1.41 2021/01/29 11:38:23 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * --- 1,4 ---- ! /* $OpenBSD: sock.c,v 1.42 2021/03/03 10:00:27 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * *************** *** 1240,1247 **** f->lastvol = ctl; /* dont trigger feedback message */ slot_setvol(s, ctl); dev_midi_vol(s->opt->dev, s); ! dev_onval(s->opt->dev, ! CTLADDR_SLOT_LEVEL(f->slot - slot_array), ctl); break; case AMSG_CTLSUB: #ifdef DEBUG --- 1240,1246 ---- f->lastvol = ctl; /* dont trigger feedback message */ slot_setvol(s, ctl); dev_midi_vol(s->opt->dev, s); ! ctl_onval(CTL_SLOT_LEVEL, s, NULL, ctl); break; case AMSG_CTLSUB: #ifdef DEBUG *************** *** 1267,1275 **** if (m->u.ctlsub.desc) { if (!(f->ctlops & SOCK_CTLDESC)) { ctl = f->ctlslot->self; ! c = f->ctlslot->opt->dev->ctl_list; while (c != NULL) { ! c->desc_mask |= ctl; c = c->next; } f->ctlops |= SOCK_CTLDESC; --- 1266,1275 ---- if (m->u.ctlsub.desc) { if (!(f->ctlops & SOCK_CTLDESC)) { ctl = f->ctlslot->self; ! c = ctl_list; while (c != NULL) { ! if (ctlslot_visible(f->ctlslot, c)) ! c->desc_mask |= ctl; c = c->next; } f->ctlops |= SOCK_CTLDESC; *************** *** 1301,1318 **** sock_close(f); return 0; } ! if (!dev_setctl(f->ctlslot->opt->dev, ! ntohs(m->u.ctlset.addr), ! ntohs(m->u.ctlset.val))) { #ifdef DEBUG if (log_level >= 1) { sock_log(f); ! log_puts(": CTLSET, wrong addr/val\n"); } #endif sock_close(f); return 0; } f->rtodo = sizeof(struct amsg); f->rstate = SOCK_RMSG; break; --- 1301,1328 ---- sock_close(f); return 0; } ! ! c = ctlslot_lookup(f->ctlslot, ntohs(m->u.ctlset.addr)); ! if (c == NULL) { #ifdef DEBUG if (log_level >= 1) { sock_log(f); ! log_puts(": CTLSET, wrong addr\n"); } #endif sock_close(f); return 0; } + if (!ctl_setval(c, ntohs(m->u.ctlset.val))) { + #ifdef DEBUG + if (log_level >= 1) { + sock_log(f); + log_puts(": CTLSET, bad value\n"); + } + #endif + sock_close(f); + return 0; + } f->rtodo = sizeof(struct amsg); f->rstate = SOCK_RMSG; break; *************** *** 1403,1409 **** int sock_buildmsg(struct sock *f) { ! unsigned int size, mask; struct amsg_ctl_desc *desc; struct ctl *c, **pc; --- 1413,1419 ---- int sock_buildmsg(struct sock *f) { ! unsigned int size, type, mask; struct amsg_ctl_desc *desc; struct ctl *c, **pc; *************** *** 1555,1561 **** desc = f->ctldesc; mask = f->ctlslot->self; size = 0; ! pc = &f->ctlslot->opt->dev->ctl_list; while ((c = *pc) != NULL) { if ((c->desc_mask & mask) == 0 || (c->refs_mask & mask) == 0) { --- 1565,1571 ---- desc = f->ctldesc; mask = f->ctlslot->self; size = 0; ! pc = &ctl_list; while ((c = *pc) != NULL) { if ((c->desc_mask & mask) == 0 || (c->refs_mask & mask) == 0) { *************** *** 1567,1573 **** break; c->desc_mask &= ~mask; c->val_mask &= ~mask; ! strlcpy(desc->group, c->group, AMSG_CTL_NAMEMAX); strlcpy(desc->node0.name, c->node0.name, AMSG_CTL_NAMEMAX); --- 1577,1587 ---- break; c->desc_mask &= ~mask; c->val_mask &= ~mask; ! type = ctlslot_visible(f->ctlslot, c) ? ! c->type : CTL_NONE; ! strlcpy(desc->group, (f->ctlslot->opt == NULL || ! strcmp(c->group, f->ctlslot->opt->dev->name) != 0) ? ! c->group : "", AMSG_CTL_NAMEMAX); strlcpy(desc->node0.name, c->node0.name, AMSG_CTL_NAMEMAX); *************** *** 1575,1581 **** strlcpy(desc->node1.name, c->node1.name, AMSG_CTL_NAMEMAX); desc->node1.unit = ntohs(c->node1.unit); ! desc->type = c->type; strlcpy(desc->func, c->func, AMSG_CTL_NAMEMAX); desc->addr = htons(c->addr); desc->maxval = htons(c->maxval); --- 1589,1595 ---- strlcpy(desc->node1.name, c->node1.name, AMSG_CTL_NAMEMAX); desc->node1.unit = ntohs(c->node1.unit); ! desc->type = type; strlcpy(desc->func, c->func, AMSG_CTL_NAMEMAX); desc->addr = htons(c->addr); desc->maxval = htons(c->maxval); *************** *** 1584,1590 **** desc++; /* if this is a deleted entry unref it */ ! if (c->type == CTL_NONE) { c->refs_mask &= ~mask; if (c->refs_mask == 0) { *pc = c->next; --- 1598,1604 ---- desc++; /* if this is a deleted entry unref it */ ! if (type == CTL_NONE) { c->refs_mask &= ~mask; if (c->refs_mask == 0) { *pc = c->next; *************** *** 1612,1618 **** } if (f->ctlslot && (f->ctlops & SOCK_CTLVAL)) { mask = f->ctlslot->self; ! for (c = f->ctlslot->opt->dev->ctl_list; c != NULL; c = c->next) { if ((c->val_mask & mask) == 0) continue; c->val_mask &= ~mask; --- 1626,1634 ---- } if (f->ctlslot && (f->ctlops & SOCK_CTLVAL)) { mask = f->ctlslot->self; ! for (c = ctl_list; c != NULL; c = c->next) { ! if (!ctlslot_visible(f->ctlslot, c)) ! continue; if ((c->val_mask & mask) == 0) continue; c->val_mask &= ~mask;