~ruther/guix-local

9bb34f9c9232757f275f458bb2621fe976f8d8fd — Ludovic Courtès 11 years ago 6944fdb
services: dhcp-client: Turn up the interfaces before calling 'dhclient'.

Somehow, as of Linux 4.0.2, the interfaces are down by default, which
prevents 'dhclient' from actually using them.

* gnu/services/networking.scm (dhcp-client-service): Call
  'set-network-interface-up' on each item of IFACES.
1 files changed, 13 insertions(+), 9 deletions(-)

M gnu/services/networking.scm
M gnu/services/networking.scm => gnu/services/networking.scm +13 -9
@@ 165,20 165,24 @@ Protocol (DHCP) client, on all the non-loopback network interfaces."
             (provision '(networking))

             (start #~(lambda _
                        (false-if-exception (delete-file #$pid-file))

                        ;; When invoked without any arguments, 'dhclient'
                        ;; discovers all non-loopback interfaces *that are
                        ;; up*.  However, the relevant interfaces are
                        ;; typically down at this point.  Thus we perform our
                        ;; own interface discovery here.
                        (let* ((valid? (negate loopback-network-interface?))
                               (ifaces (filter valid?
                                               (all-network-interfaces)))
                               (pid    (fork+exec-command
                                        (cons* #$dhclient "-nw"
                                               "-pf" #$pid-file
                                               ifaces))))
                        (define valid?
                          (negate loopback-network-interface?))
                        (define ifaces
                          (filter valid? (all-network-interfaces)))

                        ;; XXX: Make sure the interfaces are up so that
                        ;; 'dhclient' can actually send/receive over them.
                        (for-each set-network-interface-up ifaces)

                        (false-if-exception (delete-file #$pid-file))
                        (let ((pid (fork+exec-command
                                    (cons* #$dhclient "-nw"
                                           "-pf" #$pid-file ifaces))))
                          (and (zero? (cdr (waitpid pid)))
                               (let loop ()
                                 (catch 'system-error