Line data Source code
1 : /* Checking macros for poll functions.
2 : Copyright (C) 2012-2018 Free Software Foundation, Inc.
3 : This file is part of the GNU C Library.
4 :
5 : The GNU C Library is free software; you can redistribute it and/or
6 : modify it under the terms of the GNU Lesser General Public
7 : License as published by the Free Software Foundation; either
8 : version 2.1 of the License, or (at your option) any later version.
9 :
10 : The GNU C Library is distributed in the hope that it will be useful,
11 : but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 : Lesser General Public License for more details.
14 :
15 : You should have received a copy of the GNU Lesser General Public
16 : License along with the GNU C Library; if not, see
17 : <http://www.gnu.org/licenses/>. */
18 :
19 : #ifndef _SYS_POLL_H
20 : # error "Never include <bits/poll2.h> directly; use <sys/poll.h> instead."
21 : #endif
22 :
23 :
24 : __BEGIN_DECLS
25 :
26 : extern int __REDIRECT (__poll_alias, (struct pollfd *__fds, nfds_t __nfds,
27 : int __timeout), poll);
28 : extern int __poll_chk (struct pollfd *__fds, nfds_t __nfds, int __timeout,
29 : __SIZE_TYPE__ __fdslen);
30 : extern int __REDIRECT (__poll_chk_warn, (struct pollfd *__fds, nfds_t __nfds,
31 : int __timeout, __SIZE_TYPE__ __fdslen),
32 : __poll_chk)
33 : __warnattr ("poll called with fds buffer too small file nfds entries");
34 :
35 : __fortify_function int
36 : poll (struct pollfd *__fds, nfds_t __nfds, int __timeout)
37 : {
38 815378 : if (__bos (__fds) != (__SIZE_TYPE__) -1)
39 : {
40 0 : if (! __builtin_constant_p (__nfds))
41 0 : return __poll_chk (__fds, __nfds, __timeout, __bos (__fds));
42 0 : else if (__bos (__fds) / sizeof (*__fds) < __nfds)
43 0 : return __poll_chk_warn (__fds, __nfds, __timeout, __bos (__fds));
44 : }
45 :
46 829602 : return __poll_alias (__fds, __nfds, __timeout);
47 : }
48 :
49 :
50 : #ifdef __USE_GNU
51 : extern int __REDIRECT (__ppoll_alias, (struct pollfd *__fds, nfds_t __nfds,
52 : const struct timespec *__timeout,
53 : const __sigset_t *__ss), ppoll);
54 : extern int __ppoll_chk (struct pollfd *__fds, nfds_t __nfds,
55 : const struct timespec *__timeout,
56 : const __sigset_t *__ss, __SIZE_TYPE__ __fdslen);
57 : extern int __REDIRECT (__ppoll_chk_warn, (struct pollfd *__fds, nfds_t __nfds,
58 : const struct timespec *__timeout,
59 : const __sigset_t *__ss,
60 : __SIZE_TYPE__ __fdslen),
61 : __ppoll_chk)
62 : __warnattr ("ppoll called with fds buffer too small file nfds entries");
63 :
64 : __fortify_function int
65 : ppoll (struct pollfd *__fds, nfds_t __nfds, const struct timespec *__timeout,
66 : const __sigset_t *__ss)
67 : {
68 : if (__bos (__fds) != (__SIZE_TYPE__) -1)
69 : {
70 : if (! __builtin_constant_p (__nfds))
71 : return __ppoll_chk (__fds, __nfds, __timeout, __ss, __bos (__fds));
72 : else if (__bos (__fds) / sizeof (*__fds) < __nfds)
73 : return __ppoll_chk_warn (__fds, __nfds, __timeout, __ss,
74 : __bos (__fds));
75 : }
76 :
77 : return __ppoll_alias (__fds, __nfds, __timeout, __ss);
78 : }
79 : #endif
80 :
81 : __END_DECLS
|