1
/* Poll system call, with emulation if it is not available.
2
Copyright (C) 1997,1998,1999,2000,2001,2002,2006
3
Free Software Foundation, Inc.
4
This file is part of the GNU C Library.
6
The GNU C Library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Lesser General Public
8
License as published by the Free Software Foundation; either
9
version 2.1 of the License, or (at your option) any later version.
11
The GNU C Library is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
Lesser General Public License for more details.
16
You should have received a copy of the GNU Lesser General Public
17
License along with the GNU C Library; if not, write to the Free
18
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24
#include <sysdep-cancel.h>
25
#include <sys/syscall.h>
26
#include <bp-checks.h>
28
#include <kernel-features.h>
30
#if defined __NR_poll || __ASSUME_POLL_SYSCALL > 0
32
# if __ASSUME_POLL_SYSCALL == 0
33
static int __emulate_poll (struct pollfd *fds, nfds_t nfds,
34
int timeout) internal_function;
38
# if __ASSUME_POLL_SYSCALL == 0
39
/* For loser kernels. */
41
loser_poll (struct pollfd *fds, nfds_t nfds, int timeout)
43
static int must_emulate;
47
int errno_saved = errno;
48
int retval = INLINE_SYSCALL (poll, 3, CHECK_N (fds, nfds), nfds,
51
if (retval >= 0 || errno != ENOSYS)
54
__set_errno (errno_saved);
58
return __emulate_poll (fds, nfds, timeout);
63
/* The real implementation. */
65
__poll (fds, nfds, timeout)
70
# if __ASSUME_POLL_SYSCALL == 0
72
return loser_poll (CHECK_N (fds, nfds), nfds, timeout);
74
int oldtype = LIBC_CANCEL_ASYNC ();
76
int result = loser_poll (CHECK_N (fds, nfds), nfds, timeout);
78
LIBC_CANCEL_RESET (oldtype);
83
return INLINE_SYSCALL (poll, 3, CHECK_N (fds, nfds), nfds, timeout);
85
int oldtype = LIBC_CANCEL_ASYNC ();
87
int result = INLINE_SYSCALL (poll, 3, CHECK_N (fds, nfds), nfds, timeout);
89
LIBC_CANCEL_RESET (oldtype);
94
libc_hidden_def (__poll)
95
weak_alias (__poll, poll)
96
strong_alias (__poll, __libc_poll)
98
/* Get the emulation code. */
99
# define __poll(fds, nfds, timeout) \
100
static internal_function __emulate_poll (fds, nfds, timeout)
103
#if __ASSUME_POLL_SYSCALL == 0
104
# include <sysdeps/unix/bsd/poll.c>