> Ah, TOCTTOU, right.

> You could do:

>   (let ((hash (catch 'system-error
>                 (lambda ()
>                   (call-with-input-file ...))
>                 (lambda args
>                   (leave (_ "error ..." (strerror (system-error-errno 
> args))))))))
>     ...)

Here is what I did (I'll remove "guix hash" when we have "warning"):

      (match args
        ((file)
         (catch 'system-error
           (lambda ()
             (format #t "~a~%"
                     (call-with-input-file file
                       (compose fmt sha256 get-bytevector-all))))
           (lambda args
             (leave (_ "~a: ~a~%")
                    "guix hash" (strerror (system-error-errno args))))))
        (_
         (leave (_ "~a: wrong number of arguments~%")
                "guix hash")))))

I guess that "wrong number of arguments" can be handled by
(lambda args ...).  Still, the above feels much safer.

What do you think?

Attachment: pgpwiY1r59k9o.pgp
Description: PGP signature

Reply via email to