diff --git a/UnionPatcher/OSUtil.cs b/UnionPatcher/OSUtil.cs new file mode 100644 index 0000000..b4eb0da --- /dev/null +++ b/UnionPatcher/OSUtil.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; + +namespace LBPUnion.UnionPatcher +{ + using RuntimeOSPlatform = System.Runtime.InteropServices.OSPlatform; + + public enum OSPlatform + { + NotSupported, + Windows, + OSX, + Linux, + } + public class OSUtil + { + private static IEnumerable + <(OSPlatform Platform, RuntimeOSPlatform RuntimePlatform)?> EnumeratePlatforms() + { + yield return (OSPlatform.Windows, RuntimeOSPlatform.Windows); + yield return (OSPlatform.OSX, RuntimeOSPlatform.OSX); + yield return (OSPlatform.Linux, RuntimeOSPlatform.Linux); + } + + public static OSPlatform GetPlatform() + { + return EnumeratePlatforms().FirstOrDefault(p + => RuntimeInformation.IsOSPlatform(p.Value.RuntimePlatform))?.Platform ?? default; + } + } +} + diff --git a/UnionPatcher/RemotePatch.cs b/UnionPatcher/RemotePatch.cs index d3951b8..942e97a 100644 --- a/UnionPatcher/RemotePatch.cs +++ b/UnionPatcher/RemotePatch.cs @@ -38,24 +38,38 @@ public class RemotePatch public static void LaunchSCETool(string args) { string platformExecutable = ""; + switch (OSUtil.GetPlatform()) + { + case OSPlatform.Windows: + platformExecutable = "scetool/win64/scetool.exe"; + break; + case OSPlatform.Linux: + if(RuntimeInformation.ProcessArchitecture == Architecture.X64) + { + platformExecutable = "scetool/linux64/scetool"; + } else if (RuntimeInformation.ProcessArchitecture == Architecture.Arm) + { + platformExecutable = "scetool/linuxarm/scetool"; + } else if (RuntimeInformation.ProcessArchitecture == Architecture.Arm64) + { + platformExecutable = "scetool/linuxarm64/scetool"; + } + break; + case OSPlatform.OSX: + if (RuntimeInformation.OSArchitecture == Architecture.Arm64) + { + platformExecutable = "scetool/macarm64/scetool"; // For Apple Silicon Macs + } + else + { + platformExecutable = "scetool/mac64/scetool"; + } + break; + default: + throw new Exception("Error starting SCETool. Your platform may not be supported yet."); - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - platformExecutable = "scetool/win64/scetool.exe"; - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - platformExecutable = "scetool/linux64/scetool"; - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - if (RuntimeInformation.OSArchitecture == Architecture.Arm64) - { - platformExecutable = "scetool/macarm64/scetool"; // For Apple Silicon Macs - } - else - { - platformExecutable = "scetool/mac64/scetool"; - } } - if (platformExecutable != "") - { + ProcessStartInfo startInfo = new(); startInfo.UseShellExecute = false; startInfo.FileName = Path.GetFullPath(platformExecutable); @@ -71,11 +85,7 @@ public class RemotePatch } Console.WriteLine("\n===== END SCETOOL =====\n\n"); - } - else - { - throw new Exception("Error starting SCETool. Your platform may not be supported yet."); - } + } public void RevertEBOOT(string ps3ip, string gameID, string serverURL, string user, string pass) @@ -228,4 +238,16 @@ public class RemotePatch FTP.UploadFile(@$"eboot/{gameID}/patched/EBOOT.BIN", $"ftp://{ps3ip}/dev_hdd0/game/{gameID}/USRDIR/EBOOT.BIN", user, pass); } + + public static OSPlatform GetPlatform() // this should be moved elsewhere later + { + OSPlatform platform = new OSPlatform(); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) platform = OSPlatform.Windows; + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) platform = OSPlatform.Linux; + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) platform = OSPlatform.OSX; + else if (RuntimeInformation.IsOSPlatform(OSPlatform.FreeBSD)) platform = OSPlatform.FreeBSD; + + return platform; + } } diff --git a/UnionPatcher/scetool/linuxarm64/scetool b/UnionPatcher/scetool/linuxarm64/scetool new file mode 100644 index 0000000..8eada82 Binary files /dev/null and b/UnionPatcher/scetool/linuxarm64/scetool differ