Revert "libc: Remove readdir_r(3)"

This reverts commit d549de7690.
This commit is contained in:
Dag-Erling Smørgrav 2025-09-11 17:12:22 +02:00
parent 2d06844521
commit d20c825072
9 changed files with 61 additions and 13 deletions

View file

@ -51,9 +51,6 @@
# xargs -n1 | sort | uniq -d;
# done
# 20250910: readdir_r(3) removed
OLD_FILES+=usr/share/man/man3/readdir_r.3.gz
# 20250826: Remove a misspelled manual
OLD_FILES+=usr/share/man/man3/sysdecode_syscallnames.3.gz

View file

@ -115,6 +115,10 @@ DIR *opendir(const char *);
DIR *fdopendir(int);
struct dirent *
readdir(DIR *);
#if __POSIX_VISIBLE >= 199506 || __XSI_VISIBLE >= 500
int readdir_r(DIR *, struct dirent *, struct dirent **)
__deprecated1("Does not take variable {NAME_MAX} into account");
#endif
void rewinddir(DIR *);
#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 700
int scandir(const char *, struct dirent ***,

View file

@ -342,6 +342,7 @@ MLINKS+=directory.3 closedir.3 \
directory.3 fdopendir.3 \
directory.3 opendir.3 \
directory.3 readdir.3 \
directory.3 readdir_r.3 \
directory.3 rewinddir.3 \
directory.3 seekdir.3 \
directory.3 telldir.3

View file

@ -418,6 +418,7 @@ FBSD_1.5 {
globfree;
nftw;
readdir;
readdir_r;
scandir;
sem_clockwait_np;
setproctitle_fast;

View file

@ -25,13 +25,14 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.Dd September 5, 2025
.Dd August 1, 2020
.Dt DIRECTORY 3
.Os
.Sh NAME
.Nm opendir ,
.Nm fdopendir ,
.Nm readdir ,
.Nm readdir_r ,
.Nm telldir ,
.Nm seekdir ,
.Nm rewinddir ,
@ -49,6 +50,8 @@
.Fn fdopendir "int fd"
.Ft struct dirent *
.Fn readdir "DIR *dirp"
.Ft int
.Fn readdir_r "DIR *dirp" "struct dirent *entry" "struct dirent **result"
.Ft long
.Fn telldir "DIR *dirp"
.Ft void
@ -62,6 +65,15 @@
.Ft int
.Fn dirfd "DIR *dirp"
.Sh DESCRIPTION
.Bf -symbolic
The
.Fn readdir_r
interface is deprecated
because it cannot be used correctly unless
.Brq Va NAME_MAX
is a fixed value.
.Ef
.Pp
The
.Fn opendir
function
@ -100,6 +112,7 @@ or to modify the state of the associated description other than by means
of
.Fn closedir ,
.Fn readdir ,
.Fn readdir_r ,
or
.Fn rewinddir ,
the behavior is undefined.
@ -131,6 +144,34 @@ may be set to any of the values documented for the
system call.
.Pp
The
.Fn readdir_r
function
provides the same functionality as
.Fn readdir ,
but the caller must provide a directory
.Fa entry
buffer to store the results in.
The buffer must be large enough for a
.Vt struct dirent
with a
.Va d_name
array with
.Brq Va NAME_MAX
+ 1 elements.
If the read succeeds,
.Fa result
is pointed at the
.Fa entry ;
upon reaching the end of the directory
.Fa result
is set to
.Dv NULL .
The
.Fn readdir_r
function
returns 0 on success or an error number to indicate failure.
.Pp
The
.Fn telldir
function
returns a token representing the current location associated with the named
@ -264,7 +305,9 @@ is not associated with a directory.
.Pp
The
.Fn readdir
function may also fail and set
and
.Fn readdir_r
functions may also fail and set
.Va errno
for any of the errors specified for the routine
.Xr getdents 2 .
@ -295,6 +338,7 @@ The
.Fn fdopendir ,
.Fn opendir ,
.Fn readdir ,
.Fn readdir_r ,
.Fn rewinddir ,
.Fn seekdir
and
@ -347,8 +391,7 @@ will always set the correct location to return the same value as that last
.Fn readdir
performed.
This is enough for some applications which want to
.Dq push back the last entry read ,
e.g. Samba.
"push back the last entry read", e.g., Samba.
Seeks back to any other location,
other than the beginning of the directory,
may result in unexpected behaviour if deletes are present.

View file

@ -37,7 +37,6 @@ struct freebsd11_dirent;
struct freebsd11_stat;
struct freebsd11_statfs;
int freebsd15_readdir_r(DIR *, struct dirent *, struct dirent **);
struct freebsd11_dirent *freebsd11_readdir(DIR *);
int freebsd11_readdir_r(DIR *, struct freebsd11_dirent *,
struct freebsd11_dirent **);

View file

@ -60,4 +60,7 @@ struct _dirdesc {
#define _dirfd(dirp) ((dirp)->dd_fd)
struct dirent;
int __readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
#endif /* !_GEN_PRIVATE_H_ */

View file

@ -95,7 +95,7 @@ freebsd11_readdir_r(DIR *dirp, struct freebsd11_dirent *entry,
struct dirent xentry, *xresult;
int error;
error = freebsd15_readdir_r(dirp, &xentry, &xresult);
error = __readdir_r(dirp, &xentry, &xresult);
if (error != 0)
return (error);
if (xresult != NULL) {

View file

@ -41,8 +41,6 @@
#include "gen-private.h"
#include "telldir.h"
#include "gen-compat.h"
/*
* get next entry in a directory.
*/
@ -106,7 +104,7 @@ readdir(DIR *dirp)
}
int
freebsd15_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
__readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
{
struct dirent *dp;
int saved_errno;
@ -135,4 +133,6 @@ freebsd15_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
return (0);
}
__sym_compat(readdir_r, freebsd15_readdir_r, FBSD_1.5);
__strong_reference(__readdir_r, readdir_r);
__warn_references(readdir_r,
"warning: this program uses readdir_r(), which is unsafe.");