Merge Waqas<>Zash
authorMatthew Wild <mwild1@gmail.com>
Tue, 31 Jul 2012 23:07:02 +0100
changeset 5069 7b298f8bcbcb
parent 5068 14d4fc5859b9 (diff)
parent 5065 acfaf771f10e (current diff)
child 5070 4bf6bd22ad11
Merge Waqas<>Zash
util/datamanager.lua
--- a/util-src/pposix.c	Wed Aug 01 01:36:34 2012 +0500
+++ b/util-src/pposix.c	Tue Jul 31 23:07:02 2012 +0100
@@ -662,23 +662,38 @@
 	len = luaL_checkinteger(L, 3);
 
 #if defined(_GNU_SOURCE)
-	if(fallocate(fileno(f), FALLOC_FL_KEEP_SIZE, offset, len) != 0)
-#elif _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L
-#warning Using posix_fallocate() fallback. Linux fallocate() is strongly recommended if available: recompile with -D_GNU_SOURCE
-	if(posix_fallocate(fileno(f), offset, len) != 0)
-#endif
+	if(fallocate(fileno(f), FALLOC_FL_KEEP_SIZE, offset, len) == 0)
 	{
-#if ! defined(_GNU_SOURCE)
-		/* posix_fallocate() can leave a bunch of NULs at the end, so we cut that
-		 * this assumes that offset == length of the file */
-		ftruncate(fileno(f), offset);
-#endif
+		lua_pushboolean(L, 1);
+		return 1;
+	}
+
+	if(errno != ENOSYS && errno != EOPNOTSUPP)
+	{
 		lua_pushnil(L);
 		lua_pushstring(L, strerror(errno));
 		return 2;
 	}
-	lua_pushboolean(L, 1);
-	return 1;
+#else
+#warning Only using posix_fallocate() fallback.
+#warning Linux fallocate() is strongly recommended if available: recompile with -D_GNU_SOURCE
+#warning Note that posix_fallocate() will still be used on filesystems that dont support fallocate()
+#endif
+
+	if(posix_fallocate(fileno(f), offset, len) == 0)
+	{
+		lua_pushboolean(L, 1);
+		return 1;
+	}
+	else
+	{
+		lua_pushnil(L);
+		lua_pushstring(L, strerror(errno));
+		/* posix_fallocate() can leave a bunch of NULs at the end, so we cut that
+		 * this assumes that offset == length of the file */
+		ftruncate(fileno(f), offset);
+		return 2;
+	}
 }
 #endif
 
--- a/util/datamanager.lua	Wed Aug 01 01:36:34 2012 +0500
+++ b/util/datamanager.lua	Tue Jul 31 23:07:02 2012 +0100
@@ -213,7 +213,10 @@
 	if not data then return; end
 	if callback(username, host, datastore) == false then return true; end
 	-- save the datastore
-	local f, msg = io_open(getpath(username, host, datastore, "list", true), "a");
+	local f, msg = io_open(getpath(username, host, datastore, "list", true), "r+");
+	if not f then
+		f, msg = io_open(getpath(username, host, datastore, "list", true), "w");
+	end
 	if not f then
 		log("error", "Unable to write to %s storage ('%s') for user: %s@%s", datastore, msg, username or "nil", host or "nil");
 		return;