1*de1e4e89SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*de1e4e89SAndroid Build Coastguard Worker /* 3*de1e4e89SAndroid Build Coastguard Worker * Compatibility interface for userspace libc header coordination: 4*de1e4e89SAndroid Build Coastguard Worker * 5*de1e4e89SAndroid Build Coastguard Worker * Define compatibility macros that are used to control the inclusion or 6*de1e4e89SAndroid Build Coastguard Worker * exclusion of UAPI structures and definitions in coordination with another 7*de1e4e89SAndroid Build Coastguard Worker * userspace C library. 8*de1e4e89SAndroid Build Coastguard Worker * 9*de1e4e89SAndroid Build Coastguard Worker * This header is intended to solve the problem of UAPI definitions that 10*de1e4e89SAndroid Build Coastguard Worker * conflict with userspace definitions. If a UAPI header has such conflicting 11*de1e4e89SAndroid Build Coastguard Worker * definitions then the solution is as follows: 12*de1e4e89SAndroid Build Coastguard Worker * 13*de1e4e89SAndroid Build Coastguard Worker * * Synchronize the UAPI header and the libc headers so either one can be 14*de1e4e89SAndroid Build Coastguard Worker * used and such that the ABI is preserved. If this is not possible then 15*de1e4e89SAndroid Build Coastguard Worker * no simple compatibility interface exists (you need to write translating 16*de1e4e89SAndroid Build Coastguard Worker * wrappers and rename things) and you can't use this interface. 17*de1e4e89SAndroid Build Coastguard Worker * 18*de1e4e89SAndroid Build Coastguard Worker * Then follow this process: 19*de1e4e89SAndroid Build Coastguard Worker * 20*de1e4e89SAndroid Build Coastguard Worker * (a) Include libc-compat.h in the UAPI header. 21*de1e4e89SAndroid Build Coastguard Worker * e.g. #include <linux/libc-compat.h> 22*de1e4e89SAndroid Build Coastguard Worker * This include must be as early as possible. 23*de1e4e89SAndroid Build Coastguard Worker * 24*de1e4e89SAndroid Build Coastguard Worker * (b) In libc-compat.h add enough code to detect that the comflicting 25*de1e4e89SAndroid Build Coastguard Worker * userspace libc header has been included first. 26*de1e4e89SAndroid Build Coastguard Worker * 27*de1e4e89SAndroid Build Coastguard Worker * (c) If the userspace libc header has been included first define a set of 28*de1e4e89SAndroid Build Coastguard Worker * guard macros of the form __UAPI_DEF_FOO and set their values to 1, else 29*de1e4e89SAndroid Build Coastguard Worker * set their values to 0. 30*de1e4e89SAndroid Build Coastguard Worker * 31*de1e4e89SAndroid Build Coastguard Worker * (d) Back in the UAPI header with the conflicting definitions, guard the 32*de1e4e89SAndroid Build Coastguard Worker * definitions with: 33*de1e4e89SAndroid Build Coastguard Worker * #if __UAPI_DEF_FOO 34*de1e4e89SAndroid Build Coastguard Worker * ... 35*de1e4e89SAndroid Build Coastguard Worker * #endif 36*de1e4e89SAndroid Build Coastguard Worker * 37*de1e4e89SAndroid Build Coastguard Worker * This fixes the situation where the linux headers are included *after* the 38*de1e4e89SAndroid Build Coastguard Worker * libc headers. To fix the problem with the inclusion in the other order the 39*de1e4e89SAndroid Build Coastguard Worker * userspace libc headers must be fixed like this: 40*de1e4e89SAndroid Build Coastguard Worker * 41*de1e4e89SAndroid Build Coastguard Worker * * For all definitions that conflict with kernel definitions wrap those 42*de1e4e89SAndroid Build Coastguard Worker * defines in the following: 43*de1e4e89SAndroid Build Coastguard Worker * #if !__UAPI_DEF_FOO 44*de1e4e89SAndroid Build Coastguard Worker * ... 45*de1e4e89SAndroid Build Coastguard Worker * #endif 46*de1e4e89SAndroid Build Coastguard Worker * 47*de1e4e89SAndroid Build Coastguard Worker * This prevents the redefinition of a construct already defined by the kernel. 48*de1e4e89SAndroid Build Coastguard Worker */ 49*de1e4e89SAndroid Build Coastguard Worker #ifndef _LIBC_COMPAT_H 50*de1e4e89SAndroid Build Coastguard Worker #define _LIBC_COMPAT_H 51*de1e4e89SAndroid Build Coastguard Worker 52*de1e4e89SAndroid Build Coastguard Worker /* We have included glibc headers... */ 53*de1e4e89SAndroid Build Coastguard Worker #if defined(__GLIBC__) 54*de1e4e89SAndroid Build Coastguard Worker 55*de1e4e89SAndroid Build Coastguard Worker /* Coordinate with glibc net/if.h header. */ 56*de1e4e89SAndroid Build Coastguard Worker #if defined(_NET_IF_H) && defined(__USE_MISC) 57*de1e4e89SAndroid Build Coastguard Worker 58*de1e4e89SAndroid Build Coastguard Worker /* GLIBC headers included first so don't define anything 59*de1e4e89SAndroid Build Coastguard Worker * that would already be defined. */ 60*de1e4e89SAndroid Build Coastguard Worker 61*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFCONF 0 62*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFMAP 0 63*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFNAMSIZ 0 64*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFREQ 0 65*de1e4e89SAndroid Build Coastguard Worker /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ 66*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0 67*de1e4e89SAndroid Build Coastguard Worker /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ 68*de1e4e89SAndroid Build Coastguard Worker #ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 69*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 70*de1e4e89SAndroid Build Coastguard Worker #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ 71*de1e4e89SAndroid Build Coastguard Worker 72*de1e4e89SAndroid Build Coastguard Worker #else /* _NET_IF_H */ 73*de1e4e89SAndroid Build Coastguard Worker 74*de1e4e89SAndroid Build Coastguard Worker /* Linux headers included first, and we must define everything 75*de1e4e89SAndroid Build Coastguard Worker * we need. The expectation is that glibc will check the 76*de1e4e89SAndroid Build Coastguard Worker * __UAPI_DEF_* defines and adjust appropriately. */ 77*de1e4e89SAndroid Build Coastguard Worker 78*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFCONF 1 79*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFMAP 1 80*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFNAMSIZ 1 81*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFREQ 1 82*de1e4e89SAndroid Build Coastguard Worker /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ 83*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 84*de1e4e89SAndroid Build Coastguard Worker /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ 85*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 86*de1e4e89SAndroid Build Coastguard Worker 87*de1e4e89SAndroid Build Coastguard Worker #endif /* _NET_IF_H */ 88*de1e4e89SAndroid Build Coastguard Worker 89*de1e4e89SAndroid Build Coastguard Worker /* Coordinate with glibc netinet/in.h header. */ 90*de1e4e89SAndroid Build Coastguard Worker #if defined(_NETINET_IN_H) 91*de1e4e89SAndroid Build Coastguard Worker 92*de1e4e89SAndroid Build Coastguard Worker /* GLIBC headers included first so don't define anything 93*de1e4e89SAndroid Build Coastguard Worker * that would already be defined. */ 94*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_ADDR 0 95*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_IPPROTO 0 96*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_PKTINFO 0 97*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP_MREQ 0 98*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN 0 99*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_CLASS 0 100*de1e4e89SAndroid Build Coastguard Worker 101*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR 0 102*de1e4e89SAndroid Build Coastguard Worker /* The exception is the in6_addr macros which must be defined 103*de1e4e89SAndroid Build Coastguard Worker * if the glibc code didn't define them. This guard matches 104*de1e4e89SAndroid Build Coastguard Worker * the guard in glibc/inet/netinet/in.h which defines the 105*de1e4e89SAndroid Build Coastguard Worker * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */ 106*de1e4e89SAndroid Build Coastguard Worker #if defined(__USE_MISC) || defined (__USE_GNU) 107*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR_ALT 0 108*de1e4e89SAndroid Build Coastguard Worker #else 109*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR_ALT 1 110*de1e4e89SAndroid Build Coastguard Worker #endif 111*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN6 0 112*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_MREQ 0 113*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPPROTO_V6 0 114*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_OPTIONS 0 115*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_PKTINFO 0 116*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP6_MTUINFO 0 117*de1e4e89SAndroid Build Coastguard Worker 118*de1e4e89SAndroid Build Coastguard Worker #else 119*de1e4e89SAndroid Build Coastguard Worker 120*de1e4e89SAndroid Build Coastguard Worker /* Linux headers included first, and we must define everything 121*de1e4e89SAndroid Build Coastguard Worker * we need. The expectation is that glibc will check the 122*de1e4e89SAndroid Build Coastguard Worker * __UAPI_DEF_* defines and adjust appropriately. */ 123*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_ADDR 1 124*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_IPPROTO 1 125*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_PKTINFO 1 126*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP_MREQ 1 127*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN 1 128*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_CLASS 1 129*de1e4e89SAndroid Build Coastguard Worker 130*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR 1 131*de1e4e89SAndroid Build Coastguard Worker /* We unconditionally define the in6_addr macros and glibc must 132*de1e4e89SAndroid Build Coastguard Worker * coordinate. */ 133*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR_ALT 1 134*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN6 1 135*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_MREQ 1 136*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPPROTO_V6 1 137*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_OPTIONS 1 138*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_PKTINFO 1 139*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP6_MTUINFO 1 140*de1e4e89SAndroid Build Coastguard Worker 141*de1e4e89SAndroid Build Coastguard Worker #endif /* _NETINET_IN_H */ 142*de1e4e89SAndroid Build Coastguard Worker 143*de1e4e89SAndroid Build Coastguard Worker /* Coordinate with glibc netipx/ipx.h header. */ 144*de1e4e89SAndroid Build Coastguard Worker #if defined(__NETIPX_IPX_H) 145*de1e4e89SAndroid Build Coastguard Worker 146*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IPX 0 147*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEFINITION 0 148*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 0 149*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_CONFIG_DATA 0 150*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEF 0 151*de1e4e89SAndroid Build Coastguard Worker 152*de1e4e89SAndroid Build Coastguard Worker #else /* defined(__NETIPX_IPX_H) */ 153*de1e4e89SAndroid Build Coastguard Worker 154*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IPX 1 155*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 156*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 157*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_CONFIG_DATA 1 158*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEF 1 159*de1e4e89SAndroid Build Coastguard Worker 160*de1e4e89SAndroid Build Coastguard Worker #endif /* defined(__NETIPX_IPX_H) */ 161*de1e4e89SAndroid Build Coastguard Worker 162*de1e4e89SAndroid Build Coastguard Worker /* Definitions for xattr.h */ 163*de1e4e89SAndroid Build Coastguard Worker #if defined(_SYS_XATTR_H) 164*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_XATTR 0 165*de1e4e89SAndroid Build Coastguard Worker #else 166*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_XATTR 1 167*de1e4e89SAndroid Build Coastguard Worker #endif 168*de1e4e89SAndroid Build Coastguard Worker 169*de1e4e89SAndroid Build Coastguard Worker /* If we did not see any headers from any supported C libraries, 170*de1e4e89SAndroid Build Coastguard Worker * or we are being included in the kernel, then define everything 171*de1e4e89SAndroid Build Coastguard Worker * that we need. */ 172*de1e4e89SAndroid Build Coastguard Worker #else /* !defined(__GLIBC__) */ 173*de1e4e89SAndroid Build Coastguard Worker 174*de1e4e89SAndroid Build Coastguard Worker /* Definitions for if.h */ 175*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFCONF 1 176*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFMAP 1 177*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFNAMSIZ 1 178*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_IFREQ 1 179*de1e4e89SAndroid Build Coastguard Worker /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ 180*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 181*de1e4e89SAndroid Build Coastguard Worker /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ 182*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 183*de1e4e89SAndroid Build Coastguard Worker 184*de1e4e89SAndroid Build Coastguard Worker /* Definitions for in.h */ 185*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_ADDR 1 186*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_IPPROTO 1 187*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_PKTINFO 1 188*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP_MREQ 1 189*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN 1 190*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN_CLASS 1 191*de1e4e89SAndroid Build Coastguard Worker 192*de1e4e89SAndroid Build Coastguard Worker /* Definitions for in6.h */ 193*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR 1 194*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_ADDR_ALT 1 195*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IN6 1 196*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_MREQ 1 197*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPPROTO_V6 1 198*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPV6_OPTIONS 1 199*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IN6_PKTINFO 1 200*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IP6_MTUINFO 1 201*de1e4e89SAndroid Build Coastguard Worker 202*de1e4e89SAndroid Build Coastguard Worker /* Definitions for ipx.h */ 203*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_SOCKADDR_IPX 1 204*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 205*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 206*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_CONFIG_DATA 1 207*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_IPX_ROUTE_DEF 1 208*de1e4e89SAndroid Build Coastguard Worker 209*de1e4e89SAndroid Build Coastguard Worker /* Definitions for xattr.h */ 210*de1e4e89SAndroid Build Coastguard Worker #define __UAPI_DEF_XATTR 1 211*de1e4e89SAndroid Build Coastguard Worker 212*de1e4e89SAndroid Build Coastguard Worker #endif /* __GLIBC__ */ 213*de1e4e89SAndroid Build Coastguard Worker 214*de1e4e89SAndroid Build Coastguard Worker #endif /* _LIBC_COMPAT_H */ 215