Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142102620
D32051.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D32051.id.diff
View Options
diff --git a/include/Makefile b/include/Makefile
--- a/include/Makefile
+++ b/include/Makefile
@@ -12,7 +12,8 @@
SUBDIR+= i386
.endif
SUBDIR_PARALLEL=
-INCS= a.out.h ar.h assert.h bitstring.h complex.h cpio.h _ctype.h ctype.h \
+INCS= a.out.h ar.h assert.h bitstring.h byteswap.h \
+ complex.h cpio.h _ctype.h ctype.h \
db.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 \
diff --git a/include/byteswap.h b/include/byteswap.h
new file mode 100644
--- /dev/null
+++ b/include/byteswap.h
@@ -0,0 +1,41 @@
+/*-
+ * Copyright (c) 2021 M. Warner Losh <imp@FreeBSD.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+/*
+ * A mostly Linux/glibc-compatible byteswap.h
+ */
+
+#ifndef _BYTESWAP_H_
+#define _BYTESWAP_H_
+
+/*
+ * sys/_endian.h brings in the shared interfaces between BSD's sys/endian.h, and
+ * glibc's endian.h. However, we need to include it here to get the
+ * __bswap{16,32,64} definitions that we use. sys/_endian.h has been consturcted to
+ * be compatible with including <endian.h>, <byteswap.h> or both in either order,
+ * as well as providing the BSD the bulk of sys/endian.h functionality.
+ */
+#include <sys/_endian.h>
+
+/*
+ * glibc's <byteswap.h> defines the bswap_* and __bswap_* macros below. Most
+ * software uses either just <sys/endian.h>, or both <endian.h> and
+ * <byteswap.h>. However, one can't define bswap16, etc in <endian.h> because
+ * several software packages will define them only when they detect <endian.h>
+ * is included (but not when sys/endian.h is included). Defining bswap16, etc
+ * here causes compilation errors for those packages. <endian.h> and
+ * <byteswap.h> need to be paired together, with the below defines here, for
+ * the highest level of glibc compatibility.
+ */
+#define __bswap_16(x) __bswap16(x)
+#define __bswap_32(x) __bswap32(x)
+#define __bswap_64(x) __bswap64(x)
+
+#define bswap_16(x) __bswap16(x)
+#define bswap_32(x) __bswap32(x)
+#define bswap_64(x) __bswap64(x)
+
+#endif /* _BYTESWAP_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_
-#if !defined(_MACHINE_ENDIAN_H_) && !defined(_ENDIAN_H_)
+#if !defined(_MACHINE_ENDIAN_H_) && !defined(_BYTESWAP_H_) && !defined(_ENDIAN_H_)
#error "sys/_endian.h should not be included directly"
#endif
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jan 17, 1:17 AM (8 h, 48 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27675818
Default Alt Text
D32051.id.diff (2 KB)
Attached To
Mode
D32051: byteswap.h: Add a glibc/linux compatible byteswap.h
Attached
Detach File
Event Timeline
Log In to Comment