=?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: ntdll: Add a helper function that returns the record length of a dirent struct.

Alexandre Julliard julliard at winehq.org
Mon Jun 4 13:27:13 CDT 2012


Module: wine
Branch: master
Commit: 54a9c0fc607f9345505ef45a87247045efbd7488
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=54a9c0fc607f9345505ef45a87247045efbd7488

Author: André Hentschel <nerv at dawncrow.de>
Date:   Sat Jun  2 19:05:30 2012 +0200

ntdll: Add a helper function that returns the record length of a dirent struct.

---

 configure              |   14 ++++++++++++++
 configure.ac           |    6 ++++++
 dlls/ntdll/directory.c |   19 ++++++++++++++-----
 include/config.h.in    |    3 +++
 4 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/configure b/configure
index e8201d3..a55c6a6 100755
--- a/configure
+++ b/configure
@@ -13794,6 +13794,20 @@ _ACEOF
 fi
 
 
+ac_fn_c_check_member "$LINENO" "struct dirent" "d_reclen" "ac_cv_member_struct_dirent_d_reclen" "#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+"
+if test "x$ac_cv_member_struct_dirent_d_reclen" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_DIRENT_D_RECLEN 1
+_ACEOF
+
+
+fi
+
+
 ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_accrights" "ac_cv_member_struct_msghdr_msg_accrights" "#include <sys/types.h>
 #ifdef HAVE_SYS_SOCKET_H
 # include <sys/socket.h>
diff --git a/configure.ac b/configure.ac
index d1acb72..5cd12a5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2219,6 +2219,12 @@ AC_CHECK_MEMBERS([struct statvfs.f_blocks],,,
 #include <sys/statvfs.h>
 #endif])
 
+dnl Check for dirent.d_reclen
+AC_CHECK_MEMBERS([struct dirent.d_reclen],,,
+[#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif])
+
 dnl Check for socket structure members
 AC_CHECK_MEMBERS([struct msghdr.msg_accrights, struct sockaddr.sa_len, struct sockaddr_un.sun_len],,,
 [#include <sys/types.h>
diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c
index 329e063..c8fff6b 100644
--- a/dlls/ntdll/directory.c
+++ b/dlls/ntdll/directory.c
@@ -1709,6 +1709,15 @@ static inline int wine_getdirentries(int fd, char *buf, int nbytes, long *basep)
     return res;
 }
 
+static inline int dir_reclen(struct dirent *de)
+{
+#ifdef HAVE_STRUCT_DIRENT_D_RECLEN
+    return de->d_reclen;
+#else
+    return _DIRENT_RECLEN(de->d_namlen);
+#endif
+}
+
 /***********************************************************************
  *           read_directory_getdirentries
  *
@@ -1754,9 +1763,9 @@ static int read_directory_getdirentries( int fd, IO_STATUS_BLOCK *io, void *buff
         /* check if we got . and .. from getdirentries */
         if (res > 0)
         {
-            if (!strcmp( de->d_name, "." ) && res > de->d_reclen)
+            if (!strcmp( de->d_name, "." ) && res > dir_reclen(de))
             {
-                struct dirent *next_de = (struct dirent *)(data + de->d_reclen);
+                struct dirent *next_de = (struct dirent *)(data + dir_reclen(de));
                 if (!strcmp( next_de->d_name, ".." )) fake_dot_dot = 0;
             }
         }
@@ -1792,7 +1801,7 @@ static int read_directory_getdirentries( int fd, IO_STATUS_BLOCK *io, void *buff
 
     while (res > 0)
     {
-        res -= de->d_reclen;
+        res -= dir_reclen(de);
         if (de->d_fileno &&
             !(fake_dot_dot && (!strcmp( de->d_name, "." ) || !strcmp( de->d_name, ".." ))) &&
             ((info = append_entry( buffer, io, length, de->d_name, NULL, mask, class ))))
@@ -1819,7 +1828,7 @@ static int read_directory_getdirentries( int fd, IO_STATUS_BLOCK *io, void *buff
             if (res > 0 && (single_entry || io->Information + max_dir_info_size(class) > length))
             {
                 lseek( fd, (unsigned long)restart_pos, SEEK_SET );
-                size = (char *)de + de->d_reclen - data;
+                size = (char *)de + dir_reclen(de) - data;
                 io->Information = restart_info_pos;
                 last_info = restart_last_info;
                 goto restart;
@@ -1828,7 +1837,7 @@ static int read_directory_getdirentries( int fd, IO_STATUS_BLOCK *io, void *buff
         /* move on to the next entry */
         if (res > 0)
         {
-            de = (struct dirent *)((char *)de + de->d_reclen);
+            de = (struct dirent *)((char *)de + dir_reclen(de));
             continue;
         }
         if (size < initial_size) break;  /* already restarted once, give up now */
diff --git a/include/config.h.in b/include/config.h.in
index c4b67a0..7d6e261 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -785,6 +785,9 @@
 /* Define to 1 if you have the `strtoull' function. */
 #undef HAVE_STRTOULL
 
+/* Define to 1 if `d_reclen' is a member of `struct dirent'. */
+#undef HAVE_STRUCT_DIRENT_D_RECLEN
+
 /* Define to 1 if `direction' is a member of `struct ff_effect'. */
 #undef HAVE_STRUCT_FF_EFFECT_DIRECTION
 




More information about the wine-cvs mailing list