summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix/store.scm53
-rw-r--r--tests/store.scm9
2 files changed, 39 insertions, 23 deletions
diff --git a/guix/store.scm b/guix/store.scm
index a669011f3a..49549d0771 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -374,29 +374,36 @@ space on the file system so that the garbage collector can still operate,
should the disk become full. When CPU-AFFINITY is true, it must be an integer
corresponding to an OS-level CPU number to which the daemon's worker process
for this connection will be pinned. Return a server object."
- (let ((port (or port (open-unix-domain-socket file))))
- (write-int %worker-magic-1 port)
- (let ((r (read-int port)))
- (and (eqv? r %worker-magic-2)
- (let ((v (read-int port)))
- (and (eqv? (protocol-major %protocol-version)
- (protocol-major v))
- (begin
- (write-int %protocol-version port)
- (when (>= (protocol-minor v) 14)
- (write-int (if cpu-affinity 1 0) port)
- (when cpu-affinity
- (write-int cpu-affinity port)))
- (when (>= (protocol-minor v) 11)
- (write-int (if reserve-space? 1 0) port))
- (let ((conn (%make-nix-server port
- (protocol-major v)
- (protocol-minor v)
- (make-hash-table 100)
- (make-hash-table 100))))
- (let loop ((done? (process-stderr conn)))
- (or done? (process-stderr conn)))
- conn))))))))
+ (guard (c ((nar-error? c)
+ ;; One of the 'write-' or 'read-' calls below failed, but this is
+ ;; really a connection error.
+ (raise (condition
+ (&nix-connection-error (file (or port file))
+ (errno EPROTO))
+ (&message (message "build daemon handshake failed"))))))
+ (let ((port (or port (open-unix-domain-socket file))))
+ (write-int %worker-magic-1 port)
+ (let ((r (read-int port)))
+ (and (eqv? r %worker-magic-2)
+ (let ((v (read-int port)))
+ (and (eqv? (protocol-major %protocol-version)
+ (protocol-major v))
+ (begin
+ (write-int %protocol-version port)
+ (when (>= (protocol-minor v) 14)
+ (write-int (if cpu-affinity 1 0) port)
+ (when cpu-affinity
+ (write-int cpu-affinity port)))
+ (when (>= (protocol-minor v) 11)
+ (write-int (if reserve-space? 1 0) port))
+ (let ((conn (%make-nix-server port
+ (protocol-major v)
+ (protocol-minor v)
+ (make-hash-table 100)
+ (make-hash-table 100))))
+ (let loop ((done? (process-stderr conn)))
+ (or done? (process-stderr conn)))
+ conn)))))))))
(define (close-connection server)
"Close the connection to SERVER."
diff --git a/tests/store.scm b/tests/store.scm
index 38b8efce96..123ea8a787 100644
--- a/tests/store.scm
+++ b/tests/store.scm
@@ -48,6 +48,15 @@
(test-begin "store")
+(test-equal "connection handshake error"
+ EPROTO
+ (let ((port (%make-void-port "rw")))
+ (guard (c ((nix-connection-error? c)
+ (and (eq? port (nix-connection-error-file c))
+ (nix-connection-error-code c))))
+ (open-connection #f #:port port)
+ 'broken)))
+
(test-equal "store-path-hash-part"
"283gqy39v3g9dxjy26rynl0zls82fmcg"
(store-path-hash-part