[libbluray-devel] Use readdir() instead of readdir_r() with glibc 2.24+

npzacs git at videolan.org
Sat Sep 16 12:45:08 CEST 2017


libbluray | branch: master | npzacs <npzacs at gmail.com> | Sat Sep 16 13:11:14 2017 +0300| [5db811ba241e5e05fb59a23d780180bdf93b0265] | committer: npzacs

Use readdir() instead of readdir_r() with glibc 2.24+

> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=5db811ba241e5e05fb59a23d780180bdf93b0265
---

 src/file/dir_posix.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/file/dir_posix.c b/src/file/dir_posix.c
index 772a68b5..aadf6fe4 100644
--- a/src/file/dir_posix.c
+++ b/src/file/dir_posix.c
@@ -32,6 +32,13 @@
 #   include <dirent.h>
 #endif
 
+#if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
+#  if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 24)
+#    define USE_READDIR
+#    include <errno.h>
+#  endif
+#endif
+
 static void _dir_close_posix(BD_DIR_H *dir)
 {
     if (dir) {
@@ -45,17 +52,28 @@ static void _dir_close_posix(BD_DIR_H *dir)
 
 static int _dir_read_posix(BD_DIR_H *dir, BD_DIRENT *entry)
 {
-    struct dirent e, *p_e;
+    struct dirent *p_e;
+
+#ifdef USE_READDIR
+    errno = 0;
+    p_e = readdir((DIR*)dir->internal);
+    if (!p_e && errno) {
+        return -1;
+    }
+#else /* USE_READDIR */
     int result;
+    struct dirent e;
 
     result = readdir_r((DIR*)dir->internal, &e, &p_e);
     if (result) {
         return -result;
     }
+#endif /* USE_READDIR */
+
     if (p_e == NULL) {
         return 1;
     }
-    strncpy(entry->d_name, e.d_name, sizeof(entry->d_name));
+    strncpy(entry->d_name, p_e->d_name, sizeof(entry->d_name));
     entry->d_name[sizeof(entry->d_name) - 1] = 0;
 
     return 0;



More information about the libbluray-devel mailing list