1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* Linux select implementation.
- Copyright (C) 2017-2019 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library. If not, see
- <http://www.gnu.org/licenses/>. */
- #include <sys/time.h>
- #include <sys/types.h>
- #include <sys/select.h>
- #include <errno.h>
- #include <sysdep-cancel.h>
- /* Check the first NFDS descriptors each in READFDS (if not NULL) for read
- readiness, in WRITEFDS (if not NULL) for write readiness, and in EXCEPTFDS
- (if not NULL) for exceptional conditions. If TIMEOUT is not NULL, time out
- after waiting the interval specified therein. Returns the number of ready
- descriptors, or -1 for errors. */
- #ifdef __NR__newselect
- # undef __NR_select
- # define __NR_select __NR__newselect
- #endif
- int
- __select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
- struct timeval *timeout)
- {
- #ifdef __NR_select
- return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds,
- timeout);
- #else
- int result;
- struct timespec ts, *tsp = NULL;
- if (timeout)
- {
- TIMEVAL_TO_TIMESPEC (timeout, &ts);
- tsp = &ts;
- }
- result = SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, tsp,
- NULL);
- if (timeout)
- {
- /* Linux by default will update the timeout after a pselect6 syscall
- (though the pselect() glibc call suppresses this behavior).
- Since select() on Linux has the same behavior as the pselect6
- syscall, we update the timeout here. */
- TIMESPEC_TO_TIMEVAL (timeout, &ts);
- }
- return result;
- #endif
- }
- libc_hidden_def (__select)
- weak_alias (__select, select)
- weak_alias (__select, __libc_select)
|