diff options
Diffstat (limited to 'src/corelib/io/qfsfileengine_unix.cpp')
-rw-r--r-- | src/corelib/io/qfsfileengine_unix.cpp | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/src/corelib/io/qfsfileengine_unix.cpp b/src/corelib/io/qfsfileengine_unix.cpp index a127b76fcc..5806689182 100644 --- a/src/corelib/io/qfsfileengine_unix.cpp +++ b/src/corelib/io/qfsfileengine_unix.cpp @@ -115,14 +115,14 @@ bool QFSFileEnginePrivate::nativeOpenImpl(QIODevice::OpenMode openMode, mode_t m // Seek to the end when in Append mode. if (flags & QFile::Append) { - int ret; + QT_OFF_T ret; do { ret = QT_LSEEK(fd, 0, SEEK_END); } while (ret == -1 && errno == EINTR); if (ret == -1) { q->setError(errno == EMFILE ? QFile::ResourceError : QFile::OpenError, - qt_error_string(int(errno))); + qt_error_string(errno)); return false; } } @@ -160,9 +160,9 @@ bool QFSFileEnginePrivate::nativeSyncToDisk() Q_Q(QFSFileEngine); int ret; #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 - EINTR_LOOP(ret, fdatasync(nativeHandle())); + QT_EINTR_LOOP(ret, fdatasync(nativeHandle())); #else - EINTR_LOOP(ret, fsync(nativeHandle())); + QT_EINTR_LOOP(ret, fsync(nativeHandle())); #endif if (ret != 0) q->setError(QFile::WriteError, qt_error_string(errno)); @@ -221,7 +221,7 @@ qint64 QFSFileEnginePrivate::nativeRead(char *data, qint64 len) } if (readBytes == 0 && !feof(fh)) { // if we didn't read anything and we're not at EOF, it must be an error - q->setError(QFile::ReadError, qt_error_string(int(errno))); + q->setError(QFile::ReadError, qt_error_string(errno)); return -1; } return readBytes; @@ -450,6 +450,12 @@ QString QFSFileEngine::fileName(FileName file) const return entry.filePath(); } return QString(); + case RawLinkPath: + if (d->isSymlink()) { + QFileSystemEntry entry = QFileSystemEngine::getRawLinkPath(d->fileEntry, d->metaData); + return entry.filePath(); + } + return QString(); case JunctionName: return QString(); case DefaultName: @@ -489,6 +495,10 @@ bool QFSFileEngine::setPermissions(uint perms) Q_D(QFSFileEngine); QSystemError error; bool ok; + + // clear cached state (if any) + d->metaData.clearFlags(QFileSystemMetaData::Permissions); + if (d->fd != -1) ok = QFileSystemEngine::setPermissions(d->fd, QFile::Permissions(perms), error); else @@ -515,7 +525,7 @@ bool QFSFileEngine::setSize(qint64 size) return ret; } -bool QFSFileEngine::setFileTime(const QDateTime &newDate, FileTime time) +bool QFSFileEngine::setFileTime(const QDateTime &newDate, QFile::FileTime time) { Q_D(QFSFileEngine); @@ -550,16 +560,16 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla Q_Q(QFSFileEngine); if (openMode == QIODevice::NotOpen) { - q->setError(QFile::PermissionsError, qt_error_string(int(EACCES))); + q->setError(QFile::PermissionsError, qt_error_string(EACCES)); return nullptr; } if (offset < 0 || offset > maxFileOffset - || size < 0 || quint64(size) > quint64(size_t(-1))) { - q->setError(QFile::UnspecifiedError, qt_error_string(int(EINVAL))); + || size <= 0 + || quint64(size) > quint64(size_t(-1))) { + q->setError(QFile::UnspecifiedError, qt_error_string(EINVAL)); return nullptr; } - // If we know the mapping will extend beyond EOF, fail early to avoid // undefined behavior. Otherwise, let mmap have its say. if (doStat(QFileSystemMetaData::SizeAttribute) @@ -584,7 +594,7 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla int extra = offset % pageSize; if (quint64(size + extra) > quint64((size_t)-1)) { - q->setError(QFile::UnspecifiedError, qt_error_string(int(EINVAL))); + q->setError(QFile::UnspecifiedError, qt_error_string(EINVAL)); return nullptr; } @@ -602,16 +612,16 @@ uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFla switch(errno) { case EBADF: - q->setError(QFile::PermissionsError, qt_error_string(int(EACCES))); + q->setError(QFile::PermissionsError, qt_error_string(EACCES)); break; case ENFILE: case ENOMEM: - q->setError(QFile::ResourceError, qt_error_string(int(errno))); + q->setError(QFile::ResourceError, qt_error_string(errno)); break; case EINVAL: // size are out of bounds default: - q->setError(QFile::UnspecifiedError, qt_error_string(int(errno))); + q->setError(QFile::UnspecifiedError, qt_error_string(errno)); break; } return nullptr; |