From 0d11cb1e538fbb2f213d664f8baf07bb316251d0 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sat, 14 Feb 2004 18:42:17 +0000 Subject: [PATCH] fixes in select() mangling --- alsa/pcm.c | 30 ++++++++++++++++++------------ oss-redir/oss-redir.c | 6 ++++-- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/alsa/pcm.c b/alsa/pcm.c index 197d40a..7ad7e66 100644 --- a/alsa/pcm.c +++ b/alsa/pcm.c @@ -1294,15 +1294,21 @@ int lib_oss_pcm_select_prepare(int fd, fd_set *readfds, fd_set *writefds, fd_set for (j = 0; j < count; j++) { int fd = ufds[j].fd; unsigned short events = ufds[j].events; - FD_CLR(fd, readfds); - FD_CLR(fd, writefds); - FD_CLR(fd, exceptfds); - if (events & POLLIN) - FD_SET(fd, readfds); - if (events & POLLOUT) - FD_SET(fd, writefds); - if (events & (POLLERR|POLLNVAL)) - FD_SET(fd, exceptfds); + if (readfds) { + FD_CLR(fd, readfds); + if (events & POLLIN) + FD_SET(fd, readfds); + } + if (writefds) { + FD_CLR(fd, writefds); + if (events & POLLOUT) + FD_SET(fd, writefds); + } + if (exceptfds) { + FD_CLR(fd, exceptfds); + if (events & (POLLERR|POLLNVAL)) + FD_SET(fd, exceptfds); + } } } } @@ -1340,11 +1346,11 @@ int lib_oss_pcm_select_result(int fd, fd_set *readfds, fd_set *writefds, fd_set for (j = 0; j < count; j++) { int fd = ufds[j].fd; revents = 0; - if (FD_ISSET(fd, readfds)) + if (readfds && FD_ISSET(fd, readfds)) revents |= POLLIN; - if (FD_ISSET(fd, writefds)) + if (writefds && FD_ISSET(fd, writefds)) revents |= POLLOUT; - if (FD_ISSET(fd, exceptfds)) + if (exceptfds && FD_ISSET(fd, exceptfds)) revents |= POLLERR; ufds[j].revents = revents; } diff --git a/oss-redir/oss-redir.c b/oss-redir/oss-redir.c index d3128be..666eda3 100644 --- a/oss-redir/oss-redir.c +++ b/oss-redir/oss-redir.c @@ -81,11 +81,13 @@ static int native_pcm_select_prepare(int fd, fd_set *readfds, fd_set *writefds, return -EINVAL; if (readfds) { FD_SET(fd, readfds); - FD_SET(fd, exceptfds); + if (exceptfds) + FD_SET(fd, exceptfds); } if (writefds) { FD_SET(fd, writefds); - FD_SET(fd, exceptfds); + if (exceptfds) + FD_SET(fd, exceptfds); } return 0; } -- 2.47.1