From 101d9f3fd43b436d5dc7ef13e644c7fbbc7f62d5 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 15 May 2013 23:40:09 +0200 Subject: substitute-binary: Pass `filtered-port' an unbuffered port. This fixes a bug whereby `read-response' would read more than just the response, with the extra data going into the port's buffer; the "bzip2 -dc" process spawned by `filtered-port' would not see the those buffered data, which are definitely lost, and would bail out with "bzip2: (stdin) is not a bzip2 file." * guix/utils.scm (filtered-port): Document that INPUT must be unbuffered. * guix/web.scm (http-fetch): Add `buffered?' parameter. Call `open-socket-for-uri' explicitly, and call `setvbuf' when BUFFERED? is false. Pass the port to `http-get'. Close it upon 301/302. * guix/scripts/substitute-binary.scm (fetch): Add `buffered?' parameter. Pass it to `http-fetch'; honor it for `file' URIs. (guix-substitute-binary): Call `fetch' with #:buffered? #f for port RAW. * tests/utils.scm ("filtered-port, file"): Open FILE as unbuffered. --- guix/scripts/substitute-binary.scm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'guix/scripts') diff --git a/guix/scripts/substitute-binary.scm b/guix/scripts/substitute-binary.scm index 27a43b9e3f..1317a72fb1 100755 --- a/guix/scripts/substitute-binary.scm +++ b/guix/scripts/substitute-binary.scm @@ -117,15 +117,17 @@ (define field-rx (else (error "unmatched line" line))))) -(define (fetch uri) +(define* (fetch uri #:key (buffered? #t)) "Return a binary input port to URI and the number of bytes it's expected to provide." (case (uri-scheme uri) ((file) (let ((port (open-input-file (uri-path uri)))) + (unless buffered? + (setvbuf port _IONBF)) (values port (stat:size (stat port))))) ((http) - (http-fetch uri #:text? #f)))) + (http-fetch uri #:text? #f #:buffered? buffered?)))) (define-record-type (%make-cache url store-directory wants-mass-query?) @@ -423,7 +425,7 @@ (define (guix-substitute-binary . args) (format #t "~a~%" (narinfo-hash narinfo)) (let*-values (((raw download-size) - (fetch uri)) + (fetch uri #:buffered? #f)) ((input pids) (decompressed-port (narinfo-compression narinfo) raw))) -- cgit v1.2.3