Compatibility of signalfd/eventfd with older kernels.

This commit is contained in:
Ulrich Drepper 2009-07-26 12:55:03 -07:00
parent e28b969b49
commit aa7492d20e
4 changed files with 34 additions and 6 deletions

View File

@ -1,5 +1,13 @@
2009-07-26 Ulrich Drepper <drepper@redhat.com> 2009-07-26 Ulrich Drepper <drepper@redhat.com>
[BZ #10422]
* sysdeps/unix/sysv/linux/eventfd.c: Add compatibility for old
kernels, dropped when eventfd2 support was added.
* sysdeps/unix/sysv/linux/signalfd.c: Add compatibility for old
kernels, dropped when signalfd4 support was added.
* sysdeps/unix/sysv/linux/kernel-features.h: More CLOEXEC syscalls
added, name them.
[BZ #10452] [BZ #10452]
* resolv/res_send.c (send_dg): Pass full SERVFAIL, NOTIMP, REFUSED * resolv/res_send.c (send_dg): Pass full SERVFAIL, NOTIMP, REFUSED
replies up. replies up.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2007, 2008 Free Software Foundation, Inc. /* Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,14 +19,21 @@
#include <errno.h> #include <errno.h>
#include <sys/eventfd.h> #include <sys/eventfd.h>
#include <sysdep.h> #include <sysdep.h>
#include <kernel-features.h>
int int
eventfd (int count, int flags) eventfd (int count, int flags)
{ {
#ifdef __NR_eventfd2 #ifdef __NR_eventfd2
return INLINE_SYSCALL (eventfd2, 2, count, flags); int res = INLINE_SYSCALL (eventfd2, 2, count, flags);
#else # ifndef __ASSUME_EVENTFD2
if (res != -1 || errno != ENOSYS)
# endif
return res;
#endif
#ifndef __ASSUME_EVENTFD2
/* The old system call has no flag parameter which is bad. So we have /* The old system call has no flag parameter which is bad. So we have
to wait until we have to support to pass additional values to the to wait until we have to support to pass additional values to the
kernel (sys_indirect) before implementing setting flags like kernel (sys_indirect) before implementing setting flags like
@ -43,5 +50,7 @@ eventfd (int count, int flags)
__set_errno (ENOSYS); __set_errno (ENOSYS);
return -1; return -1;
# endif # endif
#elif !defined __NR_eventfd2
# error "__ASSUME_EVENTFD2 defined but not __NR_eventfd2"
#endif #endif
} }

View File

@ -516,6 +516,8 @@
# define __ASSUME_SOCK_CLOEXEC 1 # define __ASSUME_SOCK_CLOEXEC 1
# define __ASSUME_IN_NONBLOCK 1 # define __ASSUME_IN_NONBLOCK 1
# define __ASSUME_PIPE2 1 # define __ASSUME_PIPE2 1
# define __ASSUME_EVENTFD2 1
# define __ASSUME_SIGNALFD4 1
#endif #endif
/* Support for the accept4 syscall was added in 2.6.28. */ /* Support for the accept4 syscall was added in 2.6.28. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2007, 2008 Free Software Foundation, Inc. /* Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -20,14 +20,21 @@
#include <signal.h> #include <signal.h>
#include <sys/signalfd.h> #include <sys/signalfd.h>
#include <sysdep.h> #include <sysdep.h>
#include <kernel-features.h>
int int
signalfd (int fd, const sigset_t *mask, int flags) signalfd (int fd, const sigset_t *mask, int flags)
{ {
#ifdef __NR_signalfd4 #ifdef __NR_signalfd4
return INLINE_SYSCALL (signalfd4, 4, fd, mask, _NSIG / 8, flags); int res = INLINE_SYSCALL (signalfd4, 4, fd, mask, _NSIG / 8, flags);
#else # ifndef __ASSUME_SIGNALFD4
if (res != -1 || errno != ENOSYS)
# endif
return res;
#endif
#ifndef __ASSUME_SIGNALFD4
/* The old system call has no flag parameter which is bad. So we have /* The old system call has no flag parameter which is bad. So we have
to wait until we have to support to pass additional values to the to wait until we have to support to pass additional values to the
kernel (sys_indirect) before implementing setting flags like kernel (sys_indirect) before implementing setting flags like
@ -44,5 +51,7 @@ signalfd (int fd, const sigset_t *mask, int flags)
__set_errno (ENOSYS); __set_errno (ENOSYS);
return -1; return -1;
# endif # endif
#elif !defined __NR_signalfd4
# error "__ASSUME_SIGNALFD4 defined but not __NR_signalfd4"
#endif #endif
} }