filesystem/iso9660: ExtentReader interface

This commit is contained in:
Zack Buhman 2025-01-01 02:58:38 -06:00
parent f0c4c64925
commit c922af0749
3 changed files with 108 additions and 52 deletions

View File

@ -0,0 +1,5 @@
package filesystem.iso9660;
interface ExtentReader {
public abstract void readInto(byte[] buf, int extent);
}

View File

@ -0,0 +1,24 @@
package filesystem.iso9660;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
class TestExtentReader implements ExtentReader {
byte[] all_bytes;
public TestExtentReader() {
try {
all_bytes = Files.readAllBytes(Paths.get("classes/classes.iso"));
} catch (IOException e) {
System.out.println("readAllBytes exception");
}
}
public void readInto(byte[] buf, int extent) {
int offset = extent * 2048;
for (int i = 0; i < 2048; i++) {
buf[i] = all_bytes[offset + i];
}
}
}

View File

@ -1,15 +1,13 @@
package p; package filesystem.iso9660;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import filesystem.iso9660.PrimaryVolumeDescriptor; import filesystem.iso9660.PrimaryVolumeDescriptor;
import filesystem.iso9660.DirectoryRecord; import filesystem.iso9660.DirectoryRecord;
import filesystem.iso9660.TestExtentReader;
class ISOParser { public class VolumeParser {
byte[] buf; byte[] buf;
DirectoryRecord dr; DirectoryRecord dr;
ExtentReader reader;
static final int FILE_FLAGS__DIRECTORY = 2; static final int FILE_FLAGS__DIRECTORY = 2;
@ -19,6 +17,16 @@ class ISOParser {
} }
} }
public void printStandardIdentifier() {
System.out.print("standard identifier: ");
int start = PrimaryVolumeDescriptor.STANDARD_IDENTIFIER_START;
int end = PrimaryVolumeDescriptor.STANDARD_IDENTIFIER_END;
for (int i = start; i <= end; i++) {
System.out.print((char)buf[i]);
}
System.out.println();
}
public boolean drIsSelfOrParent() { public boolean drIsSelfOrParent() {
if (dr.lengthOfFileIdentifier() != 1) { if (dr.lengthOfFileIdentifier() != 1) {
return false; return false;
@ -27,29 +35,19 @@ class ISOParser {
return (start == 0 || start == 1); return (start == 0 || start == 1);
} }
public void walkDirectory(int extent, int num_extents, int indent) { public int walkDirectoryRecord(int indent, int[] child_extents, int[] child_lengths, int child_ix) {
int[] child_extents = new int[64]; if (drIsSelfOrParent()) {
int[] child_lengths = new int[64]; return child_ix;
int child_ix = 0;
while (num_extents > 0) {
int offset = extent * 2048;
while (true) {
dr.offset = offset;
if (dr.lengthOfDirectoryRecord() == 0) {
System.out.print("break\n");
break;
} }
if (!drIsSelfOrParent()) {
for (int i = 0; i < indent; i++) for (int i = 0; i < indent; i++)
System.out.print(" "); System.out.print(" ");
System.out.print("offset: "); System.out.print("offset: ");
System.out.print(dr.offset); System.out.print(dr.offset);
System.out.print("; file_flags: "); //System.out.print("; file_flags: ");
System.out.print((int)dr.fileFlags()); //System.out.print((int)dr.fileFlags());
if ((dr.fileFlags() & FILE_FLAGS__DIRECTORY) == 0) { if ((dr.fileFlags() & FILE_FLAGS__DIRECTORY) == 0) {
System.out.print(" [regular file] "); System.out.print(" [regular file] ");
@ -62,12 +60,35 @@ class ISOParser {
child_ix += 1; child_ix += 1;
} }
System.out.print("; file_identifier: "); System.out.print(" file_identifier: ");
printIdentifier(buf, offset, DirectoryRecord.FILE_IDENTIFIER_START, dr.lengthOfFileIdentifier()); printIdentifier(buf, dr.offset, DirectoryRecord.FILE_IDENTIFIER_START, dr.lengthOfFileIdentifier());
System.out.println(); System.out.println();
return child_ix;
} }
offset += dr.lengthOfDirectoryRecord();
public void walkDirectory(int extent, int num_extents, int indent) {
int[] child_extents = new int[64];
int[] child_lengths = new int[64];
int child_ix = 0;
while (num_extents > 0) {
for (int i = 0; i < indent; i++)
System.out.print(" ");
System.out.print("read extent : ");
System.out.println(extent);
reader.readInto(buf, extent);
dr.offset = 0;
while (true) {
if (dr.lengthOfDirectoryRecord() == 0) {
break;
}
child_ix = walkDirectoryRecord(indent, child_extents, child_lengths, child_ix);
dr.offset += dr.lengthOfDirectoryRecord();
} }
num_extents -= 1; num_extents -= 1;
extent += 1; extent += 1;
@ -80,27 +101,33 @@ class ISOParser {
} }
} }
public static void main(String[] args) throws IOException { public void parse() {
ISOParser parser = new ISOParser(); int pvd_extent = 16;
parser.buf = Files.readAllBytes(Paths.get("classes.iso"));
int pvd_offset = 2048 * 16; reader.readInto(buf, pvd_extent);
System.out.print("standard identifier: "); printStandardIdentifier();
for (int i = PrimaryVolumeDescriptor.STANDARD_IDENTIFIER_START; i <= PrimaryVolumeDescriptor.STANDARD_IDENTIFIER_END; i++) {
System.out.print((char)parser.buf[pvd_offset + i]); dr.offset = PrimaryVolumeDescriptor.DIRECTORY_RECORD_FOR_ROOT_DIRECTORY_START;
System.out.print("root directory record: location: ");
System.out.print(dr.locationOfExtent());
System.out.print(" ; data length: ");
System.out.println(dr.dataLength());
int extent = dr.locationOfExtent();
int num_extents = dr.dataLength() >> 11; // division by 2048
walkDirectory(extent, num_extents, 0);
} }
System.out.println();
public VolumeParser(ExtentReader reader) {
this.reader = reader;
this.buf = new byte[2048];
this.dr = new DirectoryRecord(this.buf, 0);
}
int directory_record_for_root_directory = pvd_offset + PrimaryVolumeDescriptor.DIRECTORY_RECORD_FOR_ROOT_DIRECTORY_START; public static void main(String[] args) {
System.out.println("root directory record: "); TestExtentReader reader = new TestExtentReader();
parser.dr = new DirectoryRecord(parser.buf, directory_record_for_root_directory); VolumeParser parser = new VolumeParser(reader);
System.out.println(parser.dr.locationOfExtent()); parser.parse();
System.out.println(parser.dr.dataLength());
int extent = parser.dr.locationOfExtent();
int num_extents = parser.dr.dataLength() >> 11; // division by 2048
parser.walkDirectory(extent, num_extents, 0);
} }
} }