Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107816012
D31962.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D31962.diff
View Options
diff --git a/include/Makefile b/include/Makefile
--- a/include/Makefile
+++ b/include/Makefile
@@ -14,8 +14,8 @@
SUBDIR_PARALLEL=
INCS= a.out.h ar.h assert.h bitstring.h complex.h cpio.h _ctype.h ctype.h \
db.h \
- dirent.h dlfcn.h elf.h elf-hints.h err.h fmtmsg.h fnmatch.h fstab.h \
- fts.h ftw.h getopt.h glob.h grp.h \
+ dirent.h dlfcn.h elf.h elf-hints.h endian.h err.h fmtmsg.h fnmatch.h \
+ fstab.h fts.h ftw.h getopt.h glob.h grp.h \
ieeefp.h ifaddrs.h \
inttypes.h iso646.h kenv.h langinfo.h libgen.h limits.h link.h \
locale.h malloc.h malloc_np.h memory.h monetary.h mpool.h mqueue.h \
diff --git a/include/endian.h b/include/endian.h
new file mode 100644
--- /dev/null
+++ b/include/endian.h
@@ -0,0 +1,43 @@
+/*-
+ * Copyright (c) 2021 M. Warner Losh <imp@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+/*
+ * A mostly Linux/glibc-compatible endian.h
+ */
+
+#ifndef _ENDIAN_H_
+#define _ENDIAN_H_
+
+/*
+ * FreeBSD's sys/_endian.h is very close to the interface provided on Linux by
+ * glibc's endian.h.
+ */
+#include <sys/_endian.h>
+
+/*
+ * glibc uses double underscore for these symbols. Define these unconditionally.
+ * The compiler defines __BYTE_ORDER__ these days, so we don't do anything
+ * with that since sys/endian.h defines _BYTE_ORDER based on it.
+ */
+#define __BIG_ENDIAN _BIG_ENDIAN
+#define __BYTE_ORDER _BYTE_ORDER
+#define __LITTLE_ENDIAN _LITTLE_ENDIAN
+#define __PDP_ENDIAN _PDP_ENDIAN
+
+/*
+ * FreeBSD's sys/endian.h and machine/endian.h doesn't define a separate
+ * byte order for floats. Use the host non-float byte order.
+ */
+#define __FLOAT_WORD_ORDER _BYTE_ORDER
+
+/*
+ * We don't define BIG_ENDI, LITTLE_ENDI, HIGH_HALF and LOW_HALF macros that
+ * glibc's endian.h defines since those appear to be internal to internal to
+ * glibc. We also don't try to emulate the various helper macros that glibc
+ * uses to limit namespace visibility.
+ */
+
+#endif /* _ENDIAN_H_ */
diff --git a/sys/sys/_endian.h b/sys/sys/_endian.h
--- a/sys/sys/_endian.h
+++ b/sys/sys/_endian.h
@@ -32,7 +32,7 @@
#ifndef _SYS__ENDIAN_H_
#define _SYS__ENDIAN_H_
-#ifndef _MACHINE_ENDIAN_H_
+#if !defined(_MACHINE_ENDIAN_H_) && !defined(_ENDIAN_H_)
#error "sys/_endian.h should not be included directly"
#endif
@@ -89,4 +89,38 @@
#define __ntohs(x) ((__uint16_t)(x))
#endif
+/*
+ * Host to big endian, host to little endian, big endian to host, and little
+ * endian to host byte order functions as detailed in byteorder(9).
+ */
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#define htobe16(x) __bswap16((x))
+#define htobe32(x) __bswap32((x))
+#define htobe64(x) __bswap64((x))
+#define htole16(x) ((uint16_t)(x))
+#define htole32(x) ((uint32_t)(x))
+#define htole64(x) ((uint64_t)(x))
+
+#define be16toh(x) __bswap16((x))
+#define be32toh(x) __bswap32((x))
+#define be64toh(x) __bswap64((x))
+#define le16toh(x) ((uint16_t)(x))
+#define le32toh(x) ((uint32_t)(x))
+#define le64toh(x) ((uint64_t)(x))
+#else /* _BYTE_ORDER != _LITTLE_ENDIAN */
+#define htobe16(x) ((uint16_t)(x))
+#define htobe32(x) ((uint32_t)(x))
+#define htobe64(x) ((uint64_t)(x))
+#define htole16(x) __bswap16((x))
+#define htole32(x) __bswap32((x))
+#define htole64(x) __bswap64((x))
+
+#define be16toh(x) ((uint16_t)(x))
+#define be32toh(x) ((uint32_t)(x))
+#define be64toh(x) ((uint64_t)(x))
+#define le16toh(x) __bswap16((x))
+#define le32toh(x) __bswap32((x))
+#define le64toh(x) __bswap64((x))
+#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
+
#endif /* _SYS__ENDIAN_H_ */
diff --git a/sys/sys/endian.h b/sys/sys/endian.h
--- a/sys/sys/endian.h
+++ b/sys/sys/endian.h
@@ -55,6 +55,12 @@
#define _UINT64_T_DECLARED
#endif
+/*
+ * Note: While tempting to try to avoid namespace pollution from this file,
+ * several software packages assume these marcos are defined, even when it
+ * defines _POSIX_C_SOURCE to request an unpolluted namespace.
+ */
+
/*
* General byte order swapping functions.
*/
@@ -62,42 +68,7 @@
#define bswap32(x) __bswap32(x)
#define bswap64(x) __bswap64(x)
-/*
- * Host to big endian, host to little endian, big endian to host, and little
- * endian to host byte order functions as detailed in byteorder(9).
- */
-#if _BYTE_ORDER == _LITTLE_ENDIAN
-#define htobe16(x) __bswap16((x))
-#define htobe32(x) __bswap32((x))
-#define htobe64(x) __bswap64((x))
-#define htole16(x) ((uint16_t)(x))
-#define htole32(x) ((uint32_t)(x))
-#define htole64(x) ((uint64_t)(x))
-
-#define be16toh(x) __bswap16((x))
-#define be32toh(x) __bswap32((x))
-#define be64toh(x) __bswap64((x))
-#define le16toh(x) ((uint16_t)(x))
-#define le32toh(x) ((uint32_t)(x))
-#define le64toh(x) ((uint64_t)(x))
-#else /* _BYTE_ORDER != _LITTLE_ENDIAN */
-#define htobe16(x) ((uint16_t)(x))
-#define htobe32(x) ((uint32_t)(x))
-#define htobe64(x) ((uint64_t)(x))
-#define htole16(x) __bswap16((x))
-#define htole32(x) __bswap32((x))
-#define htole64(x) __bswap64((x))
-
-#define be16toh(x) ((uint16_t)(x))
-#define be32toh(x) ((uint32_t)(x))
-#define be64toh(x) ((uint64_t)(x))
-#define le16toh(x) __bswap16((x))
-#define le32toh(x) __bswap32((x))
-#define le64toh(x) __bswap64((x))
-#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
-
/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
-
static __inline uint16_t
be16dec(const void *pp)
{
@@ -203,5 +174,4 @@
le32enc(p, (uint32_t)(u & 0xffffffffU));
le32enc(p + 4, (uint32_t)(u >> 32));
}
-
#endif /* _SYS_ENDIAN_H_ */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Jan 19, 10:45 AM (21 h, 25 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15939256
Default Alt Text
D31962.diff (5 KB)
Attached To
Mode
D31962: linux: For better compatibility, provide compatible endian.h
Attached
Detach File
Event Timeline
Log In to Comment