diff options
author | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2012-11-30 20:44:32 +0000 |
---|---|---|
committer | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2012-11-30 20:44:32 +0000 |
commit | 34829fa6736a743192f05481ecf0fefb8b9fb47f (patch) | |
tree | abf856ae3e8b19be290eec162b46709618182fa3 /usr.bin/sndiod/dev.c | |
parent | cdbedee27801535be5e81b741ab5dab54fa3c012 (diff) |
When the audio device is closed, mark it as closed before
dropping connections otherwise clients may try to drain their
buffer and would attempt to reopen the device
Diffstat (limited to 'usr.bin/sndiod/dev.c')
-rw-r--r-- | usr.bin/sndiod/dev.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/usr.bin/sndiod/dev.c b/usr.bin/sndiod/dev.c index a6bc9855d8e..d41d6909149 100644 --- a/usr.bin/sndiod/dev.c +++ b/usr.bin/sndiod/dev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dev.c,v 1.2 2012/11/30 20:25:32 ratchov Exp $ */ +/* $OpenBSD: dev.c,v 1.3 2012/11/30 20:44:31 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov <alex@caoua.org> * @@ -77,13 +77,24 @@ unsigned int dev_sndnum = 0; void dev_log(struct dev *d) { +#ifdef DEBUG + static char *pstates[] = { + "cfg", "ini", "run" + }; +#endif log_puts("snd"); log_putu(d->num); +#ifdef DEBUG + if (log_level >= 3) { + log_puts(" pst="); + log_puts(pstates[d->pstate]); + } +#endif } void slot_log(struct slot *s) -{ +{ #ifdef DEBUG static char *pstates[] = { "ini", "sta", "rdy", "run", "stp", "mid" @@ -1121,7 +1132,8 @@ dev_open(struct dev *d) void dev_close(struct dev *d) { - struct slot *s, *snext; + int i; + struct slot *s; #ifdef DEBUG if (log_level >= 3) { @@ -1129,13 +1141,13 @@ dev_close(struct dev *d) log_puts(": closing\n"); } #endif - while ((s = d->slot_list) != NULL) { - snext = s->next; + d->pstate = DEV_CFG; + for (s = d->slot, i = DEV_NSLOT; i > 0; i--, s++) { if (s->ops) s->ops->exit(s->arg); s->ops = NULL; - d->slot_list = snext; } + d->slot_list = NULL; dev_sio_close(d); if (d->mode & MODE_PLAY) { if (d->encbuf != NULL) @@ -1148,7 +1160,6 @@ dev_close(struct dev *d) xfree(d->rbuf); } dev_clear(d); - d->pstate = DEV_CFG; } int @@ -1734,6 +1745,12 @@ slot_attach(struct slot *s) void slot_ready(struct slot *s) { + /* + * device may be disconnected, and if so we're called from + * slot->ops->exit() on a closed device + */ + if (s->dev->pstate == DEV_CFG) + return; if (s->tstate == MMC_OFF) slot_attach(s); else { |