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