diff --git a/src/engine/idutils.h b/src/engine/idutils.h --- a/src/engine/idutils.h +++ b/src/engine/idutils.h @@ -47,30 +47,40 @@ */ inline quint64 statBufToId(const QT_STATBUF& stBuf) { - // We're loosing 32 bits of info, so this could potentially break + // We're losing 32 bits of info, so this could potentially break // on file systems with really large inode and device ids return devIdAndInodeToId(static_cast(stBuf.st_dev), static_cast(stBuf.st_ino)); } -inline quint64 filePathToId(const QByteArray& filePath) +inline int filePathToStat(const QByteArray& filePath, QT_STATBUF& statBuf) { - QT_STATBUF statBuf; #ifndef Q_OS_WIN - if (QT_LSTAT(filePath.constData(), &statBuf) != 0) { - return 0; - } + return QT_LSTAT(filePath.constData(), &statBuf); #else - if (QT_STAT(filePath.constData(), &statBuf) != 0) { - return 0; - } - if (QFileInfo(filePath).isSymLink()) { - if (QT_STAT(QFileInfo(filePath).symLinkTarget().toUtf8().constData(), &statBuf) != 0) { - return 0; - } + const int ret = QT_STAT(filePath.constData(), &statBuf) + if (ret == 0 && QFileInfo(filePath).isSymLink()) { + return QT_STAT(QFileInfo(filePath).symLinkTarget().toUtf8().constData(), &statBuf) + } else { + return ret; } #endif - return statBufToId(statBuf); +} + +inline QT_STATBUF filePathToStat(const QByteArray& filePath) +{ + QT_STATBUF statBuf; + const int ret = filePathToStat(filePath, statBuf); + //TODO: if (ret != 0) qDebug() ? + Q_UNUSED(ret) + return statBuf; +} + +inline quint64 filePathToId(const QByteArray& filePath) +{ + QT_STATBUF statBuf; + const int ret = filePathToStat(filePath, statBuf); + return ret ? 0 : statBufToId(statBuf); } inline quint32 idToInode(quint64 id) diff --git a/src/file/basicindexingjob.cpp b/src/file/basicindexingjob.cpp --- a/src/file/basicindexingjob.cpp +++ b/src/file/basicindexingjob.cpp @@ -51,7 +51,7 @@ const QByteArray url = QFile::encodeName(m_filePath); QT_STATBUF statBuf; - if (QT_LSTAT(url.data(), &statBuf) != 0) { + if (filePathToStat(url, statBuf) != 0) { return false; } diff --git a/src/file/fileinfo.cpp b/src/file/fileinfo.cpp --- a/src/file/fileinfo.cpp +++ b/src/file/fileinfo.cpp @@ -19,17 +19,18 @@ */ #include "fileinfo.h" +#include "idutils.h" using namespace Baloo; FileInfo::FileInfo(const QByteArray& filePath) : m_filePath(filePath) , m_exists(true) { Q_ASSERT(!filePath.endsWith('/')); - if (QT_LSTAT(filePath.data(), &m_statBuf) != 0) { + if (filePathToStat(filePath, m_statBuf) != 0) { m_exists = false; - memset(&m_statBuf, 0, sizeof(QT_STATBUF)); + memset(&m_statBuf, 0, sizeof(m_statBuf)); } } diff --git a/src/kioslaves/search/kio_search.cpp b/src/kioslaves/search/kio_search.cpp --- a/src/kioslaves/search/kio_search.cpp +++ b/src/kioslaves/search/kio_search.cpp @@ -21,6 +21,7 @@ #include "query.h" #include "resultiterator.h" +#include "idutils.h" #include #include @@ -92,7 +93,8 @@ // Code from kdelibs/kioslaves/file.cpp QT_STATBUF statBuf; - if (QT_LSTAT(QFile::encodeName(filePath).data(), &statBuf) == 0) { + const QByteArray ba = QFile::encodeName(filePath); + if (filePathToStat(ba, statBuf) == 0) { uds.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, statBuf.st_mtime); uds.insert(KIO::UDSEntry::UDS_ACCESS_TIME, statBuf.st_atime); uds.insert(KIO::UDSEntry::UDS_SIZE, statBuf.st_size); diff --git a/src/kioslaves/timeline/kio_timeline.cpp b/src/kioslaves/timeline/kio_timeline.cpp --- a/src/kioslaves/timeline/kio_timeline.cpp +++ b/src/kioslaves/timeline/kio_timeline.cpp @@ -23,6 +23,7 @@ #include "timelinetools.h" #include "query.h" #include "resultiterator.h" +#include "idutils.h" #include #include @@ -79,7 +80,8 @@ KIO::UDSEntry uds; // Code from kdelibs/kioslaves/file.cpp QT_STATBUF statBuf; - if( QT_LSTAT(QFile::encodeName(filePath).data(), &statBuf) == 0) { + const QByteArray url = QFile::encodeName(filePath); + if (filePathToStat(url, statBuf) == 0) { uds.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, statBuf.st_mtime); uds.insert(KIO::UDSEntry::UDS_ACCESS_TIME, statBuf.st_atime); uds.insert(KIO::UDSEntry::UDS_SIZE, statBuf.st_size);