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; }; //==============================================================================