diff options
-rw-r--r-- | cbits/HsUnix.c | 19 | ||||
-rw-r--r-- | changelog.md | 4 |
2 files changed, 22 insertions, 1 deletions
diff --git a/cbits/HsUnix.c b/cbits/HsUnix.c index bdd1e80..08cccd5 100644 --- a/cbits/HsUnix.c +++ b/cbits/HsUnix.c @@ -37,12 +37,29 @@ int __hsunix_push_module(int fd, const char *module) } /* + * GNU glibc 2.23 and later deprecate `readdir_r` in favour of plain old + * `readdir` which in some upcoming POSIX standard is going to required to be + * re-entrant. + * Eventually we want to drop `readder_r` all together, but want to be + * compatible with older unixen which may not have a re-entrant `readdir`. + * Solution is to make systems with *known* re-entrant `readir` use that and use + * `readdir_r` whereever we have it and don't *know* that `readdir` is + * re-entrant. + */ + +#if defined (__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 23) +#define USE_READDIR_R 0 +#else +#define USE_READDIR_R 1 +#endif + +/* * read an entry from the directory stream; opt for the * re-entrant friendly way of doing this, if available. */ int __hscore_readdir( DIR *dirPtr, struct dirent **pDirEnt ) { -#if HAVE_READDIR_R +#if HAVE_READDIR_R && USE_READDIR_R struct dirent* p; int res; static unsigned int nm_max = (unsigned int)-1; diff --git a/changelog.md b/changelog.md index eb429cb..4bbeeb3 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,9 @@ # Changelog for [`unix` package](http://hackage.haskell.org/package/unix) +## 2.7.2.1 *Sep 2016* + + * Don't use `readdir_r` if its deprecated. + ## 2.7.2.0 *Apr 2016* * Bundled with GHC 8.0.1 |