version 1.4, 2020/04/16 12:26:55 |
version 1.5, 2020/04/24 11:33:28 |
|
|
} |
} |
sioctl_ondesc(d->sioctl.hdl, dev_sioctl_ondesc, d); |
sioctl_ondesc(d->sioctl.hdl, dev_sioctl_ondesc, d); |
sioctl_onval(d->sioctl.hdl, dev_sioctl_onval, d); |
sioctl_onval(d->sioctl.hdl, dev_sioctl_onval, d); |
d->sioctl.file = file_new(&dev_sioctl_ops, d, "mix", |
|
sioctl_nfds(d->sioctl.hdl)); |
|
} |
} |
|
|
/* |
/* |
|
|
void |
void |
dev_sioctl_close(struct dev *d) |
dev_sioctl_close(struct dev *d) |
{ |
{ |
if (d->sioctl.hdl == NULL) |
struct ctl *c, **pc; |
return; |
|
file_del(d->sioctl.file); |
/* 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; |
|
xfree(c); |
|
continue; |
|
} |
|
c->type = CTL_NONE; |
|
c->desc_mask = ~0; |
|
} |
|
pc = &c->next; |
|
} |
|
dev_ctlsync(d); |
} |
} |
|
|
int |
int |
|
|
struct dev *d = arg; |
struct dev *d = arg; |
|
|
dev_sioctl_close(d); |
dev_sioctl_close(d); |
|
file_del(d->sioctl.file); |
|
sioctl_close(d->sioctl.hdl); |
|
d->sioctl.hdl = NULL; |
} |
} |