From fe5c65f4cf1030293c8955eae49f69aca4fbda36 Mon Sep 17 00:00:00 2001 From: Carsten Igel <1760987+carstencodes@users.noreply.github.com> Date: Wed, 13 Dec 2023 00:02:02 +0100 Subject: [PATCH] chore: Corrected file mode calculation --- src/Bundler.IO/ArStreamWriter.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Bundler.IO/ArStreamWriter.cs b/src/Bundler.IO/ArStreamWriter.cs index 0f2fc38..9754bbd 100644 --- a/src/Bundler.IO/ArStreamWriter.cs +++ b/src/Bundler.IO/ArStreamWriter.cs @@ -89,14 +89,23 @@ public class ArStreamWriter(Stream stream) : BinaryWriter(stream) private async Task WriteFilePermissionsAsync(UnixFileMode fileMode, CancellationToken cancellationToken) { + const UnixFileMode allUserFields = UnixFileMode.UserExecute | UnixFileMode.UserRead | UnixFileMode.UserWrite; + const UnixFileMode allGroupFields = UnixFileMode.GroupExecute | UnixFileMode.GroupRead | UnixFileMode.GroupWrite; + const UnixFileMode allOtherFields = UnixFileMode.OtherExecute | UnixFileMode.OtherRead | UnixFileMode.OtherWrite; + + const byte byteShiftUserField = 8; // Min Value = 64, Max Value = 256 + const byte byteShiftGroupField = 4; // Min Value = 8, Max Value = 32 + const byte byteShiftOtherField = 0; // Min Value = 1, Max Value = 4 + // 8 byte file mode Memory<byte> bytes = new(); bytes.Span[0] = 1; // regular file bytes.Span[1] = 0; bytes.Span[2] = 0; - bytes.Span[3] = 0; // User - bytes.Span[4] = 0; // Group - bytes.Span[5] = 0; // Other + + bytes.Span[3] = Convert.ToByte((byte)(fileMode & allUserFields) >> byteShiftUserField); // User + bytes.Span[4] = Convert.ToByte((byte)(fileMode & allGroupFields) >> byteShiftGroupField); // Group + bytes.Span[5] = Convert.ToByte((byte)(fileMode & allOtherFields) >> byteShiftOtherField); // Other bytes.Span[5] = PAD; // PAD bytes.Span[5] = PAD; // PAD -- GitLab