1*6236dae4SAndroid Build Coastguard Worker #ifndef HEADER_CURL_SOCKETPAIR_H 2*6236dae4SAndroid Build Coastguard Worker #define HEADER_CURL_SOCKETPAIR_H 3*6236dae4SAndroid Build Coastguard Worker /*************************************************************************** 4*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _ 5*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| | 6*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | | 7*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___ 8*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____| 9*6236dae4SAndroid Build Coastguard Worker * 10*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al. 11*6236dae4SAndroid Build Coastguard Worker * 12*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which 13*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms 14*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html. 15*6236dae4SAndroid Build Coastguard Worker * 16*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell 17*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is 18*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file. 19*6236dae4SAndroid Build Coastguard Worker * 20*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied. 22*6236dae4SAndroid Build Coastguard Worker * 23*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl 24*6236dae4SAndroid Build Coastguard Worker * 25*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/ 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h" 28*6236dae4SAndroid Build Coastguard Worker 29*6236dae4SAndroid Build Coastguard Worker #if defined(HAVE_EVENTFD) && \ 30*6236dae4SAndroid Build Coastguard Worker defined(__x86_64__) && \ 31*6236dae4SAndroid Build Coastguard Worker defined(__aarch64__) && \ 32*6236dae4SAndroid Build Coastguard Worker defined(__ia64__) && \ 33*6236dae4SAndroid Build Coastguard Worker defined(__ppc64__) && \ 34*6236dae4SAndroid Build Coastguard Worker defined(__mips64) && \ 35*6236dae4SAndroid Build Coastguard Worker defined(__sparc64__) && \ 36*6236dae4SAndroid Build Coastguard Worker defined(__riscv_64e) && \ 37*6236dae4SAndroid Build Coastguard Worker defined(__s390x__) 38*6236dae4SAndroid Build Coastguard Worker 39*6236dae4SAndroid Build Coastguard Worker /* Use eventfd only with 64-bit CPU architectures because eventfd has a 40*6236dae4SAndroid Build Coastguard Worker * stringent rule of requiring the 8-byte buffer when calling read(2) and 41*6236dae4SAndroid Build Coastguard Worker * write(2) on it. In some rare cases, the C standard library implementation 42*6236dae4SAndroid Build Coastguard Worker * on a 32-bit system might choose to define uint64_t as a 32-bit type for 43*6236dae4SAndroid Build Coastguard Worker * various reasons (memory limitations, compatibility with older code), 44*6236dae4SAndroid Build Coastguard Worker * which makes eventfd broken. 45*6236dae4SAndroid Build Coastguard Worker */ 46*6236dae4SAndroid Build Coastguard Worker #define USE_EVENTFD 1 47*6236dae4SAndroid Build Coastguard Worker 48*6236dae4SAndroid Build Coastguard Worker #define wakeup_write write 49*6236dae4SAndroid Build Coastguard Worker #define wakeup_read read 50*6236dae4SAndroid Build Coastguard Worker #define wakeup_close close 51*6236dae4SAndroid Build Coastguard Worker #define wakeup_create(p,nb) Curl_eventfd(p,nb) 52*6236dae4SAndroid Build Coastguard Worker 53*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h> 54*6236dae4SAndroid Build Coastguard Worker int Curl_eventfd(curl_socket_t socks[2], bool nonblocking); 55*6236dae4SAndroid Build Coastguard Worker 56*6236dae4SAndroid Build Coastguard Worker #elif defined(HAVE_PIPE) 57*6236dae4SAndroid Build Coastguard Worker 58*6236dae4SAndroid Build Coastguard Worker #define wakeup_write write 59*6236dae4SAndroid Build Coastguard Worker #define wakeup_read read 60*6236dae4SAndroid Build Coastguard Worker #define wakeup_close close 61*6236dae4SAndroid Build Coastguard Worker #define wakeup_create(p,nb) Curl_pipe(p,nb) 62*6236dae4SAndroid Build Coastguard Worker 63*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h> 64*6236dae4SAndroid Build Coastguard Worker int Curl_pipe(curl_socket_t socks[2], bool nonblocking); 65*6236dae4SAndroid Build Coastguard Worker 66*6236dae4SAndroid Build Coastguard Worker #else /* !USE_EVENTFD && !HAVE_PIPE */ 67*6236dae4SAndroid Build Coastguard Worker 68*6236dae4SAndroid Build Coastguard Worker #define wakeup_write swrite 69*6236dae4SAndroid Build Coastguard Worker #define wakeup_read sread 70*6236dae4SAndroid Build Coastguard Worker #define wakeup_close sclose 71*6236dae4SAndroid Build Coastguard Worker 72*6236dae4SAndroid Build Coastguard Worker #if defined(USE_UNIX_SOCKETS) && defined(HAVE_SOCKETPAIR) 73*6236dae4SAndroid Build Coastguard Worker #define SOCKETPAIR_FAMILY AF_UNIX 74*6236dae4SAndroid Build Coastguard Worker #elif !defined(HAVE_SOCKETPAIR) 75*6236dae4SAndroid Build Coastguard Worker #define SOCKETPAIR_FAMILY 0 /* not used */ 76*6236dae4SAndroid Build Coastguard Worker #else 77*6236dae4SAndroid Build Coastguard Worker #error "unsupported Unix domain and socketpair build combo" 78*6236dae4SAndroid Build Coastguard Worker #endif 79*6236dae4SAndroid Build Coastguard Worker 80*6236dae4SAndroid Build Coastguard Worker #ifdef SOCK_CLOEXEC 81*6236dae4SAndroid Build Coastguard Worker #define SOCKETPAIR_TYPE (SOCK_STREAM | SOCK_CLOEXEC) 82*6236dae4SAndroid Build Coastguard Worker #else 83*6236dae4SAndroid Build Coastguard Worker #define SOCKETPAIR_TYPE SOCK_STREAM 84*6236dae4SAndroid Build Coastguard Worker #endif 85*6236dae4SAndroid Build Coastguard Worker 86*6236dae4SAndroid Build Coastguard Worker #define wakeup_create(p,nb)\ 87*6236dae4SAndroid Build Coastguard Worker Curl_socketpair(SOCKETPAIR_FAMILY, SOCKETPAIR_TYPE, 0, p, nb) 88*6236dae4SAndroid Build Coastguard Worker 89*6236dae4SAndroid Build Coastguard Worker #endif /* USE_EVENTFD */ 90*6236dae4SAndroid Build Coastguard Worker 91*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_SOCKETPAIR 92*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h> 93*6236dae4SAndroid Build Coastguard Worker 94*6236dae4SAndroid Build Coastguard Worker int Curl_socketpair(int domain, int type, int protocol, 95*6236dae4SAndroid Build Coastguard Worker curl_socket_t socks[2], bool nonblocking); 96*6236dae4SAndroid Build Coastguard Worker #endif 97*6236dae4SAndroid Build Coastguard Worker 98*6236dae4SAndroid Build Coastguard Worker #endif /* HEADER_CURL_SOCKETPAIR_H */ 99