Browse Source
Origin: https://github.com/sabotage-linux/kernel-headers/blob/master/generic/include/linux/libc-compat.hstable/0.6
Christian Wiese
11 years ago
1 changed files with 135 additions and 0 deletions
@ -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 <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
|
Loading…
Reference in new issue