linux-headers (unknown)

(root)/
include/
linux/
libc-compat.h
       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 _LIBC_COMPAT_H
      50  #define _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 /* _LIBC_COMPAT_H */