summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libc/gen/directory.319
-rw-r--r--lib/libc/gen/readdir.c13
2 files changed, 27 insertions, 5 deletions
diff --git a/lib/libc/gen/directory.3 b/lib/libc/gen/directory.3
index 23cd2f9..6334d38 100644
--- a/lib/libc/gen/directory.3
+++ b/lib/libc/gen/directory.3
@@ -38,6 +38,7 @@
.Sh NAME
.Nm opendir ,
.Nm readdir ,
+.Nm readdir_r ,
.Nm telldir ,
.Nm seekdir ,
.Nm rewinddir ,
@@ -51,6 +52,8 @@
.Fn opendir "const char *filename"
.Ft struct dirent *
.Fn readdir "DIR *dirp"
+.Ft int
+.Fn readdir_r "DIR *dirp" "struct dirent *entry" "struct dirent **result"
.Ft long
.Fn telldir "const DIR *dirp"
.Ft void
@@ -90,6 +93,22 @@ upon reaching the end of the directory or detecting an invalid
.Fn seekdir
operation.
.Pp
+.Fn readdir_r
+provides the same functionality as
+.Fn readdir ,
+but the caller must provide a directory
+.Fa entry
+buffer to store the results in. 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 .
+.Fn readdir_r
+returns 0 on success or an error number to indicate failure.
+.Pp
The
.Fn telldir
function
diff --git a/lib/libc/gen/readdir.c b/lib/libc/gen/readdir.c
index 74246b9..9b8c175 100644
--- a/lib/libc/gen/readdir.c
+++ b/lib/libc/gen/readdir.c
@@ -95,8 +95,9 @@ readdir_r(dirp, entry, result)
return EBADF;
}
#ifdef _THREAD_SAFE
- if ((ret = _FD_LOCK(dirp->dd_fd, FD_READ, NULL)) != 0)
+ if ((ret = _FD_LOCK(dirp->dd_fd, FD_READ, NULL)) != 0) {
return ret;
+ }
#endif
errno = 0;
dp = readdir(dirp);
@@ -106,14 +107,16 @@ readdir_r(dirp, entry, result)
#endif
return errno;
}
- if (dp != NULL)
+ if (dp != NULL) {
memcpy(entry, dp, sizeof *entry);
+ }
#ifdef _THREAD_SAFE
_FD_UNLOCK(dirp->dd_fd, FD_READ);
#endif
- if (dp != NULL)
- *result = entry;
- else
+ if (dp != NULL) {
+ *result = entry;
+ } else {
*result = NULL;
+ }
return 0;
}
OpenPOWER on IntegriCloud