diff options
author | Ulrich Drepper <drepper@redhat.com> | 2008-07-24 00:29:27 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-24 13:47:28 -0400 |
commit | a0998b50c3f0b8fdd265c63e0032f86ebe377dbf (patch) | |
tree | 9132ecb7ef925374edabcaeea44e0287eb5043f4 /include/linux/syscalls.h | |
parent | 11fcb6c14676023d0bd437841f5dcd670e7990a0 (diff) |
flag parameters: epoll_create
This patch adds the new epoll_create2 syscall. It extends the old epoll_create
syscall by one parameter which is meant to hold a flag value. In this
patch the only flag support is EPOLL_CLOEXEC which causes the close-on-exec
flag for the returned file descriptor to be set.
A new name EPOLL_CLOEXEC is introduced which in this implementation must
have the same value as O_CLOEXEC.
The following test must be adjusted for architectures other than x86 and
x86-64 and in case the syscall numbers changed.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <fcntl.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sys/syscall.h>
#ifndef __NR_epoll_create2
# ifdef __x86_64__
# define __NR_epoll_create2 291
# elif defined __i386__
# define __NR_epoll_create2 329
# else
# error "need __NR_epoll_create2"
# endif
#endif
#define EPOLL_CLOEXEC O_CLOEXEC
int
main (void)
{
int fd = syscall (__NR_epoll_create2, 1, 0);
if (fd == -1)
{
puts ("epoll_create2(0) failed");
return 1;
}
int coe = fcntl (fd, F_GETFD);
if (coe == -1)
{
puts ("fcntl failed");
return 1;
}
if (coe & FD_CLOEXEC)
{
puts ("epoll_create2(0) set close-on-exec flag");
return 1;
}
close (fd);
fd = syscall (__NR_epoll_create2, 1, EPOLL_CLOEXEC);
if (fd == -1)
{
puts ("epoll_create2(EPOLL_CLOEXEC) failed");
return 1;
}
coe = fcntl (fd, F_GETFD);
if (coe == -1)
{
puts ("fcntl failed");
return 1;
}
if ((coe & FD_CLOEXEC) == 0)
{
puts ("epoll_create2(EPOLL_CLOEXEC) set close-on-exec flag");
return 1;
}
close (fd);
puts ("OK");
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Signed-off-by: Ulrich Drepper <drepper@redhat.com>
Acked-by: Davide Libenzi <davidel@xmailserver.org>
Cc: Michael Kerrisk <mtk.manpages@googlemail.com>
Cc: <linux-arch@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/syscalls.h')
-rw-r--r-- | include/linux/syscalls.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 9ab09926a7f2..85953240f28c 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
@@ -430,6 +430,7 @@ asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds, | |||
430 | asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, | 430 | asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp, |
431 | fd_set __user *exp, struct timeval __user *tvp); | 431 | fd_set __user *exp, struct timeval __user *tvp); |
432 | asmlinkage long sys_epoll_create(int size); | 432 | asmlinkage long sys_epoll_create(int size); |
433 | asmlinkage long sys_epoll_create2(int size, int flags); | ||
433 | asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, | 434 | asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, |
434 | struct epoll_event __user *event); | 435 | struct epoll_event __user *event); |
435 | asmlinkage long sys_epoll_wait(int epfd, struct epoll_event __user *events, | 436 | asmlinkage long sys_epoll_wait(int epfd, struct epoll_event __user *events, |