From e03e21c0b40d4d189026b5b1b73b9cb0d0cf0a06 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 17 Sep 2019 11:07:57 -0700 Subject: [PATCH] Add support for symlinks and correct file permissions in qt launcher --- launchers/qt/src/Unzipper.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/launchers/qt/src/Unzipper.cpp b/launchers/qt/src/Unzipper.cpp index a650a4540a..a8bd1d8616 100644 --- a/launchers/qt/src/Unzipper.cpp +++ b/launchers/qt/src/Unzipper.cpp @@ -4,6 +4,11 @@ #include #include +#ifdef Q_OS_MACOS +#include +#include +#endif + Unzipper::Unzipper(const QString& zipFilePath, const QDir& outputDirectory) : _zipFilePath(zipFilePath), _outputDirectory(outputDirectory) { } @@ -56,7 +61,27 @@ void Unzipper::run() { } continue; } - if (mz_zip_reader_extract_to_file(&zip_archive, i, fullFilename.toUtf8().data(), 0)) { + + constexpr uint16_t FILE_PERMISSIONS_MASK { 0777 }; + + uint16_t mod_attr = (file_stat.m_external_attr >> 16) & FILE_PERMISSIONS_MASK; + uint16_t filetype_attr = (file_stat.m_external_attr >> 16) & S_IFMT; + bool is_symlink = filetype_attr == S_IFLNK; + + if (is_symlink) { +#ifdef Q_OS_MACOS + size_t size; + auto data = mz_zip_reader_extract_to_heap(&zip_archive, i, &size, 0); + auto target = QString::fromUtf8((char*)data, size); + + qDebug() << "Extracted symlink: " << size << target; + + symlink(target.toUtf8().data(), fullFilename.toUtf8().data()); +#else + emit finished(true, "Error unzipping symlink"); + return; +#endif + } else if (mz_zip_reader_extract_to_file(&zip_archive, i, fullFilename.toUtf8().data(), 0)) { totalCompressedSize += (uint64_t)file_stat.m_comp_size; totalSize += (uint64_t)file_stat.m_uncomp_size; emit progress((float)totalCompressedSize / (float)zip_archive.m_archive_size); @@ -64,6 +89,9 @@ void Unzipper::run() { emit finished(true, "Unzipping error unzipping file: " + fullFilename); return; } +#ifdef Q_OS_MACOS + chmod(fullFilename.toUtf8().data(), mod_attr); +#endif } qDebug() << "Done unzipping archive, total size:" << totalSize;