summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2017-05-20 22:51:32 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2017-05-20 22:56:36 -0700
commit075bd64609446e741a6efbcd6cd6e232db8d1df6 (patch)
treea67097df27736dd6b67712bb8eede15939da3d6a
parent2963861f3d4070420eeee0791008f3e1c02a0450 (diff)
downloademacs-075bd64609446e741a6efbcd6cd6e232db8d1df6.tar.gz
emacs-075bd64609446e741a6efbcd6cd6e232db8d1df6.tar.bz2
emacs-075bd64609446e741a6efbcd6cd6e232db8d1df6.zip
Narrow DARWIN_OS_CASE_SENSITIVE_FIXME to 1 choice
* etc/PROBLEMS: Document this (Bug#24441). * src/fileio.c (file_name_case_insensitive_p): Prefer pathconf with _PC_CASE_SENSITIVE, if it works, to DARWIN_OS_CASE_SENSITIVE_FIXME code. Support just one method for DARWIN_OS_CASE_SENSITIVE_FIXME, which matches the Apple documentation more precisely.
-rw-r--r--etc/PROBLEMS5
-rw-r--r--src/fileio.c68
2 files changed, 24 insertions, 49 deletions
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index e415887a4d8..ff88aa367f2 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -2486,9 +2486,8 @@ If you do, please send it to bug-gnu-emacs@gnu.org so we can list it here.
The implementation of that function on Mac OS X uses pathconf with the
_PC_CASE_SENSITIVE flag. There have been reports that this use of
pathconf does not work reliably. If you have a problem, please
-recompile Emacs with -D DARWIN_OS_CASE_SENSITIVE_FIXME=1 or
--D DARWIN_OS_CASE_SENSITIVE_FIXME=2, and file a bug report saying
-whether this fixed your problem.
+recompile Emacs with -D DARWIN_OS_CASE_SENSITIVE_FIXME, and file a bug
+report saying whether this fixed your problem.
* Build-time problems
diff --git a/src/fileio.c b/src/fileio.c
index e5e350542f9..17659b692ec 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2256,65 +2256,41 @@ static bool
file_name_case_insensitive_p (const char *filename)
{
/* Use pathconf with _PC_CASE_INSENSITIVE or _PC_CASE_SENSITIVE if
- those flags are available. As of this writing (2016-11-14),
+ those flags are available. As of this writing (2017-05-20),
Cygwin is the only platform known to support the former (starting
- with Cygwin-2.6.1), and Mac OS X is the only platform known to
- support the latter.
-
- There have been reports that pathconf with _PC_CASE_SENSITIVE
- does not work reliably on Mac OS X. If you have a problem,
- please recompile Emacs with -D DARWIN_OS_CASE_SENSITIVE_FIXME=1 or
- -D DARWIN_OS_CASE_SENSITIVE_FIXME=2, and file a bug report saying
- whether this fixed your problem. */
+ with Cygwin-2.6.1), and macOS is the only platform known to
+ support the latter. */
#ifdef _PC_CASE_INSENSITIVE
int res = pathconf (filename, _PC_CASE_INSENSITIVE);
if (res >= 0)
return res > 0;
-#elif defined _PC_CASE_SENSITIVE && !defined DARWIN_OS_CASE_SENSITIVE_FIXME
+#elif defined _PC_CASE_SENSITIVE
int res = pathconf (filename, _PC_CASE_SENSITIVE);
if (res >= 0)
return res == 0;
#endif
-#ifdef DARWIN_OS
-# ifndef DARWIN_OS_CASE_SENSITIVE_FIXME
- int DARWIN_OS_CASE_SENSITIVE_FIXME = 0;
-# endif
+ /* There have been reports that pathconf with _PC_CASE_SENSITIVE
+ does not work reliably on Mac OS X. If you have a problem,
+ please recompile Emacs with -D DARWIN_OS_CASE_SENSITIVE_FIXME=1 or
+ -D DARWIN_OS_CASE_SENSITIVE_FIXME=2, and file a bug report saying
+ whether this fixed your problem. */
- if (DARWIN_OS_CASE_SENSITIVE_FIXME == 1)
- {
- /* This is based on developer.apple.com's getattrlist man page. */
- struct attrlist alist = {.volattr = ATTR_VOL_CAPABILITIES};
- vol_capabilities_attr_t vcaps;
- if (getattrlist (filename, &alist, &vcaps, sizeof vcaps, 0) == 0)
- {
- if (vcaps.valid[VOL_CAPABILITIES_FORMAT] & VOL_CAP_FMT_CASE_SENSITIVE)
- return ! (vcaps.capabilities[VOL_CAPABILITIES_FORMAT]
- & VOL_CAP_FMT_CASE_SENSITIVE);
- }
- }
-# if DARWIN_OS_CASE_SENSITIVE_FIXME == 2
- {
- /* The following is based on
- http://lists.apple.com/archives/darwin-dev/2007/Apr/msg00010.html.
- It is normally not even compiled, since it runs afoul of
- static checking. See:
- http://lists.gnu.org/archive/html/emacs-devel/2017-05/msg00495.html
- */
- struct attrlist alist;
- unsigned char buffer[sizeof (vol_capabilities_attr_t) + sizeof (size_t)];
-
- memset (&alist, 0, sizeof (alist));
- alist.volattr = ATTR_VOL_CAPABILITIES;
- if (getattrlist (filename, &alist, buffer, sizeof (buffer), 0)
- || !(alist.volattr & ATTR_VOL_CAPABILITIES))
- return 0;
- vol_capabilities_attr_t *vcaps = buffer;
- return !(vcaps->capabilities[0] & VOL_CAP_FMT_CASE_SENSITIVE);
- }
+#ifdef DARWIN_OS_CASE_SENSITIVE_FIXME
+# ifdef VOL_CAP_FMT_CASE_SENSITIVE
+ {
+ struct attrlist alist = {.bitmapcount = ATTR_BIT_MAP_COUNT,
+ .volattr = ATTR_VOL_INFO | ATTR_VOL_CAPABILITIES};
+ struct { uint32_t len; vol_capabilities_attr_t caps; } vcaps
+ __attribute__ ((aligned (4), packed));
+ int i = VOL_CAPABILITIES_FORMAT;
+ if (getattrlist (filename, &alist, &vcaps, sizeof vcaps, 0) == 0
+ && (vcaps.caps.valid[i] & VOL_CAP_FMT_CASE_SENSITIVE))
+ return ! (vcaps.caps.capabilities[i] & VOL_CAP_FMT_CASE_SENSITIVE);
+ }
# endif
-#endif /* DARWIN_OS */
+#endif
#if defined CYGWIN || defined DOS_NT
return true;