QNX: Fix QDir::entryInfoList()
If D_FLAG_FILTER is set, duplicate name entries are filtered out, so this flag has to be set along with D_FLAG_STAT in the call to dircntl. Also releaved dependencies between defines__EXT_QNX__READDIR_R, __EXT_QNX__READDIR64_R and _POSIX_THREAD_SAFE_FUNCTIONS Task-number: QTBUG-38189 Change-Id: I4e620cb9967e3d1baf6f2109a7c83703702f805b Reviewed-by: Thomas McGuire <thomas.mcguire@kdab.com>
This commit is contained in:
parent
38aba919ac
commit
aee59f06e0
@ -83,7 +83,7 @@
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#define QT_USE_XOPEN_LFS_EXTENSIONS
|
||||
#if !defined(__EXT_QNX__READDIR64_R)
|
||||
#if defined(__EXT_QNX__READDIR_R) && !defined(__EXT_QNX__READDIR64_R)
|
||||
#define QT_NO_READDIR64
|
||||
#endif
|
||||
#include "../common/posix/qplatformdefs.h"
|
||||
|
@ -83,7 +83,7 @@
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#define QT_USE_XOPEN_LFS_EXTENSIONS
|
||||
#if !defined(__EXT_QNX__READDIR64_R)
|
||||
#if defined(__EXT_QNX__READDIR_R) && !defined(__EXT_QNX__READDIR64_R)
|
||||
#define QT_NO_READDIR64
|
||||
#endif
|
||||
#include "../common/posix/qplatformdefs.h"
|
||||
|
@ -224,7 +224,7 @@ bool QFileSystemEngine::fillMetaData(int fd, QFileSystemMetaData &data)
|
||||
return false;
|
||||
}
|
||||
|
||||
#if defined(Q_OS_QNX)
|
||||
#if defined(QT_EXT_QNX_READDIR_R)
|
||||
static void fillStat64fromStat32(struct stat64 *statBuf64, const struct stat &statBuf32)
|
||||
{
|
||||
statBuf64->st_mode = statBuf32.st_mode;
|
||||
@ -289,7 +289,7 @@ void QFileSystemMetaData::fillFromStatBuf(const QT_STATBUF &statBuffer)
|
||||
|
||||
void QFileSystemMetaData::fillFromDirEnt(const QT_DIRENT &entry)
|
||||
{
|
||||
#if defined(Q_OS_QNX)
|
||||
#if defined(QT_EXT_QNX_READDIR_R)
|
||||
knownFlagsMask = 0;
|
||||
entryFlags = 0;
|
||||
for (dirent_extra *extra = _DEXTRA_FIRST(&entry); _DEXTRA_VALID(extra, &entry);
|
||||
|
@ -95,10 +95,10 @@ private:
|
||||
#else
|
||||
QT_DIR *dir;
|
||||
QT_DIRENT *dirEntry;
|
||||
#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN)
|
||||
#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) || defined(QT_EXT_QNX_READDIR_R)
|
||||
// for readdir_r
|
||||
QScopedPointer<QT_DIRENT, QScopedPointerPodDeleter> mt_file;
|
||||
#if defined(Q_OS_QNX) && defined(__EXT_QNX__READDIR_R)
|
||||
#if defined(QT_EXT_QNX_READDIR_R)
|
||||
// for _readdir_r
|
||||
size_t direntSize;
|
||||
#endif
|
||||
|
@ -70,7 +70,7 @@ QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Fi
|
||||
if (!nativePath.endsWith('/'))
|
||||
nativePath.append('/');
|
||||
|
||||
#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN)
|
||||
#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN) || defined(QT_EXT_QNX_READDIR_R)
|
||||
// ### Race condition; we should use fpathconf and dirfd().
|
||||
size_t maxPathName = ::pathconf(nativePath.constData(), _PC_NAME_MAX);
|
||||
if (maxPathName == size_t(-1))
|
||||
@ -81,13 +81,14 @@ QFileSystemIterator::QFileSystemIterator(const QFileSystemEntry &entry, QDir::Fi
|
||||
Q_CHECK_PTR(p);
|
||||
|
||||
mt_file.reset(p);
|
||||
#if defined(Q_OS_QNX) && defined(__EXT_QNX__READDIR_R)
|
||||
#if defined(QT_EXT_QNX_READDIR_R)
|
||||
direntSize = maxPathName;
|
||||
|
||||
// Include extra stat information in the readdir() call (d_stat member of dirent_extra_stat).
|
||||
// This is used in QFileSystemMetaData::fillFromDirEnt() to avoid extra stat() calls when iterating
|
||||
// over directories
|
||||
if (dircntl(dir, D_SETFLAG, D_FLAG_STAT) == -1)
|
||||
// Include extra stat information in the readdir() call (d_stat member of
|
||||
// dirent_extra_stat). This is used in QFileSystemMetaData::fillFromDirEnt() to
|
||||
// avoid extra stat() calls when iterating over directories
|
||||
int flags = dircntl(dir, D_GETFLAG) | D_FLAG_STAT | D_FLAG_FILTER;
|
||||
if (dircntl(dir, D_SETFLAG, flags) == -1)
|
||||
lastError = errno;
|
||||
#endif
|
||||
#endif
|
||||
@ -105,7 +106,7 @@ bool QFileSystemIterator::advance(QFileSystemEntry &fileEntry, QFileSystemMetaDa
|
||||
if (!dir)
|
||||
return false;
|
||||
|
||||
#if defined(Q_OS_QNX) && defined(QT_EXT_QNX_READDIR_R)
|
||||
#if defined(QT_EXT_QNX_READDIR_R)
|
||||
lastError = QT_EXT_QNX_READDIR_R(dir, mt_file.data(), &dirEntry, direntSize);
|
||||
if (lastError)
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user