# HG changeset patch # User Kim Alvefur # Date 1343506870 -7200 # Node ID 4ef0dbfead536e73d715bd9b33cf9dd256815c27 # Parent 2856e1cfbe95bd6c058559bd58af0e68cd545237 util.pposix: Add fallocate method, backed by either posix_fallocate() or Linux fallocate() diff -r 2856e1cfbe95 -r 4ef0dbfead53 util-src/pposix.c --- a/util-src/pposix.c Sat Jul 28 20:59:03 2012 +0100 +++ b/util-src/pposix.c Sat Jul 28 22:21:10 2012 +0200 @@ -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 @@ -642,6 +648,39 @@ } #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) +#elif _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L + if(posix_fallocate(fileno(f), offset, len) != 0) +#endif + { +#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_pushnil(L); + lua_pushstring(L, strerror(errno)); + return 2; + } + lua_pushboolean(L, 1); + return 1; +} +#endif + /* Register functions */ int luaopen_util_pposix(lua_State *L) @@ -679,6 +718,10 @@ { "meminfo", lc_meminfo }, #endif +#if _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L || defined(_GNU_SOURCE) + { "fallocate", lc_fallocate }, +#endif + { NULL, NULL } };