From 3e44446efe4e3e508acadb4b972cb3fa0cfb45d0 Mon Sep 17 00:00:00 2001 From: Stuart Axon Date: Wed, 5 Nov 2025 18:15:10 +0000 Subject: [PATCH 1/2] Initial FATDiskImageExtractor. --- dtrx/dtrx.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/dtrx/dtrx.py b/dtrx/dtrx.py index 4fb1297..70ca841 100755 --- a/dtrx/dtrx.py +++ b/dtrx/dtrx.py @@ -601,6 +601,25 @@ def get_filenames(self): return BaseExtractor.get_filenames(self) +class FATDiskImageExtractor(NoPipeExtractor): + file_type = "FAT disk image" + list_command = ["mdir", "-b", "-a", "-/", "-i"] + extract_command = ["mcopy", "-nspm", "-i"] + + def extract_archive(self): + command = self.extract_command + [self.filename, "::", "."] + self.extract_pipe = command + BaseExtractor.extract_archive(self) + + def get_filenames(self): + command = self.list_command + [self.filename, "::"] + self.list_pipe = command + for line in NoPipeExtractor.get_filenames(self): + # mtools prefixes with ::/ for the default drive, remove that. + yield re.sub(r'^::[/\\]', '', line) + self.archive.close() + + class ZipExtractor(NoPipeExtractor): file_type = "Zip file" list_command = ["zipinfo", "-1"] @@ -1161,6 +1180,12 @@ class ExtractorBuilder(object): "extensions": ("tar",), "magic": ("POSIX tar archive",), }, + "fat": { + "extractors": (FATDiskImageExtractor,), + "mimetypes": ("x-msdos", "x-fat"), + "extensions": ("img", "ima", "vfd"), + "magic": ("DOS/MBR boot sector", "FAT12", "FAT16", "FAT32"), + }, "zip": { "extractors": (ZipExtractor, SevenExtractor), "mimetypes": ("zip",), From 6e58d9bf9dd84f8131984069c9c32fb107fb3582 Mon Sep 17 00:00:00 2001 From: Noah Pendleton <2538614+noahp@users.noreply.github.com> Date: Fri, 7 Nov 2025 12:09:06 -0500 Subject: [PATCH 2/2] minor fixups --- dtrx/dtrx.py | 4 ++-- tests/tests.yml | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dtrx/dtrx.py b/dtrx/dtrx.py index 70ca841..ada01b5 100755 --- a/dtrx/dtrx.py +++ b/dtrx/dtrx.py @@ -616,7 +616,7 @@ def get_filenames(self): self.list_pipe = command for line in NoPipeExtractor.get_filenames(self): # mtools prefixes with ::/ for the default drive, remove that. - yield re.sub(r'^::[/\\]', '', line) + yield re.sub(r"^::[/\\]", "", line) self.archive.close() @@ -1183,7 +1183,7 @@ class ExtractorBuilder(object): "fat": { "extractors": (FATDiskImageExtractor,), "mimetypes": ("x-msdos", "x-fat"), - "extensions": ("img", "ima", "vfd"), + "extensions": ("ima", "vfd"), "magic": ("DOS/MBR boot sector", "FAT12", "FAT16", "FAT32"), }, "zip": { diff --git a/tests/tests.yml b/tests/tests.yml index 029e3ad..27682c7 100644 --- a/tests/tests.yml +++ b/tests/tests.yml @@ -945,6 +945,7 @@ gem gz hdr + ima jar lha lrz @@ -970,6 +971,7 @@ tgz tlz txz + vfd xpi xz zip