From d6c9f0ce591cb6d5302a81d0e02477ced25b06a5 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 1 Mar 2017 16:42:02 +0100 Subject: util.envload: Open file here instead of letting loadfile do it so that all return values from io.open can be collected --- util/envload.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'util') diff --git a/util/envload.lua b/util/envload.lua index 3c5190df..08adf35e 100644 --- a/util/envload.lua +++ b/util/envload.lua @@ -6,7 +6,8 @@ -- -- luacheck: ignore 113/setfenv -local load, loadstring, loadfile, setfenv = load, loadstring, loadfile, setfenv; +local load, loadstring, setfenv = load, loadstring, setfenv; +local io_open = io.open; local envload; local envloadfile; @@ -18,7 +19,9 @@ if setfenv then end function envloadfile(file, env) - local f, err = loadfile(file); + local fh, err, errno = io_open(file); + if not fh then return fh, err, errno; end + local f, err = load(function () return fh:read(2048); end, "@"..file); if f and env then setfenv(f, env); end return f, err; end @@ -28,7 +31,9 @@ else end function envloadfile(file, env) - return loadfile(file, nil, env); + local fh, err, errno = io_open(file); + if not fh then return fh, err, errno; end + return load(fh:lines(2048), "@"..file, nil, env); end end -- cgit v1.2.3 From fc38b8c4f4fe84d6ed15128a96348f5a256bb9a2 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 1 Mar 2017 16:44:59 +0100 Subject: util.datamanager: Ignore ENOENT (no such file) when loading data --- util/datamanager.lua | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'util') diff --git a/util/datamanager.lua b/util/datamanager.lua index 585bb83d..52d0c0bf 100644 --- a/util/datamanager.lua +++ b/util/datamanager.lua @@ -39,6 +39,7 @@ local function fallocate(f, offset, len) f:seek("set", offset); return true; end; +local ENOENT = 2; pcall(function() local pposix = require "util.pposix"; raw_mkdir = pposix.mkdir or raw_mkdir; -- Doesn't trample on umask @@ -122,8 +123,12 @@ local function getpath(username, host, datastore, ext, create) end local function load(username, host, datastore) - local data, err = envloadfile(getpath(username, host, datastore), {}); + local data, err, errno = envloadfile(getpath(username, host, datastore), {}); if not data then + if errno == ENOENT then + -- No such file, ok to ignore + return nil; + end local mode = lfs.attributes(getpath(username, host, datastore), "mode"); if not mode then log("debug", "Assuming empty %s storage ('%s') for user: %s@%s", datastore, err, username or "nil", host or "nil"); @@ -145,9 +150,9 @@ end local function atomic_store(filename, data) local scratch = filename.."~"; - local f, ok, msg; + local f, ok, msg, errno; - f, msg = io_open(scratch, "w"); + f, msg, errno = io_open(scratch, "w"); if not f then return nil, msg; end @@ -295,8 +300,12 @@ end local function list_load(username, host, datastore) local items = {}; - local data, err = envloadfile(getpath(username, host, datastore, "list"), {item = function(i) t_insert(items, i); end}); + local data, err, errno = envloadfile(getpath(username, host, datastore, "list"), {item = function(i) t_insert(items, i); end}); if not data then + if errno == ENOENT then + -- No such file, ok to ignore + return nil; + end local mode = lfs.attributes(getpath(username, host, datastore, "list"), "mode"); if not mode then log("debug", "Assuming empty %s storage ('%s') for user: %s@%s", datastore, err, username or "nil", host or "nil"); -- cgit v1.2.3 From f0c676e8c6e714fcdd898c913af0b705ccde61ee Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 1 Mar 2017 17:04:48 +0100 Subject: util.datamanager: Import value of ENOENT from util.pposix (if available) --- util/datamanager.lua | 1 + 1 file changed, 1 insertion(+) (limited to 'util') diff --git a/util/datamanager.lua b/util/datamanager.lua index 52d0c0bf..8ef3c050 100644 --- a/util/datamanager.lua +++ b/util/datamanager.lua @@ -44,6 +44,7 @@ pcall(function() local pposix = require "util.pposix"; raw_mkdir = pposix.mkdir or raw_mkdir; -- Doesn't trample on umask fallocate = pposix.fallocate or fallocate; + ENOENT = pposix.ENOENT or ENOENT; end); local _ENV = nil; -- cgit v1.2.3 From c3aae40b197b00014765a5dcc2874e4483a5d6dc Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 1 Mar 2017 17:15:56 +0100 Subject: util.datamanager: Use atomic store function when writing the first entry of a list --- util/datamanager.lua | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'util') diff --git a/util/datamanager.lua b/util/datamanager.lua index 8ef3c050..d36865d7 100644 --- a/util/datamanager.lua +++ b/util/datamanager.lua @@ -228,11 +228,8 @@ local function append(username, host, datastore, ext, data) local ok; local f, msg = io_open(filename, "r+"); if not f then + return atomic_store(filename, data); -- File did probably not exist, let's create it - f, msg = io_open(filename, "w"); - if not f then - return nil, msg, "open"; - end end local pos = f:seek("end"); -- cgit v1.2.3 From cb0953029e238d93ab44fce8a545e2ac9e56c190 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 1 Mar 2017 17:37:29 +0100 Subject: util.datamanager: Expose atomic_store as store_raw --- util/datamanager.lua | 1 + 1 file changed, 1 insertion(+) (limited to 'util') diff --git a/util/datamanager.lua b/util/datamanager.lua index d36865d7..2b47c3c4 100644 --- a/util/datamanager.lua +++ b/util/datamanager.lua @@ -415,6 +415,7 @@ return { load = load; store = store; append_raw = append; + store_raw = atomic_store; list_append = list_append; list_store = list_store; list_load = list_load; -- cgit v1.2.3 From f637fde31f2a8c06819001b6d2b1766a51dd8cb2 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 1 Mar 2017 17:48:15 +0100 Subject: util.envload: Close file handle after reading data --- util/envload.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'util') diff --git a/util/envload.lua b/util/envload.lua index 08adf35e..926f20c0 100644 --- a/util/envload.lua +++ b/util/envload.lua @@ -22,6 +22,7 @@ if setfenv then local fh, err, errno = io_open(file); if not fh then return fh, err, errno; end local f, err = load(function () return fh:read(2048); end, "@"..file); + fh:close(); if f and env then setfenv(f, env); end return f, err; end @@ -33,7 +34,9 @@ else function envloadfile(file, env) local fh, err, errno = io_open(file); if not fh then return fh, err, errno; end - return load(fh:lines(2048), "@"..file, nil, env); + local f, err = load(fh:lines(2048), "@"..file, nil, env); + fh:close(); + return f, err; end end -- cgit v1.2.3