11package com .checkmarx .ast .wrapper ;
22
3+ import lombok .NonNull ;
34import org .slf4j .Logger ;
45
56import java .io .*;
@@ -23,11 +24,12 @@ private Execution() {
2324
2425 }
2526
26- private static final String OS_NAME = System .getProperty ("os.name" ).toLowerCase (Locale .ENGLISH );
2727 private static final String OS_LINUX = "linux" ;
2828 private static final String OS_WINDOWS = "windows" ;
29- private static final List <String > OS_MAC = Arrays .asList ("mac os x" , "darwin" , "osx" );
29+ private static final String OS_MAC = "mac" ;
30+ private static final List <String > OS_MAC_NAMES = Arrays .asList ("mac os x" , "darwin" , "osx" );
3031 private static final String FILE_NAME_LINUX = "cx-linux" ;
32+ private static final String FILE_NAME_LINUX_ARM = "cx-linux-arm" ;
3133 private static final String FILE_NAME_MAC = "cx-mac" ;
3234 private static final String FILE_NAME_WINDOWS = "cx.exe" ;
3335 private static final String LINE_SEPARATOR = System .getProperty ("line.separator" );
@@ -107,9 +109,9 @@ static String executeCommand(List<String> arguments,
107109 StandardCharsets .UTF_8 );
108110 }
109111
110- static String getTempBinary () throws IOException {
112+ static String getTempBinary (@ NonNull Logger logger ) throws IOException {
111113 if (executable == null ) {
112- String fileName = detectBinaryName ();
114+ String fileName = detectBinaryName (logger );
113115 if (fileName == null ) {
114116 throw new IOException ("Unsupported architecture" );
115117 }
@@ -142,24 +144,41 @@ private static Process buildProcess(List<String> commands) throws IOException {
142144 return lmBuilder .start ();
143145 }
144146
145- private static String detectBinaryName () {
146- String arch = OS_NAME ;
147+ private static String detectBinaryName (@ NonNull Logger logger ) {
148+ String osName = System .getProperty ("os.name" ).toLowerCase (Locale .ENGLISH );
149+ String osArch = System .getProperty ("os.arch" ).toLowerCase (Locale .ENGLISH );
147150 String fileName = null ;
148- if (arch .contains (OS_LINUX )) {
149- fileName = FILE_NAME_LINUX ;
150- } else if (arch .contains (OS_WINDOWS )) {
151- fileName = FILE_NAME_WINDOWS ;
152- } else {
153- for (String macStr : OS_MAC ) {
154- if (arch .contains (macStr )) {
155- fileName = FILE_NAME_MAC ;
156- break ;
157- }
158- }
151+
152+ switch (getOperatingSystemType (osName )) {
153+ case OS_LINUX :
154+ fileName = osArch .contains ("arm" ) || osArch .contains ("aarch64" ) ? FILE_NAME_LINUX_ARM : FILE_NAME_LINUX ;
155+ break ;
156+ case OS_WINDOWS :
157+ fileName = FILE_NAME_WINDOWS ;
158+ break ;
159+ case OS_MAC :
160+ fileName = FILE_NAME_MAC ;
161+ break ;
162+ default :
163+ // Handle unknown OS
164+ logger .error ("Unsupported operating system: {} Architecture: {}" , osName , osArch );
165+ break ;
159166 }
160167 return fileName ;
161168 }
162169
170+ private static String getOperatingSystemType (String osName ) {
171+ if (osName .contains (OS_LINUX )) {
172+ return OS_LINUX ;
173+ } else if (osName .contains (OS_WINDOWS )) {
174+ return OS_WINDOWS ;
175+ } else if (OS_MAC_NAMES .stream ().anyMatch (osName ::contains )) {
176+ return OS_MAC ;
177+ } else {
178+ return "UNKNOWN" ; // Handle unknown OS
179+ }
180+ }
181+
163182 private static void copyURLToFile (URL source , File destination ) throws IOException {
164183 final byte [] buf = new byte [8192 ];
165184 try (InputStream reader = source .openStream ();
0 commit comments