summary refs log tree commit diff
path: root/gnu/build/file-systems.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/build/file-systems.scm')
-rw-r--r--gnu/build/file-systems.scm58
1 files changed, 58 insertions, 0 deletions
diff --git a/gnu/build/file-systems.scm b/gnu/build/file-systems.scm
index 41e1c9e282..6fd9f95093 100644
--- a/gnu/build/file-systems.scm
+++ b/gnu/build/file-systems.scm
@@ -9,6 +9,7 @@
 ;;; Copyright © 2022 Oleg Pykhalov <go.wigust@gmail.com>
 ;;; Copyright © 2024 Nicolas Graves <ngraves@ngraves.fr>
 ;;; Copyright © 2024 Richard Sent <richard@freakingpenguin.com>
+;;; Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -53,6 +54,11 @@
             find-partition-by-luks-uuid
             canonicalize-device-spec
 
+            device-name->hurd-device-name
+            device-spec->device
+            device-spec->device-name
+            hurd-device-name->device-name
+
             read-partition-label
             read-partition-uuid
             read-luks-partition-uuid
@@ -1431,4 +1437,56 @@ corresponds to the symbols listed in FLAGS."
         (or (file-system-mount-may-fail? fs)
             (apply throw args))))))
 
+(define %device-name-regexp "/dev/[hsvw]d([abcd])([0-9]*)")
+(define %hurd-device-name-regexp "part:([0-9]*):device:[hw]d([0-9]*)")
+
+(define (device-spec->device-name device-spec)
+  "Return DEVICE-SPEC as a Linux /dev/XdYZ device name, also catering for uuid
+or label."
+  (cond ((string-match %device-name-regexp device-spec)
+         device-spec)
+        ((string-match %hurd-device-name-regexp device-spec)
+         (hurd-device-name->device-name device-spec))
+        ((string->uuid device-spec)
+         =>
+         (lambda (uuid) (false-if-exception (find-partition-by-uuid uuid))))
+        (else
+         (false-if-exception (find-partition-by-label device-spec)))))
+
+(define* (device-name->hurd-device-name device-name #:key (disk "w"))
+  "Return DEVICE-NAME as a Hurd device name:
+     part:PART-NUMBER:device:DISKdDISK-INDEX
+Default to part:1:device:DISKd0 if partition cannot be found."
+  (let* ((m (and=> device-name (cute string-match %device-name-regexp <>)))
+         (disk-char (and m (and=> (match:substring m 1)
+                                  (compose car string->list))))
+         (disk-index (or (and disk-char
+                              (- (char->integer disk-char) (char->integer #\a)))
+                         0))
+         (partition-number (or (and m (and=> (match:substring m 2)
+                                             string->number))
+                               1)))
+    (format #f "part:~a:device:~ad~a" partition-number disk disk-index)))
+
+(define* (hurd-device-name->device-name device-name #:key (disk "s"))
+  (let* ((m (and=> device-name (cute string-match %hurd-device-name-regexp <>)))
+         (disk-index-string (and=> m (cute match:substring <> 2)))
+         (disk-index (or (and=> disk-index-string string->number)
+                         0))
+         (disk-index-char (integer->char (+ disk-index (char->integer #\a))))
+         (partition-string (and=> m (cute match:substring <> 1)))
+         (partition-number (or (and=> partition-string string->number)
+                               1)))
+    (format #f "/dev/~ad~a~a" disk disk-index-char partition-number)))
+
+(define (device-spec->device device-spec)
+  "Return DEVICE-SPEC as UUID, FILE-SYSTEM-LABEL, or DEVICE-SPEC."
+  (cond ((and=> (string->uuid device-spec)
+                find-partition-by-uuid)
+         (string->uuid device-spec))
+        ((find-partition-by-label device-spec)
+         (file-system-label device-spec))
+        (else
+         device-spec)))
+
 ;;; file-systems.scm ends here