X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util-src%2Fpposix.c;h=05303d99ae574a2e1ab990f64d06d206e19fd11a;hb=d631eea82c5144b9c2142b32affdb0ba4f878a43;hp=65f8b4ab0389ddbb766f167ad92f1728bd0ec32b;hpb=87322dba7bec7a32ace681561cf5a7f6fc0b5173;p=prosody.git diff --git a/util-src/pposix.c b/util-src/pposix.c index 65f8b4ab..05303d99 100644 --- a/util-src/pposix.c +++ b/util-src/pposix.c @@ -32,8 +32,14 @@ #include #include #include "lua.h" +#include "lualib.h" #include "lauxlib.h" +#include +#if defined(_GNU_SOURCE) +#include +#endif + #if (defined(_SVID_SOURCE) && !defined(WITHOUT_MALLINFO)) #include #define WITH_MALLINFO @@ -83,6 +89,10 @@ static int lc_daemonize(lua_State *L) close(0); close(1); close(2); + /* Make sure accidental use of FDs 0, 1, 2 don't cause weirdness */ + open("/dev/null", O_RDONLY); + open("/dev/null", O_WRONLY); + open("/dev/null", O_WRONLY); /* Final fork, use it wisely */ if(fork()) @@ -642,6 +652,55 @@ int lc_meminfo(lua_State* L) } #endif +/* File handle extraction blatantly stolen from + * https://github.com/rrthomas/luaposix/blob/master/lposix.c#L631 + * */ + +#if _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L || defined(_GNU_SOURCE) +int lc_fallocate(lua_State* L) +{ + off_t offset, len; + FILE *f = *(FILE**) luaL_checkudata(L, 1, LUA_FILEHANDLE); + + offset = luaL_checkinteger(L, 2); + len = luaL_checkinteger(L, 3); + +#if defined(_GNU_SOURCE) + 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) + { + 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 + /* Register functions */ int luaopen_util_pposix(lua_State *L) @@ -679,6 +738,10 @@ int luaopen_util_pposix(lua_State *L) { "meminfo", lc_meminfo }, #endif +#if _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L || defined(_GNU_SOURCE) + { "fallocate", lc_fallocate }, +#endif + { NULL, NULL } };