store: Add 'system-error-to-connection-error' macro.

* guix/store.scm (system-error-to-connection-error): New macro.
(open-unix-domain-socket): Use it instead of 'catch'.
This commit is contained in:
Ludovic Courtès 2017-04-21 11:48:57 +02:00 committed by Ludovic Courtès
parent 1397b422e2
commit 3b5cd17a97
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 19 additions and 10 deletions

View File

@ -351,6 +351,18 @@
(message nix-protocol-error-message) (message nix-protocol-error-message)
(status nix-protocol-error-status)) (status nix-protocol-error-status))
(define-syntax-rule (system-error-to-connection-error file exp ...)
"Catch 'system-error' exceptions and translate them to
'&nix-connection-error'."
(catch 'system-error
(lambda ()
exp ...)
(lambda args
(let ((errno (system-error-errno args)))
(raise (condition (&nix-connection-error
(file file)
(errno errno))))))))
(define (open-unix-domain-socket file) (define (open-unix-domain-socket file)
"Connect to the Unix-domain socket at FILE and return it. Raise a "Connect to the Unix-domain socket at FILE and return it. Raise a
'&nix-connection-error' upon error." '&nix-connection-error' upon error."
@ -359,16 +371,9 @@
(socket PF_UNIX SOCK_STREAM 0))) (socket PF_UNIX SOCK_STREAM 0)))
(a (make-socket-address PF_UNIX file))) (a (make-socket-address PF_UNIX file)))
(catch 'system-error (system-error-to-connection-error file
(lambda ()
(connect s a) (connect s a)
s) s)))
(lambda args
;; Translate the error to something user-friendly.
(let ((errno (system-error-errno args)))
(raise (condition (&nix-connection-error
(file file)
(errno errno)))))))))
(define (connect-to-daemon uri) (define (connect-to-daemon uri)
"Connect to the daemon at URI, a string that may be an actual URI or a file "Connect to the daemon at URI, a string that may be an actual URI or a file
@ -1350,3 +1355,7 @@ must be an absolute store file name, or a derivation file name."
;; Return the first that works. ;; Return the first that works.
(any (cut log-file store <>) derivers)) (any (cut log-file store <>) derivers))
(_ #f))))) (_ #f)))))
;;; Local Variables:
;;; eval: (put 'system-error-to-connection-error 'scheme-indent-function 1)
;;; End: