[vlc-devel] [PATCH 2/2] Work around the lack of dirfd()

Maciej Blizinski maciej at opencsw.org
Mon Feb 20 09:06:45 CET 2012


Detect whether the system supports dirfd(). There was a Solaris-specific
workaround in one of the files, but it's a better idea to test for the
function and not rely on the OS detection.
---
 configure.ac               |    2 ++
 include/vlc_common.h       |    6 ++++++
 include/vlc_fixups.h       |    7 +++++++
 modules/access/directory.c |   11 ++---------
 modules/misc/gnutls.c      |    2 +-
 src/misc/filesystem.c      |    2 +-
 6 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/configure.ac b/configure.ac
index fa99eb7..6904bdd1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2334,6 +2334,8 @@ AS_IF([test "${have_ipv6}" = "yes"], [
 AC_CHECK_FUNCS(inet_ntop,[
   AC_DEFINE(HAVE_INET_NTOP, 1, [Define to 1 if you have inet_ntop().])])
 
+AC_CHECK_FUNCS(dirfd,[
+  AC_DEFINE(HAVE_DIRFD, 1, [Define to 1 if you have the dirfd() function.])])
 
 dnl
 dnl  GME demux plugin
diff --git a/include/vlc_common.h b/include/vlc_common.h
index 7f488a5..efd3b79 100644
--- a/include/vlc_common.h
+++ b/include/vlc_common.h
@@ -887,4 +887,10 @@ VLC_EXPORT( const char *, VLC_Compiler, ( void ) LIBVLC_USED );
     "Public License;\nsee the file named COPYING for details.\n" \
     "Written by the VideoLAN team; see the AUTHORS file.\n")
 
+#ifndef HAVE_DIRFD
+#define DIRFD(a) ((a)->dd_fd)
+#else
+#define DIRFD(a) (dirfd(a))
+#endif
+
 #endif /* !VLC_COMMON_H */
diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h
index ef37367..8808b0e 100644
--- a/include/vlc_fixups.h
+++ b/include/vlc_fixups.h
@@ -275,4 +275,11 @@ long jrand48 (unsigned short subi[3]);
 long nrand48 (unsigned short subi[3]);
 #endif
 
+/* dirfd() not available on some systems, e.g. Solaris 9 and 10 */
+#ifndef HAVE_DIRFD
+#define DIRFD(a) ((a)->dd_fd)
+#else
+#define DIRFD(a) (dirfd(a))
+#endif
+
 #endif /* !LIBVLC_FIXUPS_H */
diff --git a/modules/access/directory.c b/modules/access/directory.c
index 7f29547..35fe91b 100644
--- a/modules/access/directory.c
+++ b/modules/access/directory.c
@@ -46,13 +46,6 @@
 #   include <io.h>
 #endif
 
-#ifdef __sun__
-static inline int dirfd (DIR *dir)
-{
-    return dir->dd_fd;
-}
-#endif
-
 #include <vlc_fs.h>
 #include <vlc_url.h>
 #include <vlc_strings.h>
@@ -155,7 +148,7 @@ int DirInit (access_t *p_access, DIR *handle)
     root->i = 0;
 #ifdef HAVE_OPENAT
     struct stat st;
-    if (fstat (dirfd (handle), &st))
+    if (fstat (DIRFD (handle), &st))
     {
         free (root);
         free (uri);
@@ -315,7 +308,7 @@ block_t *DirBlock (access_t *p_access)
     {
         DIR *handle;
 #ifdef HAVE_OPENAT
-        int fd = vlc_openat (dirfd (current->handle), entry, O_RDONLY);
+        int fd = vlc_openat (DIRFD (current->handle), entry, O_RDONLY);
         if (fd == -1)
             goto skip; /* File cannot be opened... forget it */
 
diff --git a/modules/misc/gnutls.c b/modules/misc/gnutls.c
index 1aba7da..5df560e 100644
--- a/modules/misc/gnutls.c
+++ b/modules/misc/gnutls.c
@@ -538,7 +538,7 @@ gnutls_Addx509Directory( vlc_object_t *p_this,
     else
     {
         struct stat st1, st2;
-        int fd = dirfd( dir );
+        int fd = DIRFD( dir );
 
         /*
          * Gets stats for the directory path, checks that it is not a
diff --git a/src/misc/filesystem.c b/src/misc/filesystem.c
index 9138ae9..bb3186f 100644
--- a/src/misc/filesystem.c
+++ b/src/misc/filesystem.c
@@ -190,7 +190,7 @@ char *vlc_readdir( DIR *dir )
     struct dirent *ent;
     char *path = NULL;
 
-    long len = fpathconf (dirfd (dir), _PC_NAME_MAX);
+    long len = fpathconf (DIRFD (dir), _PC_NAME_MAX);
     if (len == -1)
     {
 #ifdef NAME_MAX
-- 
1.7.5.4




More information about the vlc-devel mailing list