summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2014-07-10 00:20:57 +0200
committerLudovic Courtès <ludo@gnu.org>2014-07-10 00:35:27 +0200
commited09bb11cdd3454c00caf10615fac3cdd1791d55 (patch)
tree2e13d64e1c75c75b6da6e9ca71fbd57f129361f0
parent971436c6bdbeb68cbcc89437cb30b3be61ccae7a (diff)
downloadguix-ed09bb11cdd3454c00caf10615fac3cdd1791d55.tar.gz
services: udev: Improve synchronization when starting.
* gnu/services/base.scm (udev-service)[start]: Add 'wait-for-udevd', and
  call it before running 'udevadm trigger'.  Pass --action=add to
  'udevadm trigger'.  Call 'udevadm settle' after 'udevadm trigger'.
-rw-r--r--gnu/services/base.scm26
1 files changed, 23 insertions, 3 deletions
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 030121625b..c430586dbf 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -409,6 +409,20 @@ hydra.gnu.org are used by default."
                         (define udevd
                           (string-append #$udev "/libexec/udev/udevd"))
 
+                        (define (wait-for-udevd)
+                          ;; Wait until someone's listening on udevd's control
+                          ;; socket.
+                          (let ((sock (socket AF_UNIX SOCK_SEQPACKET 0)))
+                            (let try ()
+                              (catch 'system-error
+                                (lambda ()
+                                  (connect sock PF_UNIX "/run/udev/control")
+                                  (close-port sock))
+                                (lambda args
+                                  (format #t "waiting for udevd...~%")
+                                  (usleep 500000)
+                                  (try))))))
+
                         ;; Allow udev to find the modules.
                         (setenv "LINUX_MODULE_DIRECTORY"
                                 "/run/booted-system/kernel/lib/modules")
@@ -418,12 +432,18 @@ hydra.gnu.org are used by default."
                             ((0)
                              (exec-command (list udevd)))
                             (else
+                             ;; Wait until udevd is up and running.  This
+                             ;; appears to be needed so that the events
+                             ;; triggered below are actually handled.
+                             (wait-for-udevd)
+
+                             ;; Trigger device node creation.
+                             (system* (string-append #$udev "/bin/udevadm")
+                                      "trigger" "--action=add")
+
                              ;; Wait for things to settle down.
                              (system* (string-append #$udev "/bin/udevadm")
                                       "settle")
-                             ;; Create a bunch of devices.
-                             (system* (string-append #$udev "/bin/udevadm")
-                                      "trigger")
                              pid)))))
              (stop #~(make-kill-destructor))))))