1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
Description: Fix handling of O_LARGEFILE on various 64-bit arches
Author: James Cowgill <jcowgill@debian.org>
Bug-Debian: https://bugs.debian.org/775357
Bug-Debian: https://bugs.debian.org/791347
---
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
--- a/libexplain/ac/fcntl.h
+++ b/libexplain/ac/fcntl.h
@@ -53,12 +53,25 @@
#endif
/*
- * Even when O_LARGEFILE is not necessary, glibc adds one in for free.
- * The trouble is, this make things interesting when decoding
- * flags values returned by the kernel.
+ * On 64-bit linux, fcntl(F_GETFL) always returns O_LARGEFILE even if we don't
+ * request it. Unfortunately glibc does not expose this value so we have to
+ * handle it ourselves. Also the value changes across arches *sigh*.
+ *
+ * These values were taken from the asm/fcntl.h kernel header for each arch.
+ * We can't include this header because it conflicts with glibc's fcntl.h.
*/
#if defined(__linux__) && (O_LARGEFILE == 0)
-#define O_LARGEFILE_HIDDEN 0100000
+# if defined(__aarch64__) || defined(__alpha__)
+# define O_LARGEFILE_HIDDEN 0400000
+# elif defined(__mips64)
+# define O_LARGEFILE_HIDDEN 0x2000
+# elif defined(__PPC64__)
+# define O_LARGEFILE_HIDDEN 0200000
+# elif defined(__sparc__) && defined(__arch64__)
+# define O_LARGEFILE_HIDDEN 0x40000
+# else
+# define O_LARGEFILE_HIDDEN 0100000
+# endif
#endif
|