all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Danny Milosavljevic <dannym@scratchpost.org>
To: 22050@debbugs.gnu.org, ludo@gnu.org
Subject: bug#22050: [PATCH v4 1/2] linux-boot: Add make-static-device-nodes.
Date: Thu, 14 Dec 2017 20:56:35 +0100	[thread overview]
Message-ID: <20171214195636.787-2-dannym@scratchpost.org> (raw)
In-Reply-To: <20171214195636.787-1-dannym@scratchpost.org>

* gnu/build/linux-boot.scm (make-static-device-nodes): New variable.
<device-node>: New variable.
parse-static-nodes-from-devname-file: New variable.
not-slash: New variable.
report-system-error: New variable.
catch-system-error: New variable.
create-device-node: New variable.

Co-Authored-By: Ludovic Courtès <ludo@gnu.org>    
---
 gnu/build/linux-boot.scm | 81 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 2547f1e0a..c83bbcda4 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -22,8 +22,12 @@
   #:use-module (system repl error-handling)
   #:autoload   (system repl repl) (start-repl)
   #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-9)
   #:use-module (srfi srfi-26)
   #:use-module (ice-9 match)
+  #:use-module (ice-9 rdelim)
+  #:use-module (ice-9 regex)
+  #:use-module (ice-9 popen)
   #:use-module (ice-9 ftw)
   #:use-module (guix build utils)
   #:use-module ((guix build syscalls)
@@ -35,6 +39,7 @@
             linux-command-line
             find-long-option
             make-essential-device-nodes
+            make-static-device-nodes
             configure-qemu-networking
 
             bind-mount
@@ -105,6 +110,82 @@ with the given MAJOR number, starting with MINOR."
              'block-special #o644 (device-number major (+ minor i)))
       (loop (+ i 1)))))
 
+(define-record-type <device-node>
+  (device-node name type major minor module)
+  device-node?
+  (name device-node-name)
+  (type device-node-type)
+  (major device-node-major)
+  (minor device-node-minor)
+  (module device-node-module))
+
+(define (parse-static-nodes-from-devname-file devname-name)
+  (call-with-input-file devname-name
+    (lambda (input-file)
+      (let loop ((line (read-line input-file)))
+        (if (eof-object? line)
+          '()
+          (match (string-split line #\space)
+           (("#" _ ...)
+            (loop (read-line input-file)))
+           ((module-name device-name device-spec)
+            (let* ((device-parts (string-match "(.)([0-9][0-9]*):([0-9][0-9]*)" device-spec))
+                   (type-string (match:substring device-parts 1))
+                   (type (match type-string
+                          ("c" 'char-special)
+                          ("b" 'block-special)))
+                   (major-string (match:substring device-parts 2))
+                   (major (string->number major-string 10))
+                   (minor-string (match:substring device-parts 3))
+                   (minor (string->number minor-string 10)))
+              (cons (device-node device-name type major minor module-name)
+                    (loop (read-line input-file)))))
+           (_
+            (begin
+              (format (current-error-port) "~a: ignored devname line '~a'~%"
+                      devname-name line)
+              (loop (read-line input-file))))))))))
+
+(define not-slash
+  (char-set-complement (char-set #\/)))
+
+(define (report-system-error name . args)
+  (let ((errno (system-error-errno args)))
+        (format (current-error-port) "could not create '~a': ~a~%" name
+                (strerror errno))))
+
+(define-syntax-rule (catch-system-error name exp)
+  (catch 'system-error
+    (lambda ()
+      exp)
+    (lambda args
+      (apply report-system-error name args))))
+
+(define create-device-node
+  (match-lambda
+    (($ <device-node> name type major minor module)
+     (let ((name-parts (string-tokenize name not-slash)))
+       (let loop ((prefix "/dev")
+                  (name-parts name-parts))
+         (match name-parts
+          ((leaf)
+           (let ((prefix (string-append prefix "/" leaf)))
+             (catch-system-error prefix
+               (mknod prefix type #o600 (device-number major minor)))))
+          ((prefix-addition tails ...)
+           (let ((prefix (string-append prefix "/" prefix-addition)))
+             (unless (file-exists? prefix)
+               (mkdir prefix #o755))
+             (loop prefix tails)))))))))
+
+(define* (make-static-device-nodes linux-module-directory)
+  (let* ((kernel-release (utsname:release (uname)))
+         (devname-name (string-append linux-module-directory "/"
+                                      kernel-release "/"
+                                      "modules.devname")))
+       (for-each create-device-node
+                 (parse-static-nodes-from-devname-file devname-name))))
+
 (define* (make-essential-device-nodes #:key (root "/"))
   "Make essential device nodes under ROOT/dev."
   ;; The hand-made devtmpfs/udev!

  reply	other threads:[~2017-12-14 19:57 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-29 11:36 bug#22050: fuse.ko not automatically loaded on GuixSD Ludovic Courtès
2017-12-13 22:04 ` bug#22050: [PATCH 0/2] Create static device nodes before starting udev Danny Milosavljevic
2017-12-13 22:05   ` bug#22050: [PATCH 1/2] linux-boot: Add make-static-device-nodes Danny Milosavljevic
2017-12-13 22:05     ` bug#22050: [PATCH 2/2] services: base: Use make-static-device-nodes Danny Milosavljevic
2017-12-13 22:17   ` bug#22050: [PATCH v2 0/2] Create static device nodes before starting udev Danny Milosavljevic
2017-12-13 22:17     ` bug#22050: [PATCH v2 1/2] linux-boot: Add make-static-device-nodes Danny Milosavljevic
2017-12-13 22:17     ` bug#22050: [PATCH v2 2/2] services: base: Use make-static-device-nodes Danny Milosavljevic
2017-12-13 22:32   ` bug#22050: [PATCH v3 0/2] Create static device nodes before starting udev Danny Milosavljevic
2017-12-13 22:32     ` bug#22050: [PATCH v3 1/2] linux-boot: Add make-static-device-nodes Danny Milosavljevic
2017-12-14  8:52       ` Ludovic Courtès
2017-12-14 10:32         ` Danny Milosavljevic
2017-12-14 13:14           ` Ludovic Courtès
2017-12-14 18:21             ` Danny Milosavljevic
2017-12-13 22:32     ` bug#22050: [PATCH v3 2/2] services: base: Use make-static-device-nodes Danny Milosavljevic
2017-12-14 19:56     ` bug#22050: [PATCH v4 0/2] Create static device nodes before starting udev Danny Milosavljevic
2017-12-14 19:56       ` Danny Milosavljevic [this message]
2017-12-15  9:41         ` bug#22050: [PATCH v4 1/2] linux-boot: Add make-static-device-nodes Ludovic Courtès
2017-12-15 17:27           ` Danny Milosavljevic
2017-12-15 22:37             ` Ludovic Courtès
2017-12-14 19:56       ` bug#22050: [PATCH v4 2/2] services: base: Use make-static-device-nodes Danny Milosavljevic
2017-12-14 21:25       ` bug#22050: [PATCH v5 0/2] Create static device nodes before starting udev Danny Milosavljevic
2017-12-14 21:25         ` bug#22050: [PATCH v5 1/2] linux-boot: Add make-static-device-nodes Danny Milosavljevic
2017-12-14 21:25         ` bug#22050: [PATCH v5 2/2] services: base: Use make-static-device-nodes Danny Milosavljevic
2017-12-15  9:44           ` Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171214195636.787-2-dannym@scratchpost.org \
    --to=dannym@scratchpost.org \
    --cc=22050@debbugs.gnu.org \
    --cc=ludo@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.