diff --git a/README.md b/README.md index beefbe1d01..c3e3bb4289 100644 --- a/README.md +++ b/README.md @@ -59,10 +59,11 @@ you can also mount all formats using fuse. ### system properties * `org.jnode.file.encoding` ... filename encoding for `Charset#forName(String)`, default is `MS932` -* `org.jnode.fs.pc98.validator.fat` ... , validator for finding fat literal default is `false` -* `org.jnode.fs.pc98.validator.ipl` ... , validator for finding ipl literal default is `true` -* `org.jnode.fs.pc98.validator.nec` ... , validator for finding nec literal, default is `true` -* `org.jnode.fs.pc98.PC98BootSector.validation` ... `true`: do default validation, `false`: no validation, *else*: validation function name `class#method`, the method must return `boolean` +* `vavix.io.partition.validator.fat` ... , validator for finding fat literal default is `false` +* `vavix.io.partition.validator.ipl` ... , validator for finding ipl literal default is `true` +* `vavix.io.partition.validator.nec` ... , validator for finding nec literal, default is `true` +* `vavix.io.fat.PC98BiosParameterBlock.validation` ... `true`: do default validation, `false`: no validation, *else*: validation function name `class#method`, the method must return `boolean` +* `org.jnode.fs.jfat.ATBootSector.validation` ... `true`: do default validation, `false`: no validation, *else*: validation function name `class#method`, the method must return `boolean` ### for emulator user diff --git a/core/pom.xml b/core/pom.xml index c137a47c1c..b28d221374 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -4,7 +4,7 @@ vavi vavi-nio-file-jnode - 0.2.14 + 0.2.15 jnode-core diff --git a/fs/pom.xml b/fs/pom.xml index 0db8ee1753..6f9a4408de 100644 --- a/fs/pom.xml +++ b/fs/pom.xml @@ -5,7 +5,7 @@ vavi vavi-nio-file-jnode - 0.2.14 + 0.2.15 jnode-fs @@ -46,13 +46,13 @@ vavi jnode-core - 0.2.14 + 0.2.15 vavi jnode-net - 0.2.14 + 0.2.15 @@ -63,7 +63,7 @@ vavi vavi-nio-file-emu - 2.0.6 + 2.0.8 com.github.umjammer diff --git a/fs/src/main/java/org/jnode/fs/jfat/ATBootSector.java b/fs/src/main/java/org/jnode/fs/jfat/ATBootSector.java index 6fed1d8a5c..ea7798e2dc 100644 --- a/fs/src/main/java/org/jnode/fs/jfat/ATBootSector.java +++ b/fs/src/main/java/org/jnode/fs/jfat/ATBootSector.java @@ -34,6 +34,10 @@ /** + *

+ * system property + *

  • {@code org.jnode.fs.jfat.ATBootSector.validation} ... {@code class#method}, {@code true}, {@code false}, default {@code false}
  • + *

    * @author gvt * @author Tango */ diff --git a/fs/src/main/java/org/jnode/fs/pc98/PC98BootSector.java b/fs/src/main/java/org/jnode/fs/pc98/PC98BootSector.java index 87f7ad6c22..d13f17e8b5 100644 --- a/fs/src/main/java/org/jnode/fs/pc98/PC98BootSector.java +++ b/fs/src/main/java/org/jnode/fs/pc98/PC98BootSector.java @@ -10,11 +10,9 @@ import java.io.IOException; import java.lang.System.Logger; import java.lang.System.Logger.Level; -import java.lang.reflect.Method; import java.nio.ByteBuffer; import org.jnode.driver.block.BlockDeviceAPI; -import org.jnode.fs.FileSystemException; import org.jnode.fs.jfat.BootSector; import vavi.util.serdes.Serdes; import vavix.io.fat.PC98BiosParameterBlock; @@ -24,7 +22,10 @@ /** * PC98BootSector. - * + *

    + * system property + *

  • {@link PC98BiosParameterBlock#VALIDATION_KEY} ... default {@code true}
  • + *

    * @author Naohide Sano (umjammer) * @version 0.00 2022/02/08 umjammer initial version
    */ @@ -43,46 +44,11 @@ public PC98BootSector() { @Override public boolean isaValidBootSector() { logger.log(Level.DEBUG, "bpb.fileSystem: " + bpb.fileSystem); - boolean r = validate(bpb); + boolean r = bpb.validate(); if (!r) { logger.log(Level.DEBUG, "validation failed: " + bpb); } return r; } - /** - * true: do default validation, - * false: no validation, - * else: validation function name "class#method", the method must return boolean and - * w/ an argument PC98BiosParameterBlock and static. - */ - public static final String VALIDATION_KEY = "org.jnode.fs.pc98.PC98BootSector.validation"; - - /** @see #VALIDATION_KEY */ - private static boolean validate(PC98BiosParameterBlock bpb) { - String validation = System.getProperty(VALIDATION_KEY, "true"); - if (Boolean.parseBoolean(validation)) { - logger.log(Level.DEBUG, "default validation"); - return bpb.fileSystem.contains("FAT"); - } else if (validation.equalsIgnoreCase("false")) { - logger.log(Level.DEBUG, "no validation, accepting anyway"); - return true; - } else { - try { - String[] parts = validation.split("#"); - Class clazz = Class.forName(parts[0]); - Method method = clazz.getDeclaredMethod(parts[1], PC98BiosParameterBlock.class); - if (method.getReturnType() != Boolean.TYPE) { - throw new IllegalArgumentException("method %s return type is not boolean but %s".formatted(method.getName(), method.getReturnType().getName())); - } - boolean r = method.invoke(null, bpb).equals(Boolean.TRUE); - logger.log(Level.DEBUG, "do user bpb validation %s#%s: %s".formatted(clazz.getSimpleName(), method.getName(), r)); - return r; - } catch (Exception e) { - logger.log(Level.WARNING, "validation function error, accepting anyway", e); - return true; - } - } - } - @Override public void read(BlockDeviceAPI device) throws IOException { byte[] sector = new byte[1024]; diff --git a/fs/src/main/java/org/jnode/fs/pc98/PC98FileSystemType.java b/fs/src/main/java/org/jnode/fs/pc98/PC98FileSystemType.java index 7416ab508a..28f245ac82 100644 --- a/fs/src/main/java/org/jnode/fs/pc98/PC98FileSystemType.java +++ b/fs/src/main/java/org/jnode/fs/pc98/PC98FileSystemType.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.ServiceLoader; import java.util.ServiceLoader.Provider; -import java.util.StringJoiner; import org.jnode.driver.Device; import org.jnode.driver.block.FSBlockDeviceAPI; @@ -23,6 +22,7 @@ import org.jnode.fs.jfat.FatFileSystem; import org.jnode.partitions.PartitionTableEntry; import vavi.util.StringUtil; +import vavix.io.partition.Validator; import static java.lang.System.getLogger; @@ -35,9 +35,9 @@ *

    * system property *

  • {@code "org.jnode.file.encoding"} ... filename encoding for {@link Charset#forName(String)}, default is {@code "MS932"}
  • - *
  • {@code "org.jnode.fs.pc98.validator.fat"} ... , validator for finding fat literal default is {@code false}
  • - *
  • {@code "org.jnode.fs.pc98.validator.ipl"} ... , validator for finding ipl literal default is {@code true}
  • - *
  • {@code "org.jnode.fs.pc98.validator.nec"} ... , validator for finding nec literal, default is {@code true}
  • + *
  • {@code "vavix.io.partition.validator.fat"} ... , validator for finding fat literal default is {@code false}
  • + *
  • {@code "vavix.io.partition.validator.ipl"} ... , validator for finding ipl literal default is {@code true}
  • + *
  • {@code "vavix.io.partition.validator.nec"} ... , validator for finding nec literal, default is {@code true}
  • *

    * * @author Naohide Sano (umjammer) @@ -47,21 +47,6 @@ public class PC98FileSystemType implements BlockDeviceFileSystemType validators; diff --git a/fs/src/main/java/org/jnode/fs/pc98/validator/FatValidator.java b/fs/src/main/java/org/jnode/fs/pc98/validator/FatValidator.java deleted file mode 100644 index ffe0f4b441..0000000000 --- a/fs/src/main/java/org/jnode/fs/pc98/validator/FatValidator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2025 by Naohide Sano, All rights reserved. - * - * Programmed by Naohide Sano - */ - -package org.jnode.fs.pc98.validator; - -import java.lang.System.Logger.Level; -import java.nio.charset.StandardCharsets; - -import org.jnode.fs.pc98.PC98FileSystemType.Validator; - - -/** - * FatValidator. - * - * TODO fat12 doesn't work - * - * @author Naohide Sano (nsano) - * @version 0.00 2025-11-30 nsano initial version
    - */ -public class FatValidator implements Validator { - - @Override - public int weight() { - return 20; - } - - @Override - public boolean enabled() { - return Boolean.parseBoolean(System.getProperty("org.jnode.fs.pc98.validator.fat", "false")); - } - - @Override - public boolean validate(byte[] firstSectors) { - if (!new String(firstSectors, 0x36, 3, StandardCharsets.US_ASCII).equals("FAT")) { -logger.log(Level.TRACE, "strings FAT is not found"); - return false; - } else { -logger.log(Level.TRACE, "validation (FAT) passed"); - return true; - } - } -} diff --git a/fs/src/main/java/org/jnode/fs/pc98/validator/IplValidator.java b/fs/src/main/java/org/jnode/fs/pc98/validator/IplValidator.java deleted file mode 100644 index 9f8ef2fada..0000000000 --- a/fs/src/main/java/org/jnode/fs/pc98/validator/IplValidator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2025 by Naohide Sano, All rights reserved. - * - * Programmed by Naohide Sano - */ - -package org.jnode.fs.pc98.validator; - -import java.lang.System.Logger.Level; - -import org.jnode.fs.pc98.PC98FileSystemType.Validator; - - -/** - * NecValidator. - * - * @author Naohide Sano (nsano) - * @version 0.00 2025-11-30 nsano initial version
    - */ -public class IplValidator implements Validator { - - @Override - public int weight() { - return 30; - } - - @Override - public boolean enabled() { - return Boolean.parseBoolean(System.getProperty("org.jnode.fs.pc98.validator.ipl", "true")); - } - - @Override - public boolean validate(byte[] firstSectors) { - if (firstSectors[0x4] != 'I' || - firstSectors[0x5] != 'P' || - firstSectors[0x6] != 'L' || - firstSectors[0x7] != '1') { -logger.log(Level.TRACE, "Missing magic number 'IPL1': %c%c%c%c".formatted(firstSectors[0x4] & 0xff, firstSectors[0x5] & 0xff, firstSectors[0x6] & 0xff, firstSectors[0x7] & 0xff)); - return false; - } else { -logger.log(Level.TRACE, "validation (IPL1) passed"); - return true; - } - } -} diff --git a/fs/src/main/java/org/jnode/fs/pc98/validator/MagicValidator.java b/fs/src/main/java/org/jnode/fs/pc98/validator/MagicValidator.java deleted file mode 100644 index 703f1a4b6e..0000000000 --- a/fs/src/main/java/org/jnode/fs/pc98/validator/MagicValidator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2025 by Naohide Sano, All rights reserved. - * - * Programmed by Naohide Sano - */ - -package org.jnode.fs.pc98.validator; - -import java.lang.System.Logger.Level; - -import org.jnode.fs.pc98.PC98FileSystemType.Validator; - - -/** - * MagicValidator. - * - * @author Naohide Sano (nsano) - * @version 0.00 2025-11-30 nsano initial version
    - */ -public class MagicValidator implements Validator { - - @Override - public int weight() { - return 0; - } - - @Override - public boolean enabled() { - return true; - } - - @Override - public boolean validate(byte[] firstSectors) { - if (firstSectors[0xfe] != 0x55 || - firstSectors[0xff] != (byte) 0xaa) { - // Missing magic number -logger.log(Level.TRACE, "Missing magic number 0x55, 0xaa"); - return false; - } else { -logger.log(Level.TRACE, "validation (55aa) passed"); - return true; - } - } -} diff --git a/fs/src/main/java/org/jnode/fs/pc98/validator/NecValidator.java b/fs/src/main/java/org/jnode/fs/pc98/validator/NecValidator.java deleted file mode 100644 index e066d3c9cb..0000000000 --- a/fs/src/main/java/org/jnode/fs/pc98/validator/NecValidator.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2025 by Naohide Sano, All rights reserved. - * - * Programmed by Naohide Sano - */ - -package org.jnode.fs.pc98.validator; - -import java.lang.System.Logger.Level; - -import org.jnode.fs.pc98.PC98FileSystemType.Validator; - - -/** - * NecValidator. - * - * @author Naohide Sano (nsano) - * @version 0.00 2025-11-30 nsano initial version
    - */ -public class NecValidator implements Validator { - - @Override - public int weight() { - return 10; - } - - @Override - public boolean enabled() { - return Boolean.parseBoolean(System.getProperty("org.jnode.fs.pc98.validator.nec", "true")); - } - - @Override - public boolean validate(byte[] firstSectors) { - if (firstSectors[0x3] != 'N' || - firstSectors[0x4] != 'E' || - firstSectors[0x5] != 'C') { - // Missing magic number -logger.log(Level.TRACE, "Missing magic number 'NEC': %c%c%c".formatted(firstSectors[0x3] & 0xff, firstSectors[0x4] & 0xff, firstSectors[0x5] & 0xff)); - return false; - } else { -logger.log(Level.TRACE, "validation (NEC) passed"); - return true; - } - } -} diff --git a/fs/src/main/java/org/jnode/partitions/pc98/PC98PartitionTableEntry.java b/fs/src/main/java/org/jnode/partitions/pc98/PC98PartitionTableEntry.java index 54915ee3dc..597486ccd1 100644 --- a/fs/src/main/java/org/jnode/partitions/pc98/PC98PartitionTableEntry.java +++ b/fs/src/main/java/org/jnode/partitions/pc98/PC98PartitionTableEntry.java @@ -15,6 +15,7 @@ import vavix.io.partition.PC98PartitionEntry; import static java.lang.System.getLogger; +import static vavix.io.fat.PC98BiosParameterBlock.toLBA; /** @@ -44,12 +45,6 @@ public PC98PartitionTableEntry(PC98PartitionEntry pe, Device device) { logger.log(Level.DEBUG, "heads: %d, secs: %d, device: %s".formatted(heads, secs, device.getClass().getName())); } - // @see "https://github.com/aaru-dps/Aaru.Helpers/blob/4640bb88d3eb907d0f0617d5ee5159fbc13c5653/CHS.cs" - private static int toLBA(int cyl, int head, int sector, int maxHead, int maxSector) { - return maxHead == 0 || maxSector == 0 ? (((cyl * 16) + head) * 63) + sector - 1 - : (((cyl * maxHead) + head) * maxSector) + sector - 1; - } - @Override public boolean isValid() { return pe.isValid(); diff --git a/fs/src/main/resources/META-INF/services/org.jnode.fs.pc98.PC98FileSystemType$Validator b/fs/src/main/resources/META-INF/services/org.jnode.fs.pc98.PC98FileSystemType$Validator deleted file mode 100644 index 0ce0acc2f5..0000000000 --- a/fs/src/main/resources/META-INF/services/org.jnode.fs.pc98.PC98FileSystemType$Validator +++ /dev/null @@ -1,4 +0,0 @@ -org.jnode.fs.pc98.validator.MagicValidator -org.jnode.fs.pc98.validator.NecValidator -org.jnode.fs.pc98.validator.FatValidator -org.jnode.fs.pc98.validator.IplValidator diff --git a/fs/src/test/java/org/jnode/test/partitions/ibm/IBMPartitionTableEntryTest.java b/fs/src/test/java/org/jnode/test/partitions/ibm/IBMPartitionTableEntryTest.java index dfaf4e388f..01a0ae5e30 100644 --- a/fs/src/test/java/org/jnode/test/partitions/ibm/IBMPartitionTableEntryTest.java +++ b/fs/src/test/java/org/jnode/test/partitions/ibm/IBMPartitionTableEntryTest.java @@ -72,5 +72,4 @@ private byte[] getBootSector() { byte[] bs = new byte[500]; return bs; } - } diff --git a/fs/src/test/java/vavi/nio/file/jnode/SpiTest.java b/fs/src/test/java/vavi/nio/file/jnode/SpiTest.java index c90f396c37..c619e47a08 100644 --- a/fs/src/test/java/vavi/nio/file/jnode/SpiTest.java +++ b/fs/src/test/java/vavi/nio/file/jnode/SpiTest.java @@ -28,7 +28,7 @@ import org.junit.jupiter.api.condition.EnabledIf; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; -import static org.jnode.fs.pc98.PC98BootSector.VALIDATION_KEY; +import static vavix.io.fat.PC98BiosParameterBlock.VALIDATION_KEY; /** @@ -138,7 +138,7 @@ void test4() throws Exception { fs.close(); } - /** bpb validator specified by a system property {@link org.jnode.fs.pc98.PC98BootSector#VALIDATION_KEY} */ + /** bpb validator specified by a system property {@link PC98BiosParameterBlock#VALIDATION_KEY} */ public static boolean validate(PC98BiosParameterBlock bpb) { Debug.print(bpb); return bpb.oemLabel.contains("NEC"); diff --git a/net/pom.xml b/net/pom.xml index 4a036f716a..60d09fcc81 100644 --- a/net/pom.xml +++ b/net/pom.xml @@ -4,7 +4,7 @@ vavi vavi-nio-file-jnode - 0.2.14 + 0.2.15 jnode-net @@ -35,7 +35,7 @@ vavi jnode-core - 0.2.14 + 0.2.15 diff --git a/pom.xml b/pom.xml index aa1c8747cc..f97dcc6ab5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ vavi vavi-nio-file-jnode - 0.2.14 + 0.2.15 pom JNode Parent Module @@ -47,7 +47,7 @@ org.junit junit-bom - 5.14.0 + 5.14.1 pom import