From 174af05400f6344a11f4aa2228244c954cbbca97 Mon Sep 17 00:00:00 2001 From: Ievgenii Meshcheriakov Date: Wed, 10 Nov 2021 16:52:07 +0100 Subject: QDir: Add support for setting directory permissions to mkdir() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds an overload of the QDir::mkdir() method that accepts permissions. This allows setting of the directory permissions at the time of its creation. [ChangeLog][QtCore][QDir] Added QDir::mdkir() overload that accepts permissions argument. Task-number: QTBUG-79750 Change-Id: Ic9db723b94ff0d2da6e0b819ac2e5d1f9a4e2049 Reviewed-by: Edward Welbourne Reviewed-by: MÃ¥rten Nordheim --- tests/auto/corelib/io/qdir/tst_qdir.cpp | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'tests/auto') diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp index 88ccd26611..9682bec34e 100644 --- a/tests/auto/corelib/io/qdir/tst_qdir.cpp +++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #if defined(Q_OS_WIN) @@ -65,6 +66,7 @@ #ifdef Q_OS_WIN #define DRIVE "Q:" +extern Q_CORE_EXPORT int qt_ntfs_permission_lookup; #else #define DRIVE #endif @@ -114,6 +116,8 @@ private slots: void mkdirRmdir_data(); void mkdirRmdir(); void mkdirOnSymlink(); + void mkdirWithPermissions_data(); + void mkdirWithPermissions(); void makedirReturnCode(); @@ -451,6 +455,49 @@ void tst_QDir::mkdirOnSymlink() #endif } +void tst_QDir::mkdirWithPermissions_data() +{ + QTest::addColumn("permissions"); + + for (int u = 0; u < 8; ++u) { + for (int g = 0; g < 8; ++g) { + for (int o = 0; o < 8; ++o) { + auto permissions = QFileDevice::Permissions::fromInt((u << 12) | (g << 4) | o); + QTest::addRow("%04x", permissions.toInt()) << permissions; + } + } + } +} + +void tst_QDir::mkdirWithPermissions() +{ + QFETCH(QFile::Permissions, permissions); + +#ifdef Q_OS_WIN + QScopedValueRollback ntfsMode(qt_ntfs_permission_lookup); + ++qt_ntfs_permission_lookup; +#endif +#ifdef Q_OS_UNIX + auto restoreMask = qScopeGuard([oldMask = umask(0)] { umask(oldMask); }); +#endif + + const QFile::Permissions setPermissions = { + QFile::ReadOther, QFile::WriteOther, QFile::ExeOther, + QFile::ReadGroup, QFile::WriteGroup, QFile::ExeGroup, + QFile::ReadOwner, QFile::WriteOwner, QFile::ExeOwner + }; + + const QString path = u"tmpdir"_qs; + QDir dir; + auto deleteDirectory = qScopeGuard([&dir, &path] { dir.rmdir(path); }); + + QVERIFY(dir.mkdir(path, permissions)); + auto actualPermissions = QFileInfo(dir.filePath(path)).permissions(); + QCOMPARE(actualPermissions & setPermissions, permissions); + QVERIFY(dir.rmdir(path)); + deleteDirectory.dismiss(); +} + void tst_QDir::makedirReturnCode() { QString dirName = QString::fromLatin1("makedirReturnCode"); -- cgit v1.2.3