From d6c9f0ce591cb6d5302a81d0e02477ced25b06a5 Mon Sep 17 00:00:00 2001
From: Kim Alvefur <zash@zash.se>
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 <zash@zash.se>
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 <zash@zash.se>
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 <zash@zash.se>
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 <zash@zash.se>
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 <zash@zash.se>
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