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

This commit is contained in:
André Hentschel 2012-06-02 19:05:30 +02:00 committed by Alexandre Julliard
parent eaab7a88f4
commit 54a9c0fc60
4 changed files with 37 additions and 5 deletions

14
configure vendored
View File

@ -13794,6 +13794,20 @@ _ACEOF
fi 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> 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 #ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h> # include <sys/socket.h>

View File

@ -2219,6 +2219,12 @@ AC_CHECK_MEMBERS([struct statvfs.f_blocks],,,
#include <sys/statvfs.h> #include <sys/statvfs.h>
#endif]) #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 dnl Check for socket structure members
AC_CHECK_MEMBERS([struct msghdr.msg_accrights, struct sockaddr.sa_len, struct sockaddr_un.sun_len],,, AC_CHECK_MEMBERS([struct msghdr.msg_accrights, struct sockaddr.sa_len, struct sockaddr_un.sun_len],,,
[#include <sys/types.h> [#include <sys/types.h>

View File

@ -1709,6 +1709,15 @@ static inline int wine_getdirentries(int fd, char *buf, int nbytes, long *basep)
return res; 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 * 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 */ /* check if we got . and .. from getdirentries */
if (res > 0) 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; 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) while (res > 0)
{ {
res -= de->d_reclen; res -= dir_reclen(de);
if (de->d_fileno && if (de->d_fileno &&
!(fake_dot_dot && (!strcmp( de->d_name, "." ) || !strcmp( de->d_name, ".." ))) && !(fake_dot_dot && (!strcmp( de->d_name, "." ) || !strcmp( de->d_name, ".." ))) &&
((info = append_entry( buffer, io, length, de->d_name, NULL, mask, class )))) ((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)) if (res > 0 && (single_entry || io->Information + max_dir_info_size(class) > length))
{ {
lseek( fd, (unsigned long)restart_pos, SEEK_SET ); 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; io->Information = restart_info_pos;
last_info = restart_last_info; last_info = restart_last_info;
goto restart; 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 */ /* move on to the next entry */
if (res > 0) if (res > 0)
{ {
de = (struct dirent *)((char *)de + de->d_reclen); de = (struct dirent *)((char *)de + dir_reclen(de));
continue; continue;
} }
if (size < initial_size) break; /* already restarted once, give up now */ if (size < initial_size) break; /* already restarted once, give up now */

View File

@ -785,6 +785,9 @@
/* Define to 1 if you have the `strtoull' function. */ /* Define to 1 if you have the `strtoull' function. */
#undef HAVE_STRTOULL #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'. */ /* Define to 1 if `direction' is a member of `struct ff_effect'. */
#undef HAVE_STRUCT_FF_EFFECT_DIRECTION #undef HAVE_STRUCT_FF_EFFECT_DIRECTION