Blame sysdeps/unix/sysv/linux/select.c

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