summary refs log tree commit diff
path: root/gnu/build/file-systems.scm
diff options
context:
space:
mode:
authorMathieu Othacehe <othacehe@gnu.org>2020-07-26 15:34:33 +0200
committerMathieu Othacehe <othacehe@gnu.org>2020-07-26 18:35:10 +0200
commit675e56221e3dfc58cac94bf30835f16a9c41d530 (patch)
tree19d35fcd1b5585bb8938bf4dbb17025a1944af93 /gnu/build/file-systems.scm
parent1f322c5eb371570562813e522ea4fd3e57dc5bc8 (diff)
downloadguix-675e56221e3dfc58cac94bf30835f16a9c41d530.tar.gz
file-systems: Add NTFS support.
* gnu/system/uuid.scm (%ntfs-endianness): New macro,
(ntfs-uuid->string): new procedure,
(%ntfs-endianness): new variable,
(string->ntfs-uuid): new exported procedure,
(%uuid-parsers): add NTFS support,
(%uuid-printers): add NTFS support.
* gnu/build/file-systems.scm (%ntfs-endianness): New macro,
(ntfs-superblock?, read-ntfs-superblock, ntfs-superblock-uuid,
check-ntfs-file-system): new procedure,
(%partition-uuid-readers): add NTFS support,
(check-file-system): add NTFS support.
Diffstat (limited to 'gnu/build/file-systems.scm')
-rw-r--r--gnu/build/file-systems.scm41
1 files changed, 40 insertions, 1 deletions
diff --git a/gnu/build/file-systems.scm b/gnu/build/file-systems.scm
index ad92d8a496..478c71a4e1 100644
--- a/gnu/build/file-systems.scm
+++ b/gnu/build/file-systems.scm
@@ -478,6 +478,42 @@ not valid header was found."
 
 
 ;;;
+;;; NTFS file systems.
+;;;
+
+;; Taken from <linux-libre>/fs/ntfs/layout.h
+
+(define-syntax %ntfs-endianness
+  ;; Endianness of NTFS file systems.
+  (identifier-syntax (endianness little)))
+
+(define (ntfs-superblock? sblock)
+  "Return #t when SBLOCK is a NTFS superblock."
+  (bytevector=? (sub-bytevector sblock 3 8)
+                (string->utf8 "NTFS    ")))
+
+(define (read-ntfs-superblock device)
+  "Return the raw contents of DEVICE's NTFS superblock as a bytevector, or #f
+if DEVICE does not contain a NTFS file system."
+  (read-superblock device 0 511 ntfs-superblock?))
+
+(define (ntfs-superblock-uuid sblock)
+  "Return the UUID of NTFS superblock SBLOCK as a 8-byte bytevector."
+  (sub-bytevector sblock 72 8))
+
+;; TODO: Add ntfs-superblock-volume-name.  The partition label is not stored
+;; in the BOOT SECTOR like the UUID, but in the MASTER FILE TABLE, which seems
+;; way harder to access.
+
+(define (check-ntfs-file-system device)
+  "Return the health of a NTFS file system on DEVICE."
+  (match (status:exit-val
+          (system* "ntfsfix" device))
+    (0 'pass)
+    (_ 'fatal-error)))
+
+
+;;;
 ;;; Partition lookup.
 ;;;
 
@@ -585,7 +621,9 @@ partition field reader that returned a value."
         (partition-field-reader read-jfs-superblock
                                 jfs-superblock-uuid)
         (partition-field-reader read-f2fs-superblock
-                                f2fs-superblock-uuid)))
+                                f2fs-superblock-uuid)
+        (partition-field-reader read-ntfs-superblock
+                                ntfs-superblock-uuid)))
 
 (define read-partition-label
   (cut read-partition-field <> %partition-label-readers))
@@ -684,6 +722,7 @@ were found."
      ((string-suffix? "fat" type) check-fat-file-system)
      ((string-prefix? "jfs" type) check-jfs-file-system)
      ((string-prefix? "f2fs" type) check-f2fs-file-system)
+     ((string-prefix? "ntfs" type) check-ntfs-file-system)
      ((string-prefix? "nfs" type) (const 'pass))
      (else #f)))