Skip to content

`readdir_r` is deprecated

When building GHC git HEAD on Debian Testing I get:

libraries/unix/cbits/HsUnix.c: In function ‘__hscore_readdir’:

libraries/unix/cbits/HsUnix.c:64:3: error:
     error: ‘readdir_r’ is deprecated [-Werror=deprecated-declarations]
       res = readdir_r(dirPtr, p, pDirEnt);
       ^~~

In file included from libraries/unix/include/HsUnix.h:71:0: error:
    0,
                     from libraries/unix/cbits/HsUnix.c:9:

/usr/include/dirent.h:183:12: error:
     note: declared here
     extern int readdir_r (DIR *__restrict __dirp,
                ^~~~~~~~~

According to the man page:

This function is deprecated; use readdir(3) instead.

The readdir_r() function was invented as a reentrant version of readdir(3). It reads the next directory entry from the directory stream dirp, and returns it in the caller-allocated buffer pointed to by entry.

It is expected that a future version of POSIX.1 will make readdir_r() obsolete, and require that readdir() be thread-safe when concurrently employed on different directory streams.

In order to support all of the various *nix systems, we probably need to detect if readdir_r is deprecated and only use readdir where readdir_r is in fact deprecated.

Trac metadata
Trac field Value
Version 8.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Core Libraries
Test case
Differential revisions
BlockedBy
Related
Blocking
CC ekmett
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information