zone.lisp: New utility for hashing files.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 22 Dec 2014 22:19:50 +0000 (22:19 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 22 Dec 2014 22:23:10 +0000 (22:23 +0000)
zone.lisp

index 28ee038..177ded6 100644 (file)
--- a/zone.lisp
+++ b/zone.lisp
   "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.