summaryrefslogtreecommitdiff
path: root/gnu
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
parent971436c6bdbeb68cbcc89437cb30b3be61ccae7a (diff)
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')
-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 030121625bd..c430586dbf7 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -409,6 +409,20 @@ hydra.gnu.org are used by default."
409 (define udevd 409 (define udevd
410 (string-append #$udev "/libexec/udev/udevd")) 410 (string-append #$udev "/libexec/udev/udevd"))
411 411
412 (define (wait-for-udevd)
413 ;; Wait until someone's listening on udevd's control
414 ;; socket.
415 (let ((sock (socket AF_UNIX SOCK_SEQPACKET 0)))
416 (let try ()
417 (catch 'system-error
418 (lambda ()
419 (connect sock PF_UNIX "/run/udev/control")
420 (close-port sock))
421 (lambda args
422 (format #t "waiting for udevd...~%")
423 (usleep 500000)
424 (try))))))
425
412 ;; Allow udev to find the modules. 426 ;; Allow udev to find the modules.
413 (setenv "LINUX_MODULE_DIRECTORY" 427 (setenv "LINUX_MODULE_DIRECTORY"
414 "/run/booted-system/kernel/lib/modules") 428 "/run/booted-system/kernel/lib/modules")
@@ -418,12 +432,18 @@ hydra.gnu.org are used by default."
418 ((0) 432 ((0)
419 (exec-command (list udevd))) 433 (exec-command (list udevd)))
420 (else 434 (else
435 ;; Wait until udevd is up and running. This
436 ;; appears to be needed so that the events
437 ;; triggered below are actually handled.
438 (wait-for-udevd)
439
440 ;; Trigger device node creation.
441 (system* (string-append #$udev "/bin/udevadm")
442 "trigger" "--action=add")
443
421 ;; Wait for things to settle down. 444 ;; Wait for things to settle down.
422 (system* (string-append #$udev "/bin/udevadm") 445 (system* (string-append #$udev "/bin/udevadm")
423 "settle") 446 "settle")
424 ;; Create a bunch of devices.
425 (system* (string-append #$udev "/bin/udevadm")
426 "trigger")
427 pid))))) 447 pid)))))
428 (stop #~(make-kill-destructor)))))) 448 (stop #~(make-kill-destructor))))))
429 449