summaryrefslogtreecommitdiffstats
path: root/src/corelib/io
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@theqtcompany.com>2015-07-17 15:06:22 +0200
committerSimon Hausmann <simon.hausmann@theqtcompany.com>2015-07-17 16:35:42 +0200
commitb2603b76655ac819e43c063bb6f16bc95f358083 (patch)
tree0fbe2c367ebfffdb70e9e3f21a7cf408bafd9626 /src/corelib/io
parent99b94aadf875c822afb6c2580e43355ac392ac92 (diff)
parent756266d01560157b7274e466b9ffc1b0e2ef9a1f (diff)
Merge remote-tracking branch 'origin/5.5' into HEAD
Conflicts: src/plugins/platforms/windows/qwindowsopengltester.cpp Change-Id: Ia7abeba9395ccf84e2fa81b91a5725a86dedb9fe
Diffstat (limited to 'src/corelib/io')
-rw-r--r--src/corelib/io/io.pri1
-rw-r--r--src/corelib/io/qdir.cpp16
-rw-r--r--src/corelib/io/qloggingregistry.cpp29
-rw-r--r--src/corelib/io/qprocess_unix.cpp15
-rw-r--r--src/corelib/io/qsavefile.cpp3
-rw-r--r--src/corelib/io/qtemporaryfile.cpp25
-rw-r--r--src/corelib/io/qtemporaryfile_p.h14
7 files changed, 63 insertions, 40 deletions
diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index 207de2a85b..f496d037d8 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -147,6 +147,7 @@ win32 {
SOURCES += io/qsettings_mac.cpp
OBJECTIVE_SOURCES += io/qurl_mac.mm
}
+ freebsd: LIBS_PRIVATE += -lutil # qlockfile_unix.cpp requires this
mac {
osx {
OBJECTIVE_SOURCES += io/qfilesystemwatcher_fsevents.mm
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp
index 2ae865a534..e1d9858a66 100644
--- a/src/corelib/io/qdir.cpp
+++ b/src/corelib/io/qdir.cpp
@@ -1503,11 +1503,19 @@ bool QDir::removeRecursively()
while (di.hasNext()) {
di.next();
const QFileInfo& fi = di.fileInfo();
+ const QString &filePath = di.filePath();
bool ok;
- if (fi.isDir() && !fi.isSymLink())
- ok = QDir(di.filePath()).removeRecursively(); // recursive
- else
- ok = QFile::remove(di.filePath());
+ if (fi.isDir() && !fi.isSymLink()) {
+ ok = QDir(filePath).removeRecursively(); // recursive
+ } else {
+ ok = QFile::remove(filePath);
+ if (!ok) { // Read-only files prevent directory deletion on Windows, retry with Write permission.
+ const QFile::Permissions permissions = QFile::permissions(filePath);
+ if (!(permissions & QFile::WriteUser))
+ ok = QFile::setPermissions(filePath, permissions | QFile::WriteUser)
+ && QFile::remove(filePath);
+ }
+ }
if (!ok)
success = false;
}
diff --git a/src/corelib/io/qloggingregistry.cpp b/src/corelib/io/qloggingregistry.cpp
index 85e73db652..ed775d62e0 100644
--- a/src/corelib/io/qloggingregistry.cpp
+++ b/src/corelib/io/qloggingregistry.cpp
@@ -210,20 +210,23 @@ void QLoggingSettingsParser::setContent(QTextStream &stream)
if (_section == QLatin1String("Rules")) {
int equalPos = line.indexOf(QLatin1Char('='));
- if ((equalPos != -1)
- && (line.lastIndexOf(QLatin1Char('=')) == equalPos)) {
- const QStringRef pattern = line.leftRef(equalPos);
- const QStringRef valueStr = line.midRef(equalPos + 1);
- int value = -1;
- if (valueStr == QLatin1String("true"))
- value = 1;
- else if (valueStr == QLatin1String("false"))
- value = 0;
- QLoggingRule rule(pattern, (value == 1));
- if (rule.flags != 0 && (value != -1))
- _rules.append(rule);
- else
+ if (equalPos != -1) {
+ if (line.lastIndexOf(QLatin1Char('=')) == equalPos) {
+ const QStringRef pattern = line.leftRef(equalPos);
+ const QStringRef valueStr = line.midRef(equalPos + 1);
+ int value = -1;
+ if (valueStr == QLatin1String("true"))
+ value = 1;
+ else if (valueStr == QLatin1String("false"))
+ value = 0;
+ QLoggingRule rule(pattern, (value == 1));
+ if (rule.flags != 0 && (value != -1))
+ _rules.append(rule);
+ else
+ warnMsg("Ignoring malformed logging rule: '%s'", line.toUtf8().constData());
+ } else {
warnMsg("Ignoring malformed logging rule: '%s'", line.toUtf8().constData());
+ }
}
}
}
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 0d6ef9e60f..4c3432d6b6 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -1075,20 +1075,17 @@ bool QProcessPrivate::waitForDeadChild()
return true; // child has already exited
// read the process information from our fd
- siginfo_t info;
- qint64 ret = qt_safe_read(forkfd, &info, sizeof info);
- Q_ASSERT(ret == sizeof info);
- Q_UNUSED(ret);
+ forkfd_info info;
+ int ret;
+ EINTR_LOOP(ret, forkfd_wait(forkfd, &info, Q_NULLPTR));
- Q_ASSERT(info.si_pid == pid_t(pid));
-
- exitCode = info.si_status;
- crashed = info.si_code != CLD_EXITED;
+ exitCode = info.status;
+ crashed = info.code != CLD_EXITED;
delete deathNotifier;
deathNotifier = 0;
- qt_safe_close(forkfd);
+ EINTR_LOOP(ret, forkfd_close(forkfd));
forkfd = -1; // Child is dead, don't try to kill it anymore
#if defined QPROCESS_DEBUG
diff --git a/src/corelib/io/qsavefile.cpp b/src/corelib/io/qsavefile.cpp
index ffa6ad1c55..5a325f8e2c 100644
--- a/src/corelib/io/qsavefile.cpp
+++ b/src/corelib/io/qsavefile.cpp
@@ -215,7 +215,8 @@ bool QSaveFile::open(OpenMode mode)
d->finalFileName = existingFile.filePath();
}
- d->fileEngine = new QTemporaryFileEngine(d->finalFileName, 0666);
+ d->fileEngine = new QTemporaryFileEngine;
+ static_cast<QTemporaryFileEngine *>(d->fileEngine)->initialize(d->finalFileName, 0666);
// Same as in QFile: QIODevice provides the buffering, so there's no need to request it from the file engine.
if (!d->fileEngine->open(mode | QIODevice::Unbuffered)) {
QFileDevice::FileError err = d->fileEngine->error();
diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp
index bdf4392275..e8e8d8c878 100644
--- a/src/corelib/io/qtemporaryfile.cpp
+++ b/src/corelib/io/qtemporaryfile.cpp
@@ -409,14 +409,24 @@ QTemporaryFilePrivate::~QTemporaryFilePrivate()
QAbstractFileEngine *QTemporaryFilePrivate::engine() const
{
if (!fileEngine) {
- if (fileName.isEmpty())
- fileEngine = new QTemporaryFileEngine(templateName, 0600);
- else
- fileEngine = new QTemporaryFileEngine(fileName, 0600, false);
+ fileEngine = new QTemporaryFileEngine;
+ resetFileEngine();
}
return fileEngine;
}
+void QTemporaryFilePrivate::resetFileEngine() const
+{
+ if (!fileEngine)
+ return;
+
+ QTemporaryFileEngine *tef = static_cast<QTemporaryFileEngine *>(fileEngine);
+ if (fileName.isEmpty())
+ tef->initialize(templateName, 0600);
+ else
+ tef->initialize(fileName, 0600, false);
+}
+
QString QTemporaryFilePrivate::defaultTemplateName()
{
QString baseName;
@@ -769,6 +779,13 @@ bool QTemporaryFile::open(OpenMode flags)
}
}
+ // reset the engine state so it creates a new, unique file name from the template;
+ // equivalent to:
+ // delete d->fileEngine;
+ // d->fileEngine = 0;
+ // d->engine();
+ d->resetFileEngine();
+
if (QFile::open(flags)) {
d->fileName = d->fileEngine->fileName(QAbstractFileEngine::DefaultName);
return true;
diff --git a/src/corelib/io/qtemporaryfile_p.h b/src/corelib/io/qtemporaryfile_p.h
index 341ae9bd3f..8002990270 100644
--- a/src/corelib/io/qtemporaryfile_p.h
+++ b/src/corelib/io/qtemporaryfile_p.h
@@ -64,6 +64,7 @@ protected:
~QTemporaryFilePrivate();
QAbstractFileEngine *engine() const;
+ void resetFileEngine() const;
bool autoRemove;
QString templateName;
@@ -77,22 +78,17 @@ class QTemporaryFileEngine : public QFSFileEngine
{
Q_DECLARE_PRIVATE(QFSFileEngine)
public:
-
- QTemporaryFileEngine(const QString &file,
- quint32 fileMode,
- bool fileIsTemplate = true) :
- QFSFileEngine(),
- fileMode(fileMode),
- filePathIsTemplate(fileIsTemplate),
- filePathWasTemplate(fileIsTemplate)
+ void initialize(const QString &file, quint32 mode, bool nameIsTemplate = true)
{
Q_D(QFSFileEngine);
+ Q_ASSERT(!isReallyOpen());
+ fileMode = mode;
+ filePathIsTemplate = filePathWasTemplate = nameIsTemplate;
d->fileEntry = QFileSystemEntry(file);
if (!filePathIsTemplate)
QFSFileEngine::setFileName(file);
}
-
~QTemporaryFileEngine();
bool isReallyOpen() const;