From: Mark Wooding Date: Mon, 22 Dec 2014 22:19:50 +0000 (+0000) Subject: zone.lisp: New utility for hashing files. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/zone/commitdiff_plain/476808d8bacf084e6632b3aebbe14c28ec49e09a?ds=sidebyside zone.lisp: New utility for hashing files. --- diff --git a/zone.lisp b/zone.lisp index 28ee038..177ded6 100644 --- a/zone.lisp +++ b/zone.lisp @@ -202,6 +202,19 @@ (defun mapenum (func name) "Call FUNC on TAG/VALUE pairs from the enumeration called NAME." (maphash func (get name 'enum-forward))) +(defun hash-file (hash file context) + "Hash the FILE using the OpenSSL HASH function, returning an octet string. + + CONTEXT is a temporary-files context." + (let ((temp (temporary-file context "hash"))) + (run-program (list "openssl" "dgst" (concatenate 'string "-" hash)) + :input file :output temp) + (with-open-file (in temp) + (let ((line (read-line in))) + (assert (and (>= (length line) 9) + (string= line "(stdin)= " :end1 9))) + (decode-hex line :start 9))))) + ;;;-------------------------------------------------------------------------- ;;; Zone types.