From 075bd64609446e741a6efbcd6cd6e232db8d1df6 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 20 May 2017 22:51:32 -0700 Subject: [PATCH 1/2] 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. --- etc/PROBLEMS | 5 ++--- src/fileio.c | 68 ++++++++++++++++++++---------------------------------------- 2 files changed, 24 insertions(+), 49 deletions(-) diff --git a/etc/PROBLEMS b/etc/PROBLEMS index e415887..ff88aa3 100644 --- a/etc/PROBLEMS +++ b/etc/PROBLEMS @@ -2486,9 +2486,8 @@ If you do, please send it to address@hidden 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 e5e3505..17659b6 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; -- 2.7.4