zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

libc-compat.h (7288B) - Raw


      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 /* Definitions for xattr.h */
    144 #if defined(_SYS_XATTR_H)
    145 #define __UAPI_DEF_XATTR		0
    146 #else
    147 #define __UAPI_DEF_XATTR		1
    148 #endif
    149 
    150 /* If we did not see any headers from any supported C libraries,
    151  * or we are being included in the kernel, then define everything
    152  * that we need. Check for previous __UAPI_* definitions to give
    153  * unsupported C libraries a way to opt out of any kernel definition. */
    154 #else /* !defined(__GLIBC__) */
    155 
    156 /* Definitions for if.h */
    157 #ifndef __UAPI_DEF_IF_IFCONF
    158 #define __UAPI_DEF_IF_IFCONF 1
    159 #endif
    160 #ifndef __UAPI_DEF_IF_IFMAP
    161 #define __UAPI_DEF_IF_IFMAP 1
    162 #endif
    163 #ifndef __UAPI_DEF_IF_IFNAMSIZ
    164 #define __UAPI_DEF_IF_IFNAMSIZ 1
    165 #endif
    166 #ifndef __UAPI_DEF_IF_IFREQ
    167 #define __UAPI_DEF_IF_IFREQ 1
    168 #endif
    169 /* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
    170 #ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS
    171 #define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1
    172 #endif
    173 /* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
    174 #ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
    175 #define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
    176 #endif
    177 
    178 /* Definitions for in.h */
    179 #ifndef __UAPI_DEF_IN_ADDR
    180 #define __UAPI_DEF_IN_ADDR		1
    181 #endif
    182 #ifndef __UAPI_DEF_IN_IPPROTO
    183 #define __UAPI_DEF_IN_IPPROTO		1
    184 #endif
    185 #ifndef __UAPI_DEF_IN_PKTINFO
    186 #define __UAPI_DEF_IN_PKTINFO		1
    187 #endif
    188 #ifndef __UAPI_DEF_IP_MREQ
    189 #define __UAPI_DEF_IP_MREQ		1
    190 #endif
    191 #ifndef __UAPI_DEF_SOCKADDR_IN
    192 #define __UAPI_DEF_SOCKADDR_IN		1
    193 #endif
    194 #ifndef __UAPI_DEF_IN_CLASS
    195 #define __UAPI_DEF_IN_CLASS		1
    196 #endif
    197 
    198 /* Definitions for in6.h */
    199 #ifndef __UAPI_DEF_IN6_ADDR
    200 #define __UAPI_DEF_IN6_ADDR		1
    201 #endif
    202 #ifndef __UAPI_DEF_IN6_ADDR_ALT
    203 #define __UAPI_DEF_IN6_ADDR_ALT		1
    204 #endif
    205 #ifndef __UAPI_DEF_SOCKADDR_IN6
    206 #define __UAPI_DEF_SOCKADDR_IN6		1
    207 #endif
    208 #ifndef __UAPI_DEF_IPV6_MREQ
    209 #define __UAPI_DEF_IPV6_MREQ		1
    210 #endif
    211 #ifndef __UAPI_DEF_IPPROTO_V6
    212 #define __UAPI_DEF_IPPROTO_V6		1
    213 #endif
    214 #ifndef __UAPI_DEF_IPV6_OPTIONS
    215 #define __UAPI_DEF_IPV6_OPTIONS		1
    216 #endif
    217 #ifndef __UAPI_DEF_IN6_PKTINFO
    218 #define __UAPI_DEF_IN6_PKTINFO		1
    219 #endif
    220 #ifndef __UAPI_DEF_IP6_MTUINFO
    221 #define __UAPI_DEF_IP6_MTUINFO		1
    222 #endif
    223 
    224 /* Definitions for xattr.h */
    225 #ifndef __UAPI_DEF_XATTR
    226 #define __UAPI_DEF_XATTR		1
    227 #endif
    228 
    229 #endif /* __GLIBC__ */
    230 
    231 #endif /* _LIBC_COMPAT_H */