From 7bcd6a5ecdd4fe516048b0d5b2fd0f9e495349dc Mon Sep 17 00:00:00 2001 From: hogliux Date: Tue, 3 Apr 2018 12:01:30 +0100 Subject: [PATCH] Added support for uncompressing symbolic links in zip files --- modules/juce_core/zip/juce_ZipFile.cpp | 13 +++++++++++++ modules/juce_core/zip/juce_ZipFile.h | 3 +++ 2 files changed, 16 insertions(+) diff --git a/modules/juce_core/zip/juce_ZipFile.cpp b/modules/juce_core/zip/juce_ZipFile.cpp index dea2f2dff3..bbee928c49 100644 --- a/modules/juce_core/zip/juce_ZipFile.cpp +++ b/modules/juce_core/zip/juce_ZipFile.cpp @@ -46,6 +46,10 @@ struct ZipFile::ZipEntryHolder entry.uncompressedSize = (int64) readUnalignedLittleEndianInt (buffer + 24); streamOffset = (int64) readUnalignedLittleEndianInt (buffer + 42); + auto externalFileAttributes = (int32) readUnalignedLittleEndianInt (buffer + 38); + auto fileType = (externalFileAttributes >> 28) & 0xf; + + entry.isSymbolicLink = (fileType == 0xA); entry.filename = String::fromUTF8 (buffer + 46, fileNameLen); } @@ -430,6 +434,15 @@ Result ZipFile::uncompressEntry (int index, const File& targetDirectory, bool sh if (! targetFile.getParentDirectory().createDirectory()) return Result::fail ("Failed to create target folder: " + targetFile.getParentDirectory().getFullPathName()); + if (zei->entry.isSymbolicLink) + { + String relativePath (in->readEntireStreamAsString()); + auto originalFilePath = targetFile.getParentDirectory().getChildFile (relativePath); + + if (! originalFilePath.createSymbolicLink (targetFile, true)) + return Result::fail ("Failed to create symbolic link: " + targetFile.getFullPathName()); + } + else { FileOutputStream out (targetFile); diff --git a/modules/juce_core/zip/juce_ZipFile.h b/modules/juce_core/zip/juce_ZipFile.h index 0b4dcb8a88..ffb210ed3b 100644 --- a/modules/juce_core/zip/juce_ZipFile.h +++ b/modules/juce_core/zip/juce_ZipFile.h @@ -79,6 +79,9 @@ public: /** The last time the file was modified. */ Time fileTime; + + /** True if the zip entry is a symbolic link. */ + bool isSymbolicLink; }; //==============================================================================