From c1a4ca07418685d4c5b41acbde292c5769cdb2b3 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 28 Oct 2018 20:39:58 +0100 Subject: [PATCH] Use safe_write_file, backup damaged network files --- init.lua | 44 +++++++++++++++++++++++++++----------------- locale/de.txt | 1 + locale/template.txt | 1 + 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/init.lua b/init.lua index a7aab85..8da7da2 100644 --- a/init.lua +++ b/init.lua @@ -78,6 +78,10 @@ - target list is now centered if there are less than 9 targets --]] +-- Required to save the travelnet data properly in all cases +if not minetest.safe_file_write then + error("[Mod travelnet] Your Minetest version is no longer supported. (version < 0.4.17)") +end travelnet = {}; @@ -98,37 +102,43 @@ minetest.register_privilege("travelnet_remove", { description = S("allows to dig -- read the configuration dofile(minetest.get_modpath("travelnet").."/config.lua"); -- the normal, default travelnet - +travelnet.mod_data_path = minetest.get_worldpath().."/mod_travelnet.data" -- TODO: save and restore ought to be library functions and not implemented in each individual mod! -- called whenever a station is added or removed travelnet.save_data = function() local data = minetest.serialize( travelnet.targets ); - local path = minetest.get_worldpath().."/mod_travelnet.data"; - local file = io.open( path, "w" ); - if( file ) then - file:write( data ); - file:close(); - else - print(S("[Mod travelnet] Error: Savefile '%s' could not be written."):format(tostring(path))); + local success = minetest.safe_file_write( travelnet.mod_data_path, data ); + if( not success ) then + print(S("[Mod travelnet] Error: Savefile '%s' could not be written.") + :format(travelnet.mod_data_path)); end end travelnet.restore_data = function() - - local path = minetest.get_worldpath().."/mod_travelnet.data"; - local file = io.open( path, "r" ); - if( file ) then - local data = file:read("*all"); - travelnet.targets = minetest.deserialize( data ); - file:close(); - else - print(S("[Mod travelnet] Error: Savefile '%s' not found."):format(tostring(path))); + local file = io.open( travelnet.mod_data_path, "r" ); + if( not file ) then + print(S("[Mod travelnet] Error: Savefile '%s' not found.") + :format(travelnet.mod_data_path)); + return; end + + local data = file:read("*all"); + travelnet.targets = minetest.deserialize( data ); + + if( not travelnet.targets ) then + local backup_file = travelnet.mod_data_path..".bak" + print(S("[Mod travelnet] Error: Savefile '%s' is damaged. Saved the backup as '%s'.") + :format(travelnet.mod_data_path, backup_file)); + + minetest.safe_file_write( backup_file, data ); + travelnet.targets = {}; + end + file:close(); end diff --git a/locale/de.txt b/locale/de.txt index 2675c13..e957f92 100644 --- a/locale/de.txt +++ b/locale/de.txt @@ -9,6 +9,7 @@ allows to dig travelnet boxes which belog to nets of other players = erlaubt es, [Mod travelnet] Error: Savefile '%s' could not be written. = [Mod travelnet] Fehler: Sicherungsdatei '%s' konnte nicht geschrieben werden. [Mod travelnet] Error: Savefile '%s' not found. = [Mod travelnet] Fehler: Sicherungsdatei '%s' nicht gefunden. +[Mod travelnet] Error: Savefile '%s' is damaged. Saved the backup as '%s'. = [Mod travelnet] Fehler: Sicherungsdatei '%s' ist beschädigt. Backup wurde unter '%s' gespeichert. Back = Zurück Exit = Ende diff --git a/locale/template.txt b/locale/template.txt index 661dbdd..ebbf275 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -9,6 +9,7 @@ allows to dig travelnet boxes which belog to nets of other players = [Mod travelnet] Error: Savefile '%s' could not be written. = [Mod travelnet] Error: Savefile '%s' not found. = +[Mod travelnet] Error: Savefile '%s' is damaged. Saved the backup as '%s'. = Back = Exit =