summaryrefslogtreecommitdiff
path: root/gnu/services
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 /gnu/services
parent971436c6bdbeb68cbcc89437cb30b3be61ccae7a (diff)
downloadgnu-guix-ed09bb11cdd3454c00caf10615fac3cdd1791d55.tar
gnu-guix-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'.
Diffstat (limited to 'gnu/services')
-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))))))