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