]> git.e2factory.org Git - e2factory.git/commitdiff
Convert digest.parse() to eio
authorTobias Ulmer <tu@emlix.com>
Mon, 11 Nov 2013 16:54:18 +0000 (17:54 +0100)
committerTobias Ulmer <tu@emlix.com>
Wed, 16 Nov 2016 14:41:16 +0000 (15:41 +0100)
Use digest functions to construct digest table and entries.
Fix a file descriptor leak.

Signed-off-by: Tobias Ulmer <tu@emlix.com>
local/digest.lua

index ad3b03d801af3ae18d39f19abb1ca9f7581e41fc..c27eda95110a63778ff3d7f93f6a9461800d4532 100644 (file)
@@ -32,6 +32,7 @@
 local digest = {}
 
 local e2lib = require("e2lib")
+local eio = require("eio")
 local hash = require("hash")
 local err = require("err")
 local strict = require("strict")
@@ -81,47 +82,51 @@ digest.SHA1_LEN = 40
 -- @see dt_entry
 function digest.parse(filename)
     assert(type(filename) == "string")
+    local e, rc, re, fh
 
-    local e = err.new("error parsing message digest file '%s'", filename)
+    e = err.new("error parsing message digest file %q", filename)
 
-    local fd, re = io.open(filename, "r")
-    if not fd then
-        return false, e:append("%s", e)
+    fh, re = eio.fopen(filename, "r")
+    if not fh then
+        return false, e:cat(re)
     end
 
-    local dt = {}
-    local linenr = 0
+    local dt, line, linenr, checksum, filenm
 
+    dt = digest.new()
+    linenr = 0
     while true do
         linenr = linenr + 1
-        local line = fd:read("*l")
+        line, re = eio.readline(fh)
         if not line then
+            eio.fclose(fh)
+            return false, e:cat(re)
+        elseif line == "" then
             break
         end
 
         -- XXX: This is a pretty naive way to parse the file format.
         -- Replace it with something more robust.
-        local checksum, filenm = line:match("^([0-9a-z]+)  (%S+)$")
+        checksum, filenm = line:match("^([0-9a-z]+)  (%S+)%s*$")
         if not checksum or not filenm then
-            fd:close()
+            eio.fclose(fh)
             return false, e:append("could not parse file format in line %d",
-            linenr)
+                linenr)
         end
 
-        local entry = {}
-        entry.checksum = checksum
-        entry.name = filenm
-
         if string.len(checksum) == digest.MD5_LEN then
-            entry.digest = digest.MD5
+            digest.new_entry(dt, digest.MD5, checksum, filenm)
         elseif string.len(checksum) == digest.SHA1_LEN then
-            entry.digest = digest.SHA1
+            digest.new_entry(dt, digest.SHA1, checksum, filenm)
         else
-            fd:close()
+            eio.fclose(fh)
             return false, e:append("unknown digest type in line %d", linenr)
         end
+    end
 
-        table.insert(dt, entry)
+    rc, re = eio.fclose(fh)
+    if not rc then
+        return false, e:cat(re)
     end
 
     fd:close()