Nikita Karetnikov <[email protected]> skribis: >> 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")))))
Looks good. > I guess that "wrong number of arguments" can be handled by > (lambda args ...). Still, the above feels much safer. Not sure what you mean, but the above snippet is OK. Ludo’.
