1 /*
2  * include/common/epoll.h
3  * epoll definitions for older libc.
4  *
5  * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation, version 2.1
10  * exclusively.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21 
22 /*
23  * Those constants were found both in glibc and in the Linux kernel.
24  * They are provided here because the epoll() syscall is featured in
25  * some kernels but in not often included in the glibc, so it needs
26  * just a basic definition.
27  */
28 
29 #ifndef _COMMON_EPOLL_H
30 #define _COMMON_EPOLL_H
31 
32 #if defined (__linux__) && defined(ENABLE_EPOLL)
33 
34 #ifndef USE_MY_EPOLL
35 #include <sys/epoll.h>
36 #else
37 
38 #include <errno.h>
39 #include <sys/types.h>
40 #include <linux/unistd.h>
41 #include <sys/syscall.h>
42 #include <common/config.h>
43 #include <common/syscall.h>
44 
45 /* epoll_ctl() commands */
46 #ifndef EPOLL_CTL_ADD
47 #define EPOLL_CTL_ADD 1
48 #define EPOLL_CTL_DEL 2
49 #define EPOLL_CTL_MOD 3
50 #endif
51 
52 /* events types (bit fields) */
53 #ifndef EPOLLIN
54 #define EPOLLIN 1
55 #define EPOLLPRI 2
56 #define EPOLLOUT 4
57 #define EPOLLERR 8
58 #define EPOLLHUP 16
59 #define EPOLLONESHOT (1 << 30)
60 #define EPOLLET (1 << 31)
61 #endif
62 
63 struct epoll_event {
64 	uint32_t events;
65 	union {
66 		void *ptr;
67 		int fd;
68 		uint32_t u32;
69 		uint64_t u64;
70 	} data;
71 };
72 
73 #if defined(CONFIG_HAP_LINUX_VSYSCALL) && defined(__linux__) && defined(__i386__)
74 /* Those are our self-defined functions */
75 extern int epoll_create(int size);
76 extern int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event);
77 extern int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
78 #else
79 
80 /* We'll define a syscall, so for this we need __NR_splice. It should have
81  * been provided by syscall.h.
82  */
83 #if !defined(__NR_epoll_ctl)
84 #warning unsupported architecture, guessing __NR_epoll_create=254 like x86...
85 #define __NR_epoll_create 254
86 #define __NR_epoll_ctl    255
87 #define __NR_epoll_wait   256
88 #endif /* __NR_epoll_ctl */
89 
90 static inline _syscall1 (int, epoll_create, int, size);
91 static inline _syscall4 (int, epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event *, event);
92 static inline _syscall4 (int, epoll_wait, int, epfd, struct epoll_event *, events, int, maxevents, int, timeout);
93 #endif /* VSYSCALL */
94 
95 #endif /* USE_MY_EPOLL */
96 
97 #endif /* __linux__ && ENABLE_EPOLL */
98 
99 #endif /* _COMMON_EPOLL_H */
100 
101 /*
102  * Local variables:
103  *  c-indent-level: 8
104  *  c-basic-offset: 8
105  * End:
106  */
107