xref: /aosp_15_r20/external/ethtool/uapi/linux/libc-compat.h (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
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