aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--util-src/pposix.c35
-rw-r--r--util/datamanager.lua5
2 files changed, 29 insertions, 11 deletions
diff --git a/util-src/pposix.c b/util-src/pposix.c
index 7dd8708b..191e276e 100644
--- a/util-src/pposix.c
+++ b/util-src/pposix.c
@@ -662,23 +662,38 @@ int lc_fallocate(lua_State* L)
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)
+ if(fallocate(fileno(f), FALLOC_FL_KEEP_SIZE, offset, len) == 0)
+ {
+ lua_pushboolean(L, 1);
+ return 1;
+ }
+
+ if(errno != ENOSYS && errno != EOPNOTSUPP)
+ {
+ lua_pushnil(L);
+ lua_pushstring(L, strerror(errno));
+ return 2;
+ }
+#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)
{
-#if ! defined(_GNU_SOURCE)
+ 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);
-#endif
- lua_pushnil(L);
- lua_pushstring(L, strerror(errno));
return 2;
}
- lua_pushboolean(L, 1);
- return 1;
}
#endif
diff --git a/util/datamanager.lua b/util/datamanager.lua
index ecf90bab..9f7600ee 100644
--- a/util/datamanager.lua
+++ b/util/datamanager.lua
@@ -213,7 +213,10 @@ function list_append(username, host, datastore, data)
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;