libc: Remove readdir_r(3)
This function was never safe to use. We marked it deprecated in the manual page in 2016, and it is marked obsolete in POSIX 2024. We previously added a linker warning and annotated the prototype; now that stable/15 has been branched, we can remove it from main. Relnotes: yes Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D52474
This commit is contained in:
@@ -342,7 +342,6 @@ 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
|
||||
|
||||
@@ -418,7 +418,6 @@ FBSD_1.5 {
|
||||
globfree;
|
||||
nftw;
|
||||
readdir;
|
||||
readdir_r;
|
||||
scandir;
|
||||
sem_clockwait_np;
|
||||
setproctitle_fast;
|
||||
|
||||
@@ -25,14 +25,13 @@
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd August 1, 2020
|
||||
.Dd September 5, 2025
|
||||
.Dt DIRECTORY 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm opendir ,
|
||||
.Nm fdopendir ,
|
||||
.Nm readdir ,
|
||||
.Nm readdir_r ,
|
||||
.Nm telldir ,
|
||||
.Nm seekdir ,
|
||||
.Nm rewinddir ,
|
||||
@@ -50,8 +49,6 @@
|
||||
.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
|
||||
@@ -65,15 +62,6 @@
|
||||
.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
|
||||
@@ -112,7 +100,6 @@ 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.
|
||||
@@ -144,34 +131,6 @@ 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
|
||||
@@ -305,9 +264,7 @@ is not associated with a directory.
|
||||
.Pp
|
||||
The
|
||||
.Fn readdir
|
||||
and
|
||||
.Fn readdir_r
|
||||
functions may also fail and set
|
||||
function may also fail and set
|
||||
.Va errno
|
||||
for any of the errors specified for the routine
|
||||
.Xr getdents 2 .
|
||||
@@ -338,7 +295,6 @@ The
|
||||
.Fn fdopendir ,
|
||||
.Fn opendir ,
|
||||
.Fn readdir ,
|
||||
.Fn readdir_r ,
|
||||
.Fn rewinddir ,
|
||||
.Fn seekdir
|
||||
and
|
||||
@@ -391,7 +347,8 @@ 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
|
||||
"push back the last entry read", e.g., Samba.
|
||||
.Dq 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.
|
||||
|
||||
@@ -37,6 +37,7 @@ 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 **);
|
||||
|
||||
@@ -60,7 +60,4 @@ 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_ */
|
||||
|
||||
@@ -95,7 +95,7 @@ freebsd11_readdir_r(DIR *dirp, struct freebsd11_dirent *entry,
|
||||
struct dirent xentry, *xresult;
|
||||
int error;
|
||||
|
||||
error = __readdir_r(dirp, &xentry, &xresult);
|
||||
error = freebsd15_readdir_r(dirp, &xentry, &xresult);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
if (xresult != NULL) {
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
#include "gen-private.h"
|
||||
#include "telldir.h"
|
||||
|
||||
#include "gen-compat.h"
|
||||
|
||||
/*
|
||||
* get next entry in a directory.
|
||||
*/
|
||||
@@ -104,7 +106,7 @@ readdir(DIR *dirp)
|
||||
}
|
||||
|
||||
int
|
||||
__readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
|
||||
freebsd15_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
|
||||
{
|
||||
struct dirent *dp;
|
||||
int saved_errno;
|
||||
@@ -133,6 +135,4 @@ __readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
|
||||
return (0);
|
||||
}
|
||||
|
||||
__strong_reference(__readdir_r, readdir_r);
|
||||
__warn_references(readdir_r,
|
||||
"warning: this program uses readdir_r(), which is unsafe.");
|
||||
__sym_compat(readdir_r, freebsd15_readdir_r, FBSD_1.5);
|
||||
|
||||
Reference in New Issue
Block a user