From 2347533b9c4852f690ae50484163911047bdb756 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Wed, 6 May 2020 20:07:28 -0700 Subject: [PATCH] Bring ZLib in locally. (#132) --- .circleci/checksum.txt | 15 +- .circleci/config.yml | 44 ++-- .circleci/genchecksum.sh | 2 +- .gitignore | 3 + ModernUO.sln | 10 +- Projects/Argon2/Argon2.cs | 3 +- Projects/Argon2/Argon2.csproj | 11 +- Projects/Argon2/Utility.cs | 10 +- Projects/Scripts/Multis/HouseFoundation.cs | 5 +- Projects/Scripts/Scripts.csproj | 3 +- Projects/Server/MultiData.cs | 4 +- Projects/Server/Network/NetworkCompression.cs | 204 ----------------- Projects/Server/Network/Packets.cs | 3 +- Projects/Server/Server.csproj | 10 +- Projects/ZLib/Utility.cs | 13 ++ Projects/ZLib/ZLib.cs | 208 ++++++++++++++++++ Projects/ZLib/ZLib.csproj | 35 +++ .../ZLib/runtimes/linux-x64/native/libz.so | Bin 0 -> 101192 bytes .../ZLib/runtimes/osx-x64/native/libz.dylib | Bin 0 -> 105032 bytes .../runtimes/win-x64/native}/zlib.dll | Bin Tools/build-native-libraries.cmd | 4 + Tools/build-native-libraries.sh | 4 + 22 files changed, 331 insertions(+), 260 deletions(-) create mode 100644 Projects/ZLib/Utility.cs create mode 100644 Projects/ZLib/ZLib.cs create mode 100644 Projects/ZLib/ZLib.csproj create mode 100755 Projects/ZLib/runtimes/linux-x64/native/libz.so create mode 100755 Projects/ZLib/runtimes/osx-x64/native/libz.dylib rename Projects/{Server/Assemblies => ZLib/runtimes/win-x64/native}/zlib.dll (100%) create mode 100755 Tools/build-native-libraries.cmd create mode 100755 Tools/build-native-libraries.sh diff --git a/.circleci/checksum.txt b/.circleci/checksum.txt index 5d4b569c0..9b522fb67 100644 --- a/.circleci/checksum.txt +++ b/.circleci/checksum.txt @@ -1,13 +1,12 @@ -95482048463cdc99c77a69951654de7b28fd6880 ../Projects/Argon2/Argon2.csproj -ebafae4e8160057cbf408cb13114479ca26e1b58 ../Projects/Scripts.Tests/Scripts.Tests.csproj -6c6a48220658bdfa7b2e1e173077fd139ed4af2c ../Projects/Scripts/Scripts.csproj -6213c10f697b45729bab15f7870c42dcf49b026b ../Projects/Server.Tests/Server.Tests.csproj -4b3626e04f76dff1ab445e207658a3b386fce4e5 ../Projects/Server/Server.csproj -a663d309b6b86c7632ea5cd175468dd5180808c1 ../Projects/Argon2/Argon2.cs +6b0276b603e867108643104978963ddd2e599e58 ../Projects/Argon2/Argon2.csproj +214715e88298b66715dee7c06080fc083f2c9e26 ../Projects/Argon2/Argon2.cs 1e89625abe364f895346d0c5753f3ca6653cf7df ../Projects/Argon2/Argon2Context.cs abbb34d85f55ca1d78a400b4d46afbd6965f642b ../Projects/Argon2/Argon2Error.cs 00ef35a6809d4959bdda1de01f45e39ff388270f ../Projects/Argon2/Argon2Exception.cs -53164d1621e24adefc6917379d36d7273551f457 ../Projects/Argon2/Argon2PasswordHasher.cs +58979ca359777ae45a6233264f0741ba23203959 ../Projects/Argon2/Argon2PasswordHasher.cs a137d2fe0478d065d478366168f80ab9eaaa9c3a ../Projects/Argon2/Argon2Type.cs c09f7a2f9690d56ca838aafb28640c09950c5a8c ../Projects/Argon2/HashMetadata.cs -b5da07548eb41ec9bd35bc2def006f23698b357e ../Projects/Argon2/Utility.cs +c9fb8b37bd035c6597047d4279f9b6e6384db944 ../Projects/Argon2/Utility.cs +c9fb8b37bd035c6597047d4279f9b6e6384db944 ../Projects/ZLib/Utility.cs +a4c3595dada3e596ab3131886616d5c27107ec7f ../Projects/ZLib/ZLib.cs +d129d82f8607e97090088a6e1956706d886e8294 ../Projects/ZLib/ZLib.csproj diff --git a/.circleci/config.yml b/.circleci/config.yml index 7c8138fb3..ba1b5fc68 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,15 +21,15 @@ jobs: keys: - dotnet-packages-v1-{{ arch }}-{{ checksum ".circleci/checksum.txt" }} - run: - name: Build Argon2 - command: dotnet build -c Release -r linux-x64 Projects/Argon2/Argon2.csproj - - run: - name: Install ModernUO dependencies - command: dotnet restore + name: Build native libraries + command: /mnt/ramdisk/Tools/build-native-libraries.sh - save_cache: paths: - /mnt/ramdisk/packages key: dotnet-packages-v1-{{ arch }}-{{ checksum ".circleci/checksum.txt" }} + - run: + name: Install ModernUO dependencies + command: dotnet restore - run: name: Building ModernUO for Linux (Debug) command: dotnet build -c Debug -r linux-x64 @@ -42,15 +42,15 @@ jobs: keys: - dotnet-packages-v1-{{ arch }}-{{ checksum ".circleci/checksum.txt" }} - run: - name: Build Argon2 - command: dotnet build -c Debug -r win-x64 Projects/Argon2/Argon2.csproj + name: Build native libraries + command: Tools\build-native-libraries.cmd + - save_cache: + paths: + - packages + key: dotnet-packages-v1-{{ arch }}-{{ checksum ".circleci/checksum.txt" }} - run: name: Install ModernUO dependencies command: dotnet restore - - save_cache: - paths: - - /mnt/ramdisk/packages - key: dotnet-packages-v1-{{ arch }}-{{ checksum ".circleci/checksum.txt" }} - run: name: Building ModernUO for Windows (Debug) command: dotnet build -c Debug -r win-x64 @@ -64,15 +64,15 @@ jobs: keys: - dotnet-packages-v1-{{ arch }}-{{ checksum ".circleci/checksum.txt" }} - run: - name: Build Argon2 - command: dotnet build -c Debug -r linux-x64 Projects/Argon2/Argon2.csproj - - run: - name: Install ModernUO dependencies - command: dotnet restore + name: Build native libraries + command: /mnt/ramdisk/Tools/build-native-libraries.sh - save_cache: paths: - /mnt/ramdisk/packages key: dotnet-packages-v1-{{ arch }}-{{ checksum ".circleci/checksum.txt" }} + - run: + name: Install ModernUO dependencies + command: dotnet restore - run: name: Building with Analyzers command: dotnet build -c Analyze -r linux-x64 @@ -86,15 +86,15 @@ jobs: keys: - dotnet-packages-v1-{{ arch }}-{{ checksum ".circleci/checksum.txt" }} - run: - name: Build Argon2 - command: dotnet build -c Debug -r linux-x64 Projects/Argon2/Argon2.csproj - - run: - name: Install ModernUO dependencies - command: dotnet restore + name: Build native libraries + command: /mnt/ramdisk/Tools/build-native-libraries.sh - save_cache: paths: - /mnt/ramdisk/packages - key: dotnet-packages-linux-{{ checksum ".circleci/checksum.txt" }} + key: dotnet-packages-v1-{{ arch }}-{{ checksum ".circleci/checksum.txt" }} + - run: + name: Install ModernUO dependencies + command: dotnet restore - run: name: Running unit tests command: dotnet test -r linux-x64 diff --git a/.circleci/genchecksum.sh b/.circleci/genchecksum.sh index 1d30da007..c19eed6d5 100755 --- a/.circleci/genchecksum.sh +++ b/.circleci/genchecksum.sh @@ -1 +1 @@ -sha1sum ../Projects/*/*.csproj ../Projects/Argon2/*.cs > "checksum.txt" +sha1sum ../Projects/Argon2/*.csproj ../Projects/Argon2/*.cs ../Projects/ZLib/*.cs ../Projects/ZLib/*.csproj > "checksum.txt" diff --git a/.gitignore b/.gitignore index cce99125e..9d92a34e8 100644 --- a/.gitignore +++ b/.gitignore @@ -10,9 +10,12 @@ /Distribution/System.IO.Pipelines.dll /Distribution/libdrng.dll /Distribution/zlib.dll +/Distribution/libz.dylib +/Distribution/libz.so /Distribution/Microsoft.Bcl.AsyncInterfaces.dll /Distribution/System.ComponentModel.Annotations.dll /Distribution/System.Runtime.CompilerServices.Unsafe.dll +/Distribution/ZLib.Bindings.dll /Distribution/Data/modernuo.json /Distribution/runtimes /Distribution/nohup.out diff --git a/ModernUO.sln b/ModernUO.sln index e1d9f033b..2d214caef 100644 --- a/ModernUO.sln +++ b/ModernUO.sln @@ -1,4 +1,4 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 +Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29102.190 MinimumVisualStudioVersion = 10.0.40219.1 @@ -12,6 +12,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server.Tests", "Projects\Se EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Scripts.Tests", "Projects\Scripts.Tests\Scripts.Tests.csproj", "{3C4797F9-603E-44EF-8E8C-9275CC9EA74B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Zlib", "Projects\ZLib\ZLib.csproj", "{3B030CD2-DB29-4BC2-9C90-D90804B30757}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Analyze|x64 = Analyze|x64 @@ -49,6 +51,12 @@ Global {97150E9D-5561-4D3C-9B78-E795544507D0}.Debug|x64.Build.0 = Debug|x64 {97150E9D-5561-4D3C-9B78-E795544507D0}.Release|x64.ActiveCfg = Release|x64 {97150E9D-5561-4D3C-9B78-E795544507D0}.Release|x64.Build.0 = Release|x64 + {3B030CD2-DB29-4BC2-9C90-D90804B30757}.Analyze|x64.ActiveCfg = Debug|Any CPU + {3B030CD2-DB29-4BC2-9C90-D90804B30757}.Analyze|x64.Build.0 = Debug|Any CPU + {3B030CD2-DB29-4BC2-9C90-D90804B30757}.Debug|x64.ActiveCfg = Debug|Any CPU + {3B030CD2-DB29-4BC2-9C90-D90804B30757}.Debug|x64.Build.0 = Debug|Any CPU + {3B030CD2-DB29-4BC2-9C90-D90804B30757}.Release|x64.ActiveCfg = Release|Any CPU + {3B030CD2-DB29-4BC2-9C90-D90804B30757}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Projects/Argon2/Argon2.cs b/Projects/Argon2/Argon2.cs index 9be9b86be..e13789e04 100644 --- a/Projects/Argon2/Argon2.cs +++ b/Projects/Argon2/Argon2.cs @@ -1,4 +1,3 @@ -using System; using System.Runtime.InteropServices; using System.Text; @@ -25,7 +24,7 @@ namespace Server.Accounting.Security static Argon2() { - if (RuntimeUtility.Unix) + if (RuntimeUtility.IsUnix) Library = new UnixArgon2(); else Library = new WindowsArgon2(); diff --git a/Projects/Argon2/Argon2.csproj b/Projects/Argon2/Argon2.csproj index b76f1e543..6fb0b3db8 100644 --- a/Projects/Argon2/Argon2.csproj +++ b/Projects/Argon2/Argon2.csproj @@ -1,7 +1,7 @@  win-x64;linux-x64;osx-x64 - 1.0.0 + 1.1.0 Server Argon2.Bindings x64 @@ -9,10 +9,9 @@ netcoreapp3.1 true true - true + false false Debug;Release;Analyze - WINDOWS 1.0.0 x64 @@ -33,10 +32,4 @@ PreserveNewest - - - - diff --git a/Projects/Argon2/Utility.cs b/Projects/Argon2/Utility.cs index e000e30ed..b450eb6da 100644 --- a/Projects/Argon2/Utility.cs +++ b/Projects/Argon2/Utility.cs @@ -4,10 +4,10 @@ namespace Server { internal static class RuntimeUtility { - public static bool IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - public static bool IsDarwin = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); - public static bool IsFreeBSD = RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD); - public static bool IsLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || IsFreeBSD; - public static bool Unix = IsDarwin || IsFreeBSD || IsLinux; + internal static readonly bool IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + internal static readonly bool IsDarwin = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + internal static readonly bool IsFreeBSD = RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD); + internal static readonly bool IsLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || IsFreeBSD; + internal static readonly bool IsUnix = IsDarwin || IsFreeBSD || IsLinux; } } diff --git a/Projects/Scripts/Multis/HouseFoundation.cs b/Projects/Scripts/Multis/HouseFoundation.cs index 8e82b1740..c171362b0 100644 --- a/Projects/Scripts/Multis/HouseFoundation.cs +++ b/Projects/Scripts/Multis/HouseFoundation.cs @@ -10,6 +10,7 @@ using Server.Items; using Server.Mobiles; using Server.Network; using Server.Spells; +using Server.Compression; namespace Server.Multis { @@ -2324,7 +2325,7 @@ namespace Server.Multis byte[] inflatedBuffer = m_PlaneBuffers[i]; int deflatedLength = m_DeflatedBuffer.Length; - ZLibError ce = NetworkCompression.Pack(m_DeflatedBuffer, ref deflatedLength, inflatedBuffer, size, + ZLibError ce = ZLib.Pack(m_DeflatedBuffer, ref deflatedLength, inflatedBuffer, size, ZLibQuality.Default); if (ce != ZLibError.Okay) @@ -2360,7 +2361,7 @@ namespace Server.Multis byte[] inflatedBuffer = m_StairBuffers[i]; int deflatedLength = m_DeflatedBuffer.Length; - ZLibError ce = NetworkCompression.Pack(m_DeflatedBuffer, ref deflatedLength, inflatedBuffer, size, + ZLibError ce = ZLib.Pack(m_DeflatedBuffer, ref deflatedLength, inflatedBuffer, size, ZLibQuality.Default); if (ce != ZLibError.Okay) diff --git a/Projects/Scripts/Scripts.csproj b/Projects/Scripts/Scripts.csproj index a30ebe1c3..1e99d260f 100644 --- a/Projects/Scripts/Scripts.csproj +++ b/Projects/Scripts/Scripts.csproj @@ -66,7 +66,8 @@ - + + diff --git a/Projects/Server/MultiData.cs b/Projects/Server/MultiData.cs index b7112ffdc..e2c3b7186 100644 --- a/Projects/Server/MultiData.cs +++ b/Projects/Server/MultiData.cs @@ -22,7 +22,7 @@ using System; using System.Buffers; using System.Collections.Generic; using System.IO; -using Server.Network; +using Server.Compression; namespace Server { @@ -174,7 +174,7 @@ namespace Server if (compressionMethod == 1) { data = new byte[decompressedSize]; - NetworkCompression.Unpack(data, ref decompressedSize, sourceData, compressedSize); + ZLib.Unpack(data, ref decompressedSize, sourceData, compressedSize); } else { diff --git a/Projects/Server/Network/NetworkCompression.cs b/Projects/Server/Network/NetworkCompression.cs index 5dea0bc7f..ed178821d 100644 --- a/Projects/Server/Network/NetworkCompression.cs +++ b/Projects/Server/Network/NetworkCompression.cs @@ -19,8 +19,6 @@ ***************************************************************************/ using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; namespace Server.Network { @@ -45,9 +43,6 @@ namespace Server.Network // If our input exceeds this length, we cannot possibly compress it within the buffer private const int DefiniteOverflow = (BufferSize * 8 - TerminalCodeLength) / MinimalCodeLength; - // If our input exceeds this length, we may potentially overflow the buffer - private const int PossibleOverflow = (BufferSize * 8 - TerminalCodeLength) / MaximalCodeLength; - private static readonly int[] _huffmanTable = { 0x2, 0x000, 0x5, 0x01F, 0x6, 0x022, 0x7, 0x034, 0x7, 0x075, 0x6, 0x028, 0x6, 0x03B, 0x7, 0x032, @@ -85,16 +80,6 @@ namespace Server.Network 0x4, 0x00D }; - public static readonly ICompressor Compressor; - - static NetworkCompression() - { - if (Core.Unix) - Compressor = new UnixCompressor(); - else - Compressor = new Compressor(); - } - public static unsafe void Compress(ReadOnlySpan input, int offset, int count, Span output, out int length) { if (input == null) throw new ArgumentNullException(nameof(input)); @@ -181,194 +166,5 @@ namespace Server.Network } } } - - public static int MaxPackSize(int sourceLength) => (int)Compressor.CompressBound((ulong)sourceLength); - - public static unsafe ZLibError Pack(Span dest, ref int destLength, ReadOnlySpan source, int sourceLength) - { - var destLengthLong = (ulong)destLength; - fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) - { - var e = Compressor.Compress(Unsafe.AsRef(dPtr), ref destLengthLong, Unsafe.AsRef(sPtr), - (ulong)sourceLength); - destLength = (int)destLengthLong; - return e; - } - } - - public static unsafe ZLibError Pack(Span dest, ref int destLength, ReadOnlySpan source, ZLibQuality quality) - { - var destLengthLong = (ulong)destLength; - fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) - { - var e = Compressor.Compress(Unsafe.AsRef(dPtr), ref destLengthLong, Unsafe.AsRef(sPtr), - (ulong)source.Length, quality); - destLength = (int)destLengthLong; - return e; - } - } - - public static unsafe ZLibError Pack(Span dest, ref int destLength, ReadOnlySpan source, int sourceLength, - ZLibQuality quality) - { - var destLengthLong = (ulong)destLength; - fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) - { - var e = Compressor.Compress(Unsafe.AsRef(dPtr), ref destLengthLong, Unsafe.AsRef(sPtr), - (ulong)sourceLength, quality); - destLength = (int)destLengthLong; - return e; - } - } - - public static unsafe ZLibError Unpack(Span dest, ref int destLength, ReadOnlySpan source, int sourceLength) - { - var destLengthLong = (ulong)destLength; - fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) - { - var e = Compressor.Decompress(Unsafe.AsRef(dPtr), ref destLengthLong, Unsafe.AsRef(sPtr), - (ulong)sourceLength); - destLength = (int)destLengthLong; - return e; - } - } - - public static ulong MaxPackSize(ulong sourceLength) => Compressor.CompressBound(sourceLength); - - public static unsafe ZLibError Pack(Span dest, ref ulong destLength, ReadOnlySpan source, ulong sourceLength) - { - fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) - { - return Compressor.Compress(Unsafe.AsRef(dPtr), ref destLength, Unsafe.AsRef(sPtr), sourceLength); - } - } - - public static unsafe ZLibError Pack(Span dest, ref ulong destLength, ReadOnlySpan source, - ZLibQuality quality) - { - fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) - { - return Compressor.Compress(Unsafe.AsRef(dPtr), ref destLength, Unsafe.AsRef(sPtr), (ulong)source.Length, - quality); - } - } - - public static unsafe ZLibError Pack(Span dest, ref ulong destLength, ReadOnlySpan source, ulong sourceLength, - ZLibQuality quality) - { - fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) - { - return Compressor.Compress(Unsafe.AsRef(dPtr), ref destLength, Unsafe.AsRef(sPtr), sourceLength, quality); - } - } - - public static unsafe ZLibError Unpack(Span dest, ref ulong destLength, ReadOnlySpan source, - ulong sourceLength) - { - fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) - { - return Compressor.Decompress(Unsafe.AsRef(dPtr), ref destLength, Unsafe.AsRef(sPtr), sourceLength); - } - } - } - - public interface ICompressor - { - string Version { get; } - ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength); - ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength, ZLibQuality quality); - ZLibError Decompress(in int dest, ref ulong destLength, in int source, ulong sourceLength); - ulong CompressBound(ulong sourceLength); - } - - public class Compressor : ICompressor - { - public string Version => SafeNativeMethods.zlibVersion(); - - public ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength) => - SafeNativeMethods.compress(dest, ref destLength, source, sourceLength); - - public ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength, - ZLibQuality quality) => SafeNativeMethods.compress2(dest, ref destLength, source, sourceLength, quality); - - public ZLibError Decompress(in int dest, ref ulong destLength, in int source, ulong sourceLength) => - SafeNativeMethods.uncompress(dest, ref destLength, source, sourceLength); - - public ulong CompressBound(ulong sourceLength) => SafeNativeMethods.compressBound(sourceLength); - - private static class SafeNativeMethods - { - [DllImport("zlib", CharSet = CharSet.Unicode)] - internal static extern string zlibVersion(); - - [DllImport("zlib")] - internal static extern ZLibError compress(in int dest, ref ulong destLength, in int source, ulong sourceLength); - - [DllImport("zlib")] - internal static extern ZLibError compress2(in int dest, ref ulong destLength, in int source, ulong sourceLength, - ZLibQuality quality); - - [DllImport("zlib")] - internal static extern ZLibError uncompress(in int dest, ref ulong destLength, in int source, ulong sourceLength); - - [DllImport("zlib")] - internal static extern ulong compressBound(ulong sourceLen); - } - } - - public class UnixCompressor : ICompressor - { - public string Version => SafeNativeMethods.zlibVersion(); - - public ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength) => - SafeNativeMethods.compress(dest, ref destLength, source, sourceLength); - - public ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength, - ZLibQuality quality) => SafeNativeMethods.compress2(dest, ref destLength, source, sourceLength, quality); - - public ZLibError Decompress(in int dest, ref ulong destLength, in int source, ulong sourceLength) => - SafeNativeMethods.uncompress(dest, ref destLength, source, sourceLength); - - public ulong CompressBound(ulong sourceLength) => SafeNativeMethods.compressBound(sourceLength); - - internal static class SafeNativeMethods - { - [DllImport("libz", CharSet = CharSet.Unicode)] - internal static extern string zlibVersion(); - - [DllImport("libz")] - internal static extern ZLibError compress(in int dest, ref ulong destLength, in int source, ulong sourceLength); - - [DllImport("libz")] - internal static extern ZLibError compress2(in int dest, ref ulong destLength, in int source, ulong sourceLength, - ZLibQuality quality); - - [DllImport("libz")] - internal static extern ZLibError uncompress(in int dest, ref ulong destLength, in int source, ulong sourceLength); - - [DllImport("libz")] - internal static extern ulong compressBound(ulong sourceLen); - } - } - - public enum ZLibError - { - VersionError = -6, - BufferError = -5, - MemoryError = -4, - DataError = -3, - StreamError = -2, - FileError = -1, - Okay = 0, - StreamEnd = 1, - NeedDictionary = 2 - } - - public enum ZLibQuality - { - Default = -1, - None = 0, - Speed = 1, - Size = 9 } } diff --git a/Projects/Server/Network/Packets.cs b/Projects/Server/Network/Packets.cs index f9e273ae7..d62cb17ee 100644 --- a/Projects/Server/Network/Packets.cs +++ b/Projects/Server/Network/Packets.cs @@ -26,6 +26,7 @@ using System.Net; using System.Text; using System.Threading; using Server.Accounting; +using Server.Compression; using Server.ContextMenus; using Server.Gumps; using Server.HuePickers; @@ -2119,7 +2120,7 @@ namespace Server.Network var packLength = wantLength; - NetworkCompression.Pack(packBuffer, ref packLength, buffer, length, ZLibQuality.Default); + ZLib.Pack(packBuffer, ref packLength, buffer, length, ZLibQuality.Default); Stream.Write(4 + packLength); Stream.Write(length); diff --git a/Projects/Server/Server.csproj b/Projects/Server/Server.csproj index a629ba630..bf6baba94 100644 --- a/Projects/Server/Server.csproj +++ b/Projects/Server/Server.csproj @@ -29,6 +29,11 @@ + + + + + @@ -67,16 +72,17 @@ libdrng.dll Always - + + diff --git a/Projects/ZLib/Utility.cs b/Projects/ZLib/Utility.cs new file mode 100644 index 000000000..b450eb6da --- /dev/null +++ b/Projects/ZLib/Utility.cs @@ -0,0 +1,13 @@ +using System.Runtime.InteropServices; + +namespace Server +{ + internal static class RuntimeUtility + { + internal static readonly bool IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + internal static readonly bool IsDarwin = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + internal static readonly bool IsFreeBSD = RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD); + internal static readonly bool IsLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || IsFreeBSD; + internal static readonly bool IsUnix = IsDarwin || IsFreeBSD || IsLinux; + } +} diff --git a/Projects/ZLib/ZLib.cs b/Projects/ZLib/ZLib.cs new file mode 100644 index 000000000..b8520d8ea --- /dev/null +++ b/Projects/ZLib/ZLib.cs @@ -0,0 +1,208 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Server.Compression +{ + public static class ZLib + { + public static readonly ICompressor Compressor; + + static ZLib() + { + if (RuntimeUtility.IsUnix) + Compressor = new UnixCompressor(); + else + Compressor = new Compressor(); + } + + public static int MaxPackSize(int sourceLength) => (int)Compressor.CompressBound((ulong)sourceLength); + + public static unsafe ZLibError Pack(Span dest, ref int destLength, ReadOnlySpan source, int sourceLength) + { + var destLengthLong = (ulong)destLength; + fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) + { + var e = Compressor.Compress(Unsafe.AsRef(dPtr), ref destLengthLong, Unsafe.AsRef(sPtr), + (ulong)sourceLength); + destLength = (int)destLengthLong; + return e; + } + } + + public static unsafe ZLibError Pack(Span dest, ref int destLength, ReadOnlySpan source, ZLibQuality quality) + { + var destLengthLong = (ulong)destLength; + fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) + { + var e = Compressor.Compress(Unsafe.AsRef(dPtr), ref destLengthLong, Unsafe.AsRef(sPtr), + (ulong)source.Length, quality); + destLength = (int)destLengthLong; + return e; + } + } + + public static unsafe ZLibError Pack(Span dest, ref int destLength, ReadOnlySpan source, int sourceLength, + ZLibQuality quality) + { + var destLengthLong = (ulong)destLength; + fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) + { + var e = Compressor.Compress(Unsafe.AsRef(dPtr), ref destLengthLong, Unsafe.AsRef(sPtr), + (ulong)sourceLength, quality); + destLength = (int)destLengthLong; + return e; + } + } + + public static unsafe ZLibError Unpack(Span dest, ref int destLength, ReadOnlySpan source, int sourceLength) + { + var destLengthLong = (ulong)destLength; + fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) + { + var e = Compressor.Decompress(Unsafe.AsRef(dPtr), ref destLengthLong, Unsafe.AsRef(sPtr), + (ulong)sourceLength); + destLength = (int)destLengthLong; + return e; + } + } + + public static ulong MaxPackSize(ulong sourceLength) => Compressor.CompressBound(sourceLength); + + public static unsafe ZLibError Pack(Span dest, ref ulong destLength, ReadOnlySpan source, ulong sourceLength) + { + fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) + { + return Compressor.Compress(Unsafe.AsRef(dPtr), ref destLength, Unsafe.AsRef(sPtr), sourceLength); + } + } + + public static unsafe ZLibError Pack(Span dest, ref ulong destLength, ReadOnlySpan source, + ZLibQuality quality) + { + fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) + { + return Compressor.Compress(Unsafe.AsRef(dPtr), ref destLength, Unsafe.AsRef(sPtr), (ulong)source.Length, + quality); + } + } + + public static unsafe ZLibError Pack(Span dest, ref ulong destLength, ReadOnlySpan source, ulong sourceLength, + ZLibQuality quality) + { + fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) + { + return Compressor.Compress(Unsafe.AsRef(dPtr), ref destLength, Unsafe.AsRef(sPtr), sourceLength, quality); + } + } + + public static unsafe ZLibError Unpack(Span dest, ref ulong destLength, ReadOnlySpan source, + ulong sourceLength) + { + fixed (byte* dPtr = &MemoryMarshal.GetReference(dest), sPtr = &MemoryMarshal.GetReference(source)) + { + return Compressor.Decompress(Unsafe.AsRef(dPtr), ref destLength, Unsafe.AsRef(sPtr), sourceLength); + } + } + } + + public interface ICompressor + { + string Version { get; } + ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength); + ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength, ZLibQuality quality); + ZLibError Decompress(in int dest, ref ulong destLength, in int source, ulong sourceLength); + ulong CompressBound(ulong sourceLength); + } + + public class Compressor : ICompressor + { + public string Version => SafeNativeMethods.zlibVersion(); + + public ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength) => + SafeNativeMethods.compress(dest, ref destLength, source, sourceLength); + + public ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength, + ZLibQuality quality) => SafeNativeMethods.compress2(dest, ref destLength, source, sourceLength, quality); + + public ZLibError Decompress(in int dest, ref ulong destLength, in int source, ulong sourceLength) => + SafeNativeMethods.uncompress(dest, ref destLength, source, sourceLength); + + public ulong CompressBound(ulong sourceLength) => SafeNativeMethods.compressBound(sourceLength); + + private static class SafeNativeMethods + { + [DllImport("zlib", CharSet = CharSet.Unicode)] + internal static extern string zlibVersion(); + + [DllImport("zlib")] + internal static extern ZLibError compress(in int dest, ref ulong destLength, in int source, ulong sourceLength); + + [DllImport("zlib")] + internal static extern ZLibError compress2(in int dest, ref ulong destLength, in int source, ulong sourceLength, + ZLibQuality quality); + + [DllImport("zlib")] + internal static extern ZLibError uncompress(in int dest, ref ulong destLength, in int source, ulong sourceLength); + + [DllImport("zlib")] + internal static extern ulong compressBound(ulong sourceLen); + } + } + + public class UnixCompressor : ICompressor + { + public string Version => SafeNativeMethods.zlibVersion(); + + public ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength) => + SafeNativeMethods.compress(dest, ref destLength, source, sourceLength); + + public ZLibError Compress(in int dest, ref ulong destLength, in int source, ulong sourceLength, + ZLibQuality quality) => SafeNativeMethods.compress2(dest, ref destLength, source, sourceLength, quality); + + public ZLibError Decompress(in int dest, ref ulong destLength, in int source, ulong sourceLength) => + SafeNativeMethods.uncompress(dest, ref destLength, source, sourceLength); + + public ulong CompressBound(ulong sourceLength) => SafeNativeMethods.compressBound(sourceLength); + + internal static class SafeNativeMethods + { + [DllImport("libz", CharSet = CharSet.Unicode)] + internal static extern string zlibVersion(); + + [DllImport("libz")] + internal static extern ZLibError compress(in int dest, ref ulong destLength, in int source, ulong sourceLength); + + [DllImport("libz")] + internal static extern ZLibError compress2(in int dest, ref ulong destLength, in int source, ulong sourceLength, + ZLibQuality quality); + + [DllImport("libz")] + internal static extern ZLibError uncompress(in int dest, ref ulong destLength, in int source, ulong sourceLength); + + [DllImport("libz")] + internal static extern ulong compressBound(ulong sourceLen); + } + } + + public enum ZLibError + { + VersionError = -6, + BufferError = -5, + MemoryError = -4, + DataError = -3, + StreamError = -2, + FileError = -1, + Okay = 0, + StreamEnd = 1, + NeedDictionary = 2 + } + + public enum ZLibQuality + { + Default = -1, + None = 0, + Speed = 1, + Size = 9 + } +} diff --git a/Projects/ZLib/ZLib.csproj b/Projects/ZLib/ZLib.csproj new file mode 100644 index 000000000..179b5261c --- /dev/null +++ b/Projects/ZLib/ZLib.csproj @@ -0,0 +1,35 @@ + + + win-x64;linux-x64;osx-x64 + 1.0.0 + Server + ZLib.Bindings + x64 + 8.0 + netcoreapp3.1 + true + true + false + false + Debug;Release;Analyze + 1.0.0 + x64 + + + + true + runtimes/win-x64/native + PreserveNewest + + + true + runtimes/osx-x64/native + PreserveNewest + + + true + runtimes/linux-x64/native + PreserveNewest + + + diff --git a/Projects/ZLib/runtimes/linux-x64/native/libz.so b/Projects/ZLib/runtimes/linux-x64/native/libz.so new file mode 100755 index 0000000000000000000000000000000000000000..52e459724e16ca33edb595bec4a9457b321fdf4e GIT binary patch literal 101192 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 AVgLXD literal 0 HcmV?d00001 diff --git a/Projects/ZLib/runtimes/osx-x64/native/libz.dylib b/Projects/ZLib/runtimes/osx-x64/native/libz.dylib new file mode 100755 index 0000000000000000000000000000000000000000..385ea372ac78b25a2237861aac85cb26649a79c3 GIT binary patch literal 105032 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 CxFSse literal 0 HcmV?d00001 diff --git a/Projects/Server/Assemblies/zlib.dll b/Projects/ZLib/runtimes/win-x64/native/zlib.dll similarity index 100% rename from Projects/Server/Assemblies/zlib.dll rename to Projects/ZLib/runtimes/win-x64/native/zlib.dll diff --git a/Tools/build-native-libraries.cmd b/Tools/build-native-libraries.cmd new file mode 100755 index 000000000..aa6b6a79a --- /dev/null +++ b/Tools/build-native-libraries.cmd @@ -0,0 +1,4 @@ +dotnet build -c Release Projects/Argon2/Argon2.csproj +dotnet pack -o ./packages Projects/Argon2/Argon2.csproj +dotnet build -c Release Projects/ZLib/ZLib.csproj +dotnet pack -o ./packages Projects/ZLib/ZLib.csproj diff --git a/Tools/build-native-libraries.sh b/Tools/build-native-libraries.sh new file mode 100755 index 000000000..e5e7c9be7 --- /dev/null +++ b/Tools/build-native-libraries.sh @@ -0,0 +1,4 @@ +dotnet build -c Release Projects/Argon2/Argon2.csproj +dotnet pack -o ./packages Projects/Argon2/Argon2.csproj +dotnet build -c Release Projects/ZLib/ZLib.csproj +dotnet pack -o ./packages Projects/ZLib/ZLib.csproj