You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.6 KiB
135 lines
4.6 KiB
# --- 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 <linux/libc-compat.h> 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 <linux/libc-compat.h> |
|
+ * 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
|
|
|