~ruther/guix-local

a6642650a78a11e4d3b4cff78e423c600fab7021 — Ludovic Courtès 1 year, 5 months ago 410a359
reconfigure: Make ‘load-system-for-kexec’ errors non-fatal.

Partially fixes <https://issues.guix.gnu.org/75215>.

* guix/scripts/system/reconfigure.scm (load-system-for-kexec): Catch
exceptions in the gexp.  Report them outside.

Reported-by: Luis Guilherme Coelho <lgcoelho@disroot.org>
Change-Id: Iebcdc92e29b8623a55967d58a4f353abab01631a
1 files changed, 29 insertions(+), 4 deletions(-)

M guix/scripts/system/reconfigure.scm
M guix/scripts/system/reconfigure.scm => guix/scripts/system/reconfigure.scm +29 -4
@@ 230,10 230,35 @@ services as defined by OS."
                                                            to-restart)))))))

(define (load-system-for-kexec eval os)
  "Load OS so that it can be rebooted into via kexec, if supported.  Return
true on success."
  (eval #~(and (string-contains %host-type "-linux")
               (primitive-load #$(kexec-loading-program os)))))
  "Load OS so that it can be rebooted into via kexec, if supported.  Print a
warning in case of failure."
  (mlet %store-monad
      ((result (eval
                #~(and (string-contains %host-type "-linux")
                       (with-exception-handler
                           (lambda (c)
                             (define kind-and-args?
                               (exception-predicate &exception-with-kind-and-args))

                             (list 'exception
                                   (if (kind-and-args? c)
                                       (call-with-output-string
                                         (lambda (port)
                                           (print-exception port #f
                                                            (exception-kind c)
                                                            (exception-args c))))
                                       (object->string c))))
                         (lambda ()
                           (primitive-load #$(kexec-loading-program os))
                           'success)
                         #:unwind? #t)))))
    (match result
      ('success
       (return #t))
      (('exception message)
       (warning (G_ "failed to load operating system for kexec: ~a~%")
                message)
       (return #f)))))


;;;