16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2cfd280c9SCarlos O'Donell /* 3cfd280c9SCarlos O'Donell * Compatibility interface for userspace libc header coordination: 4cfd280c9SCarlos O'Donell * 5cfd280c9SCarlos O'Donell * Define compatibility macros that are used to control the inclusion or 6cfd280c9SCarlos O'Donell * exclusion of UAPI structures and definitions in coordination with another 7cfd280c9SCarlos O'Donell * userspace C library. 8cfd280c9SCarlos O'Donell * 9cfd280c9SCarlos O'Donell * This header is intended to solve the problem of UAPI definitions that 10cfd280c9SCarlos O'Donell * conflict with userspace definitions. If a UAPI header has such conflicting 11cfd280c9SCarlos O'Donell * definitions then the solution is as follows: 12cfd280c9SCarlos O'Donell * 13cfd280c9SCarlos O'Donell * * Synchronize the UAPI header and the libc headers so either one can be 14cfd280c9SCarlos O'Donell * used and such that the ABI is preserved. If this is not possible then 15cfd280c9SCarlos O'Donell * no simple compatibility interface exists (you need to write translating 16cfd280c9SCarlos O'Donell * wrappers and rename things) and you can't use this interface. 17cfd280c9SCarlos O'Donell * 18cfd280c9SCarlos O'Donell * Then follow this process: 19cfd280c9SCarlos O'Donell * 20cfd280c9SCarlos O'Donell * (a) Include libc-compat.h in the UAPI header. 21cfd280c9SCarlos O'Donell * e.g. #include <linux/libc-compat.h> 22cfd280c9SCarlos O'Donell * This include must be as early as possible. 23cfd280c9SCarlos O'Donell * 24cfd280c9SCarlos O'Donell * (b) In libc-compat.h add enough code to detect that the comflicting 25cfd280c9SCarlos O'Donell * userspace libc header has been included first. 26cfd280c9SCarlos O'Donell * 27cfd280c9SCarlos O'Donell * (c) If the userspace libc header has been included first define a set of 28cfd280c9SCarlos O'Donell * guard macros of the form __UAPI_DEF_FOO and set their values to 1, else 29cfd280c9SCarlos O'Donell * set their values to 0. 30cfd280c9SCarlos O'Donell * 31cfd280c9SCarlos O'Donell * (d) Back in the UAPI header with the conflicting definitions, guard the 32cfd280c9SCarlos O'Donell * definitions with: 33cfd280c9SCarlos O'Donell * #if __UAPI_DEF_FOO 34cfd280c9SCarlos O'Donell * ... 35cfd280c9SCarlos O'Donell * #endif 36cfd280c9SCarlos O'Donell * 37cfd280c9SCarlos O'Donell * This fixes the situation where the linux headers are included *after* the 38cfd280c9SCarlos O'Donell * libc headers. To fix the problem with the inclusion in the other order the 39cfd280c9SCarlos O'Donell * userspace libc headers must be fixed like this: 40cfd280c9SCarlos O'Donell * 41cfd280c9SCarlos O'Donell * * For all definitions that conflict with kernel definitions wrap those 42cfd280c9SCarlos O'Donell * defines in the following: 43cfd280c9SCarlos O'Donell * #if !__UAPI_DEF_FOO 44cfd280c9SCarlos O'Donell * ... 45cfd280c9SCarlos O'Donell * #endif 46cfd280c9SCarlos O'Donell * 47cfd280c9SCarlos O'Donell * This prevents the redefinition of a construct already defined by the kernel. 48cfd280c9SCarlos O'Donell */ 49cfd280c9SCarlos O'Donell #ifndef _UAPI_LIBC_COMPAT_H 50cfd280c9SCarlos O'Donell #define _UAPI_LIBC_COMPAT_H 51cfd280c9SCarlos O'Donell 52cfd280c9SCarlos O'Donell /* We have included glibc headers... */ 53cfd280c9SCarlos O'Donell #if defined(__GLIBC__) 54cfd280c9SCarlos O'Donell 554a91cb61SMikko Rapeli /* Coordinate with glibc net/if.h header. */ 56f0a3fdcaSNicolas Dichtel #if defined(_NET_IF_H) && defined(__USE_MISC) 574a91cb61SMikko Rapeli 584a91cb61SMikko Rapeli /* GLIBC headers included first so don't define anything 594a91cb61SMikko Rapeli * that would already be defined. */ 604a91cb61SMikko Rapeli 614a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFCONF 0 624a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFMAP 0 634a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFNAMSIZ 0 644a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFREQ 0 654a91cb61SMikko Rapeli /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ 664a91cb61SMikko Rapeli #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0 674a91cb61SMikko Rapeli /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ 684a91cb61SMikko Rapeli #ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 694a91cb61SMikko Rapeli #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 704a91cb61SMikko Rapeli #endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ 714a91cb61SMikko Rapeli 724a91cb61SMikko Rapeli #else /* _NET_IF_H */ 734a91cb61SMikko Rapeli 744a91cb61SMikko Rapeli /* Linux headers included first, and we must define everything 754a91cb61SMikko Rapeli * we need. The expectation is that glibc will check the 764a91cb61SMikko Rapeli * __UAPI_DEF_* defines and adjust appropriately. */ 774a91cb61SMikko Rapeli 784a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFCONF 1 794a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFMAP 1 804a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFNAMSIZ 1 814a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFREQ 1 824a91cb61SMikko Rapeli /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ 834a91cb61SMikko Rapeli #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 844a91cb61SMikko Rapeli /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ 854a91cb61SMikko Rapeli #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 864a91cb61SMikko Rapeli 874a91cb61SMikko Rapeli #endif /* _NET_IF_H */ 884a91cb61SMikko Rapeli 89cfd280c9SCarlos O'Donell /* Coordinate with glibc netinet/in.h header. */ 90cfd280c9SCarlos O'Donell #if defined(_NETINET_IN_H) 91cfd280c9SCarlos O'Donell 92cfd280c9SCarlos O'Donell /* GLIBC headers included first so don't define anything 93cfd280c9SCarlos O'Donell * that would already be defined. */ 94279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_ADDR 0 95279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_IPPROTO 0 96279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_PKTINFO 0 97279c6c7fSStephen Hemminger #define __UAPI_DEF_IP_MREQ 0 98279c6c7fSStephen Hemminger #define __UAPI_DEF_SOCKADDR_IN 0 99279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_CLASS 0 100279c6c7fSStephen Hemminger 101cfd280c9SCarlos O'Donell #define __UAPI_DEF_IN6_ADDR 0 102cfd280c9SCarlos O'Donell /* The exception is the in6_addr macros which must be defined 103cfd280c9SCarlos O'Donell * if the glibc code didn't define them. This guard matches 104cfd280c9SCarlos O'Donell * the guard in glibc/inet/netinet/in.h which defines the 105cfd280c9SCarlos O'Donell * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */ 106cfd280c9SCarlos O'Donell #if defined(__USE_MISC) || defined (__USE_GNU) 107cfd280c9SCarlos O'Donell #define __UAPI_DEF_IN6_ADDR_ALT 0 108cfd280c9SCarlos O'Donell #else 109cfd280c9SCarlos O'Donell #define __UAPI_DEF_IN6_ADDR_ALT 1 110cfd280c9SCarlos O'Donell #endif 111cfd280c9SCarlos O'Donell #define __UAPI_DEF_SOCKADDR_IN6 0 112cfd280c9SCarlos O'Donell #define __UAPI_DEF_IPV6_MREQ 0 113cfd280c9SCarlos O'Donell #define __UAPI_DEF_IPPROTO_V6 0 1146d08acd2Sstephen hemminger #define __UAPI_DEF_IPV6_OPTIONS 0 1153b50d902SWANG Cong #define __UAPI_DEF_IN6_PKTINFO 0 1163b50d902SWANG Cong #define __UAPI_DEF_IP6_MTUINFO 0 117cfd280c9SCarlos O'Donell 118cfd280c9SCarlos O'Donell #else 119cfd280c9SCarlos O'Donell 120cfd280c9SCarlos O'Donell /* Linux headers included first, and we must define everything 121cfd280c9SCarlos O'Donell * we need. The expectation is that glibc will check the 122cfd280c9SCarlos O'Donell * __UAPI_DEF_* defines and adjust appropriately. */ 123279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_ADDR 1 124279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_IPPROTO 1 125279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_PKTINFO 1 126279c6c7fSStephen Hemminger #define __UAPI_DEF_IP_MREQ 1 127279c6c7fSStephen Hemminger #define __UAPI_DEF_SOCKADDR_IN 1 128279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_CLASS 1 129279c6c7fSStephen Hemminger 130cfd280c9SCarlos O'Donell #define __UAPI_DEF_IN6_ADDR 1 131cfd280c9SCarlos O'Donell /* We unconditionally define the in6_addr macros and glibc must 132cfd280c9SCarlos O'Donell * coordinate. */ 133cfd280c9SCarlos O'Donell #define __UAPI_DEF_IN6_ADDR_ALT 1 134cfd280c9SCarlos O'Donell #define __UAPI_DEF_SOCKADDR_IN6 1 135cfd280c9SCarlos O'Donell #define __UAPI_DEF_IPV6_MREQ 1 136cfd280c9SCarlos O'Donell #define __UAPI_DEF_IPPROTO_V6 1 1376d08acd2Sstephen hemminger #define __UAPI_DEF_IPV6_OPTIONS 1 1383b50d902SWANG Cong #define __UAPI_DEF_IN6_PKTINFO 1 1393b50d902SWANG Cong #define __UAPI_DEF_IP6_MTUINFO 1 140cfd280c9SCarlos O'Donell 141cfd280c9SCarlos O'Donell #endif /* _NETINET_IN_H */ 142cfd280c9SCarlos O'Donell 14353dc65d4SMikko Rapeli /* Coordinate with glibc netipx/ipx.h header. */ 14453dc65d4SMikko Rapeli #if defined(__NETIPX_IPX_H) 14553dc65d4SMikko Rapeli 14653dc65d4SMikko Rapeli #define __UAPI_DEF_SOCKADDR_IPX 0 14753dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_ROUTE_DEFINITION 0 14853dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 0 14953dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_CONFIG_DATA 0 15053dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_ROUTE_DEF 0 15153dc65d4SMikko Rapeli 15253dc65d4SMikko Rapeli #else /* defined(__NETIPX_IPX_H) */ 15353dc65d4SMikko Rapeli 15453dc65d4SMikko Rapeli #define __UAPI_DEF_SOCKADDR_IPX 1 15553dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 15653dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 15753dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_CONFIG_DATA 1 15853dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_ROUTE_DEF 1 15953dc65d4SMikko Rapeli 16053dc65d4SMikko Rapeli #endif /* defined(__NETIPX_IPX_H) */ 16153dc65d4SMikko Rapeli 162ea1a8217SSerge Hallyn /* Definitions for xattr.h */ 163ea1a8217SSerge Hallyn #if defined(_SYS_XATTR_H) 164ea1a8217SSerge Hallyn #define __UAPI_DEF_XATTR 0 165ea1a8217SSerge Hallyn #else 166ea1a8217SSerge Hallyn #define __UAPI_DEF_XATTR 1 167ea1a8217SSerge Hallyn #endif 168cfd280c9SCarlos O'Donell 169cfd280c9SCarlos O'Donell /* If we did not see any headers from any supported C libraries, 170cfd280c9SCarlos O'Donell * or we are being included in the kernel, then define everything 171*c0bace79SFelix Janda * that we need. Check for previous __UAPI_* definitions to give 172*c0bace79SFelix Janda * unsupported C libraries a way to opt out of any kernel definition. */ 173cfd280c9SCarlos O'Donell #else /* !defined(__GLIBC__) */ 174cfd280c9SCarlos O'Donell 1754a91cb61SMikko Rapeli /* Definitions for if.h */ 176*c0bace79SFelix Janda #ifndef __UAPI_DEF_IF_IFCONF 1774a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFCONF 1 178*c0bace79SFelix Janda #endif 179*c0bace79SFelix Janda #ifndef __UAPI_DEF_IF_IFMAP 1804a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFMAP 1 181*c0bace79SFelix Janda #endif 182*c0bace79SFelix Janda #ifndef __UAPI_DEF_IF_IFNAMSIZ 1834a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFNAMSIZ 1 184*c0bace79SFelix Janda #endif 185*c0bace79SFelix Janda #ifndef __UAPI_DEF_IF_IFREQ 1864a91cb61SMikko Rapeli #define __UAPI_DEF_IF_IFREQ 1 187*c0bace79SFelix Janda #endif 1884a91cb61SMikko Rapeli /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */ 189*c0bace79SFelix Janda #ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS 1904a91cb61SMikko Rapeli #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1 191*c0bace79SFelix Janda #endif 1924a91cb61SMikko Rapeli /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */ 193*c0bace79SFelix Janda #ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1944a91cb61SMikko Rapeli #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1 195*c0bace79SFelix Janda #endif 1964a91cb61SMikko Rapeli 197279c6c7fSStephen Hemminger /* Definitions for in.h */ 198*c0bace79SFelix Janda #ifndef __UAPI_DEF_IN_ADDR 199279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_ADDR 1 200*c0bace79SFelix Janda #endif 201*c0bace79SFelix Janda #ifndef __UAPI_DEF_IN_IPPROTO 202279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_IPPROTO 1 203*c0bace79SFelix Janda #endif 204*c0bace79SFelix Janda #ifndef __UAPI_DEF_IN_PKTINFO 205279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_PKTINFO 1 206*c0bace79SFelix Janda #endif 207*c0bace79SFelix Janda #ifndef __UAPI_DEF_IP_MREQ 208279c6c7fSStephen Hemminger #define __UAPI_DEF_IP_MREQ 1 209*c0bace79SFelix Janda #endif 210*c0bace79SFelix Janda #ifndef __UAPI_DEF_SOCKADDR_IN 211279c6c7fSStephen Hemminger #define __UAPI_DEF_SOCKADDR_IN 1 212*c0bace79SFelix Janda #endif 213*c0bace79SFelix Janda #ifndef __UAPI_DEF_IN_CLASS 214279c6c7fSStephen Hemminger #define __UAPI_DEF_IN_CLASS 1 215*c0bace79SFelix Janda #endif 216279c6c7fSStephen Hemminger 217cfd280c9SCarlos O'Donell /* Definitions for in6.h */ 218*c0bace79SFelix Janda #ifndef __UAPI_DEF_IN6_ADDR 219cfd280c9SCarlos O'Donell #define __UAPI_DEF_IN6_ADDR 1 220*c0bace79SFelix Janda #endif 221*c0bace79SFelix Janda #ifndef __UAPI_DEF_IN6_ADDR_ALT 222cfd280c9SCarlos O'Donell #define __UAPI_DEF_IN6_ADDR_ALT 1 223*c0bace79SFelix Janda #endif 224*c0bace79SFelix Janda #ifndef __UAPI_DEF_SOCKADDR_IN6 225cfd280c9SCarlos O'Donell #define __UAPI_DEF_SOCKADDR_IN6 1 226*c0bace79SFelix Janda #endif 227*c0bace79SFelix Janda #ifndef __UAPI_DEF_IPV6_MREQ 228cfd280c9SCarlos O'Donell #define __UAPI_DEF_IPV6_MREQ 1 229*c0bace79SFelix Janda #endif 230*c0bace79SFelix Janda #ifndef __UAPI_DEF_IPPROTO_V6 231cfd280c9SCarlos O'Donell #define __UAPI_DEF_IPPROTO_V6 1 232*c0bace79SFelix Janda #endif 233*c0bace79SFelix Janda #ifndef __UAPI_DEF_IPV6_OPTIONS 2346d08acd2Sstephen hemminger #define __UAPI_DEF_IPV6_OPTIONS 1 235*c0bace79SFelix Janda #endif 236*c0bace79SFelix Janda #ifndef __UAPI_DEF_IN6_PKTINFO 2373b50d902SWANG Cong #define __UAPI_DEF_IN6_PKTINFO 1 238*c0bace79SFelix Janda #endif 239*c0bace79SFelix Janda #ifndef __UAPI_DEF_IP6_MTUINFO 2403b50d902SWANG Cong #define __UAPI_DEF_IP6_MTUINFO 1 241*c0bace79SFelix Janda #endif 242cfd280c9SCarlos O'Donell 24353dc65d4SMikko Rapeli /* Definitions for ipx.h */ 244*c0bace79SFelix Janda #ifndef __UAPI_DEF_SOCKADDR_IPX 24553dc65d4SMikko Rapeli #define __UAPI_DEF_SOCKADDR_IPX 1 246*c0bace79SFelix Janda #endif 247*c0bace79SFelix Janda #ifndef __UAPI_DEF_IPX_ROUTE_DEFINITION 24853dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_ROUTE_DEFINITION 1 249*c0bace79SFelix Janda #endif 250*c0bace79SFelix Janda #ifndef __UAPI_DEF_IPX_INTERFACE_DEFINITION 25153dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_INTERFACE_DEFINITION 1 252*c0bace79SFelix Janda #endif 253*c0bace79SFelix Janda #ifndef __UAPI_DEF_IPX_CONFIG_DATA 25453dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_CONFIG_DATA 1 255*c0bace79SFelix Janda #endif 256*c0bace79SFelix Janda #ifndef __UAPI_DEF_IPX_ROUTE_DEF 25753dc65d4SMikko Rapeli #define __UAPI_DEF_IPX_ROUTE_DEF 1 258*c0bace79SFelix Janda #endif 25953dc65d4SMikko Rapeli 260ea1a8217SSerge Hallyn /* Definitions for xattr.h */ 261*c0bace79SFelix Janda #ifndef __UAPI_DEF_XATTR 262ea1a8217SSerge Hallyn #define __UAPI_DEF_XATTR 1 263*c0bace79SFelix Janda #endif 264ea1a8217SSerge Hallyn 265cfd280c9SCarlos O'Donell #endif /* __GLIBC__ */ 266cfd280c9SCarlos O'Donell 267cfd280c9SCarlos O'Donell #endif /* _UAPI_LIBC_COMPAT_H */ 268