diff --git a/base/musl/pkg/linux-header/libc-compat.patch b/base/musl/pkg/linux-header/libc-compat.patch new file mode 100644 index 000000000..c0c1fe338 --- /dev/null +++ b/base/musl/pkg/linux-header/libc-compat.patch @@ -0,0 +1,135 @@ +# --- SDE-COPYRIGHT-NOTE-BEGIN --- +# This copyright note is auto-generated by ./scripts/Create-CopyPatch. +# +# Filename: package/.../musl/pkg/linux-header/libc-compat.patch +# Copyright (C) 2014 The OpenSDE Project +# +# More information can be found in the files COPYING and README. +# +# This patch file is dual-licensed. It is available under the license the +# patched project is licensed under, as long as it is an OpenSource license +# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms +# of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# --- SDE-COPYRIGHT-NOTE-END --- + +Add a compatibility interface for userspace libc header +coordination. + +Origin: kernel-headers provided by sabotage-linux + +https://github.com/sabotage-linux/kernel-headers/blob/master/generic/include/linux/libc-compat.h + +--- /dev/null ++++ b/include/uapi/linux/libc-compat.h +@@ -0,0 +1,100 @@ ++/* ++ * Compatibility interface for userspace libc header coordination: ++ * ++ * Define compatibility macros that are used to control the inclusion or ++ * exclusion of UAPI structures and definitions in coordination with another ++ * userspace C library. ++ * ++ * This header is intended to solve the problem of UAPI definitions that ++ * conflict with userspace definitions. If a UAPI header has such conflicting ++ * definitions then the solution is as follows: ++ * ++ * * Synchronize the UAPI header and the libc headers so either one can be ++ * used and such that the ABI is preserved. If this is not possible then ++ * no simple compatibility interface exists (you need to write translating ++ * wrappers and rename things) and you can't use this interface. ++ * ++ * Then follow this process: ++ * ++ * (a) Include libc-compat.h in the UAPI header. ++ * e.g. #include ++ * This include must be as early as possible. ++ * ++ * (b) In libc-compat.h add enough code to detect that the comflicting ++ * userspace libc header has been included first. ++ * ++ * (c) If the userspace libc header has been included first define a set of ++ * guard macros of the form __UAPI_DEF_FOO and set their values to 1, else ++ * set their values to 0. ++ * ++ * (d) Back in the UAPI header with the conflicting definitions, guard the ++ * definitions with: ++ * #if __UAPI_DEF_FOO ++ * ... ++ * #endif ++ * ++ * This fixes the situation where the linux headers are included *after* the ++ * libc headers. To fix the problem with the inclusion in the other order the ++ * userspace libc headers must be fixed like this: ++ * ++ * * For all definitions that conflict with kernel definitions wrap those ++ * defines in the following: ++ * #if !__UAPI_DEF_FOO ++ * ... ++ * #endif ++ * ++ * This prevents the redefinition of a construct already defined by the kernel. ++ */ ++#ifndef _LIBC_COMPAT_H ++#define _LIBC_COMPAT_H ++ ++#ifndef __KERNEL__ /* we're used from userspace */ ++ ++#ifdef _NETINET_IF_ETHER_H /* musl */ ++#define __UAPI_DEF_ETHHDR 0 ++#else /* glibc uses __NETINET_IF_ETHER_H, and includes the kernel header. */ ++#define __UAPI_DEF_ETHHDR 1 ++#endif ++ ++/* Coordinate with libc netinet/in.h header. */ ++#if defined(_NETINET_IN_H) ++ ++/* GLIBC headers included first so don't define anything ++ * that would already be defined. */ ++#define __UAPI_DEF_IN6_ADDR 0 ++#define __UAPI_DEF_IN6_ADDR_ALT 0 ++#define __UAPI_DEF_SOCKADDR_IN6 0 ++#define __UAPI_DEF_IPV6_MREQ 0 ++#define __UAPI_DEF_IPPROTO_V6 0 ++ ++#else /* defined(_NETINET_IN_H) */ ++ ++/* Linux headers included first, and we must define everything ++ * we need. The expectation is that the libc will check the ++ * __UAPI_DEF_* defines and adjust appropriately. */ ++#define __UAPI_DEF_IN6_ADDR 1 ++/* We unconditionally define the in6_addr macros and libc must ++ * coordinate. */ ++#define __UAPI_DEF_IN6_ADDR_ALT 1 ++#define __UAPI_DEF_SOCKADDR_IN6 1 ++#define __UAPI_DEF_IPV6_MREQ 1 ++#define __UAPI_DEF_IPPROTO_V6 1 ++ ++#endif /* _NETINET_IN_H */ ++ ++ ++/* If we did not see any headers from any supported C libraries, ++ * or we are being included in the kernel, then define everything ++ * that we need. */ ++#else /* __KERNEL__ */ ++ ++/* Definitions for in6.h */ ++#define __UAPI_DEF_IN6_ADDR 1 ++#define __UAPI_DEF_IN6_ADDR_ALT 1 ++#define __UAPI_DEF_SOCKADDR_IN6 1 ++#define __UAPI_DEF_IPV6_MREQ 1 ++#define __UAPI_DEF_IPPROTO_V6 1 ++ ++#endif /* __KERNEL__ */ ++ ++#endif /* _LIBC_COMPAT_H */ +--- a/include/uapi/linux/Kbuild ++++ b/include/uapi/linux/Kbuild +@@ -422,3 +422,6 @@ + header-y += xattr.h + header-y += xfrm.h + header-y += hw_breakpoint.h ++ ++# install compatibility interface for userspace libc header coordination ++header-y += libc-compat.h