From 69c1537a387cd885b58b689b6d1dc1cb517f0cfb Mon Sep 17 00:00:00 2001 From: Mike Fleetwood Date: Wed, 7 Nov 2018 20:05:38 +0000 Subject: [PATCH] Recognise APFS (Apple File System) (#23) Just add detection of APFS using GParted's internal magic string detection. It just matches 1 byte of the 2 byte object type and the 4 byte magic field found in the super block [1]. See code comment for more details. Blkid has just gained recognition of APFS with util-linux v2.33 released 06-Nov-2018 [2]. This will write enough for GParted's simple internal detection to find APFS: # python -c ' import sys sys.stdout.write("\0"*24 + "\1\0" + "\0"*6 + "NXSB") ' > /dev/sdb1 [1] Apple File System Reference https://developer.apple.com/support/apple-file-system/Apple-File-System-Reference.pdf [2] [ANNOUNCE] util-linux v2.33 https://marc.info/?l=linux-fsdevel&m=154150400305928&w=2 Closes #23 - GParted doesn't detect APFS (Apple File System) --- include/Utils.h | 21 +++++++++++---------- src/GParted_Core.cc | 17 ++++++++++++++++- src/Utils.cc | 2 ++ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/include/Utils.h b/include/Utils.h index 20ab1153..ec5b4904 100644 --- a/include/Utils.h +++ b/include/Utils.h @@ -92,18 +92,19 @@ enum FSType FS_XFS = 27, // Other recognised file system types - FS_BITLOCKER = 28, - FS_GRUB2_CORE_IMG = 29, - FS_ISO9660 = 30, - FS_LINUX_SWRAID = 31, - FS_LINUX_SWSUSPEND = 32, - FS_REFS = 33, - FS_UFS = 34, - FS_ZFS = 35, + FS_APFS = 28, + FS_BITLOCKER = 29, + FS_GRUB2_CORE_IMG = 30, + FS_ISO9660 = 31, + FS_LINUX_SWRAID = 32, + FS_LINUX_SWSUSPEND = 33, + FS_REFS = 34, + FS_UFS = 35, + FS_ZFS = 36, // Partition space usage colours - FS_USED = 36, - FS_UNUSED = 37 + FS_USED = 37, + FS_UNUSED = 38 } ; enum SIZE_UNIT diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc index 88036405..fa4abbd6 100644 --- a/src/GParted_Core.cc +++ b/src/GParted_Core.cc @@ -1332,7 +1332,8 @@ FSType GParted_Core::detect_filesystem_internal( PedDevice * lp_device, PedParti { 0LL, "\x52\xE8\x28\x01", 0LL, NULL , FS_GRUB2_CORE_IMG }, { 0LL, "\x52\xBF\xF4\x81", 0LL, NULL , FS_GRUB2_CORE_IMG }, { 0LL, "\x52\x56\xBE\x63", 0LL, NULL , FS_GRUB2_CORE_IMG }, - { 0LL, "\x52\x56\xBE\x56", 0LL, NULL , FS_GRUB2_CORE_IMG } + { 0LL, "\x52\x56\xBE\x56", 0LL, NULL , FS_GRUB2_CORE_IMG }, + { 24LL, "\x01\x00" , 32LL, "NXSB", FS_APFS } }; // For simple BitLocker recognition consider validation of BIOS Parameter block // fields unnecessary. @@ -1343,6 +1344,17 @@ FSType GParted_Core::detect_filesystem_internal( PedDevice * lp_device, PedParti // instructions it starts with. // * bootinfoscript v0.77 line 1990 [GRUB2 core.img possible staring 4 bytes] // https://github.com/arvidjaar/bootinfoscript/blob/009f509d59e2f0d39b8d44692e2a81720f5af7b6/bootinfoscript#L1990 + // + // Simple APFS recognition based on matching the following fields in the + // superblock: + // 1) Object type is OBJECT_TYPE_NX_SUPERBLOCK, lower 16-bits of the object type + // field is 0x0001 stored as little endian bytes 0x01, 0x00. + // WARNING: The magic signatures are defined as NUL terminated strings so the + // below code only does a 1-byte match for 0x01, rather than a 2-byte match + // for 0x01, 0x00. + // 2) 4 byte magic "NXSB". + // * Apple File System Reference + // https://developer.apple.com/support/apple-file-system/Apple-File-System-Reference.pdf for ( unsigned int i = 0 ; i < sizeof( signatures ) / sizeof( signatures[0] ) ; i ++ ) { @@ -1473,6 +1485,8 @@ FSType GParted_Core::detect_filesystem( PedDevice * lp_device, PedPartition * lp return GParted::FS_UDF; else if ( fsname == "ufs" ) return GParted::FS_UFS ; + else if ( fsname == "apfs" ) + return FS_APFS; else if ( fsname == "BitLocker" ) return FS_BITLOCKER; else if ( fsname == "iso9660" ) @@ -4182,6 +4196,7 @@ void GParted_Core::init_filesystems() FILESYSTEM_MAP[FS_REISERFS] = new reiserfs(); FILESYSTEM_MAP[FS_UDF] = new udf(); FILESYSTEM_MAP[FS_XFS] = new xfs(); + FILESYSTEM_MAP[FS_APFS] = NULL; FILESYSTEM_MAP[FS_BITLOCKER] = NULL; FILESYSTEM_MAP[FS_GRUB2_CORE_IMG] = NULL; FILESYSTEM_MAP[FS_ISO9660] = NULL; diff --git a/src/Utils.cc b/src/Utils.cc index 80e5704e..2e55d162 100644 --- a/src/Utils.cc +++ b/src/Utils.cc @@ -116,6 +116,7 @@ Glib::ustring Utils::get_color( FSType filesystem ) case FS_REISERFS: return "#ADA7C8"; // Purple Hilight case FS_UDF: return "#105210"; // Accent Green Shadow [+] case FS_XFS: return "#EED680"; // Accent Yellow + case FS_APFS: return "#874986"; // Magenta Dark [*] case FS_BITLOCKER: return "#494066"; // Purple Shadow case FS_GRUB2_CORE_IMG: return "#666666"; // Dark Gray [*] case FS_ISO9660: return "#D3D3D3"; // Light Gray [*] @@ -304,6 +305,7 @@ Glib::ustring Utils::get_filesystem_string( FSType filesystem ) case FS_REISERFS: return "reiserfs"; case FS_UDF: return "udf"; case FS_XFS: return "xfs"; + case FS_APFS: return "apfs"; case FS_BITLOCKER: return "bitlocker"; case FS_GRUB2_CORE_IMG: return "grub2 core.img"; case FS_ISO9660: return "iso9660";