~ruther/guix-local

ed09bb11cdd3454c00caf10615fac3cdd1791d55 — Ludovic Courtès 11 years ago 971436c
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'.
1 files changed, 23 insertions(+), 3 deletions(-)

M gnu/services/base.scm
M gnu/services/base.scm => gnu/services/base.scm +23 -3
@@ 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))))))