Merge 0.9->0.10
[prosody.git] / util-src / pposix.c
index 8ad167b72d25ad5d0e0c3f619207302c09d05c1f..49e80f711f0bac54211c5cc8c260edb9940d4bde 100644 (file)
 #include "lualib.h"
 #include "lauxlib.h"
 
+#if (LUA_VERSION_NUM == 502)
+#define luaL_register(L, N, R) luaL_setfuncs(L, R, 0)
+#endif
+
 #include <fcntl.h>
 #if defined(__linux__) && defined(_GNU_SOURCE)
 #include <linux/falloc.h>
@@ -674,18 +678,25 @@ int lc_meminfo(lua_State* L)
 #if _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L || defined(_GNU_SOURCE)
 int lc_fallocate(lua_State* L)
 {
+       int ret;
        off_t offset, len;
        FILE *f = *(FILE**) luaL_checkudata(L, 1, LUA_FILEHANDLE);
+       if (f == NULL)
+               luaL_error(L, "attempt to use a closed file");
 
        offset = luaL_checkinteger(L, 2);
        len = luaL_checkinteger(L, 3);
 
 #if defined(__linux__) && defined(_GNU_SOURCE)
-       if(fallocate(fileno(f), FALLOC_FL_KEEP_SIZE, offset, len) == 0)
+       errno = 0;
+       ret = fallocate(fileno(f), FALLOC_FL_KEEP_SIZE, offset, len);
+       if(ret == 0)
        {
                lua_pushboolean(L, 1);
                return 1;
        }
+       /* Some old versions of Linux apparently use the return value instead of errno */
+       if(errno == 0) errno = ret;
 
        if(errno != ENOSYS && errno != EOPNOTSUPP)
        {
@@ -699,7 +710,8 @@ int lc_fallocate(lua_State* L)
 #warning Note that posix_fallocate() will still be used on filesystems that dont support fallocate()
 #endif
 
-       if(posix_fallocate(fileno(f), offset, len) == 0)
+       ret = posix_fallocate(fileno(f), offset, len);
+       if(ret == 0)
        {
                lua_pushboolean(L, 1);
                return 1;
@@ -707,7 +719,7 @@ int lc_fallocate(lua_State* L)
        else
        {
                lua_pushnil(L);
-               lua_pushstring(L, strerror(errno));
+               lua_pushstring(L, strerror(ret));
                /* 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);
@@ -760,7 +772,8 @@ int luaopen_util_pposix(lua_State *L)
                { NULL, NULL }
        };
 
-       luaL_register(L, "pposix",  exports);
+       lua_newtable(L);
+       luaL_register(L, NULL,  exports);
 
        lua_pushliteral(L, "pposix");
        lua_setfield(L, -2, "_NAME");