diff --git a/src/main/java/org/dostalgia/ExecutableDetector.java b/src/main/java/org/dostalgia/ExecutableDetector.java index f8f2fee..b6cf0b5 100644 --- a/src/main/java/org/dostalgia/ExecutableDetector.java +++ b/src/main/java/org/dostalgia/ExecutableDetector.java @@ -82,9 +82,9 @@ public class ExecutableDetector { } public String findSetup(Path dir) throws IOException { - record Candidate(int depth, long size, String path) {} + record Candidate(int depth, boolean isWindows, long size, String path) {} List candidates = new ArrayList<>(); - List patterns = List.of("setup", "install", "config", "custom"); + List patterns = List.of("setup", "setmain", "install", "config", "custom"); Files.walkFileTree(dir, new SimpleFileVisitor<>() { @Override @@ -95,8 +95,9 @@ public class ExecutableDetector { return FileVisitResult.CONTINUE; for (String pat : patterns) { if (stem.equals(pat) || stem.startsWith(pat + ".") || stem.startsWith(pat + "-")) { + boolean isWin = "windows".equals(platform.detect(f)); candidates.add(new Candidate( - f.getNameCount() - dir.getNameCount(), a.size(), f.toString())); + f.getNameCount() - dir.getNameCount(), isWin, a.size(), f.toString())); break; } } @@ -105,7 +106,10 @@ public class ExecutableDetector { }); if (candidates.isEmpty()) return null; - candidates.sort(Comparator.comparingInt(Candidate::depth).thenComparingLong(Candidate::size)); + candidates.sort(Comparator + .comparingInt(c -> c.isWindows() ? 1 : 0) // prefer DOS over Windows + .thenComparingInt(Candidate::depth) + .thenComparingLong(Candidate::size)); return candidates.getFirst().path(); } diff --git a/src/main/java/org/dostalgia/PlatformDetector.java b/src/main/java/org/dostalgia/PlatformDetector.java index 9bf69be..4366dc6 100644 --- a/src/main/java/org/dostalgia/PlatformDetector.java +++ b/src/main/java/org/dostalgia/PlatformDetector.java @@ -30,7 +30,7 @@ public class PlatformDetector { /** Read enough PE header bytes from any InputStream (shared by Path and ZIP callers). */ static byte[] readHeaderBytes(InputStream is) throws IOException { - byte[] buf = new byte[0x200]; + byte[] buf = new byte[0x1000]; int read = is.readNBytes(buf, 0, buf.length); return read < buf.length ? java.util.Arrays.copyOf(buf, read) : buf; }