haproxy/include/common/accept4.h
Willy Tarreau c3e926bf3b CLEANUP: remove support for Linux i686 vsyscalls
This was introduced 10 years ago to squeeze a few CPU cycles per syscall
on 32-bit x86 machines and was already quite old by then, requiring to
explicitly enable support for this in the kernel. We don't even know if
it still builds, let alone if it works at all on recent kernels! Let's
completely drop this now.
2020-03-10 06:55:52 +01:00

70 lines
2.1 KiB
C

/*
* include/common/accept4.h
* Definition of the accept4 system call for older Linux libc.
*
* Copyright 2000-2012 Willy Tarreau <w@1wt.eu>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, version 2.1
* exclusively.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef _COMMON_ACCEPT4_H
#define _COMMON_ACCEPT4_H
#if defined (__linux__) && defined(USE_ACCEPT4)
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/syscall.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <common/syscall.h>
/* On recent Linux kernels, the accept4() syscall may be used to avoid an fcntl()
* call to set O_NONBLOCK on the resulting socket. It was introduced in Linux
* 2.6.28 and is not present in older libcs.
*/
#ifndef SOCK_NONBLOCK
#define SOCK_NONBLOCK O_NONBLOCK
#endif
#if defined(USE_MY_ACCEPT4) || (!defined(SYS_ACCEPT4) && !defined(__NR_accept4))
#if ACCEPT4_USE_SOCKETCALL
static inline _syscall2(int, socketcall, int, call, unsigned long *, args);
static int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)
{
unsigned long args[4];
args[0] = (unsigned long)sockfd;
args[1] = (unsigned long)addr;
args[2] = (unsigned long)addrlen;
args[3] = (unsigned long)flags;
return socketcall(SYS_ACCEPT4, args);
}
#else
static inline _syscall4(int, accept4, int, sockfd, struct sockaddr *, addr, socklen_t *, addrlen, int, flags);
#endif /* ACCEPT4_USE_SOCKETCALL etc... */
#endif /* USE_MY_ACCEPT4 */
#endif /* __linux__ && USE_ACCEPT4 */
#endif /* _COMMON_ACCEPT4_H */
/*
* Local variables:
* c-indent-level: 8
* c-basic-offset: 8
* End:
*/