Software /
code /
prosody
Changeset
5044:4ef0dbfead53
util.pposix: Add fallocate method, backed by either posix_fallocate() or Linux fallocate()
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 28 Jul 2012 22:21:10 +0200 |
parents | 5043:2856e1cfbe95 |
children | 5045:4ba6940deed0 |
files | util-src/pposix.c |
diffstat | 1 files changed, 43 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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 <string.h> #include <errno.h> #include "lua.h" +#include "lualib.h" #include "lauxlib.h" +#include <fcntl.h> +#if defined(_GNU_SOURCE) +#include <linux/falloc.h> +#endif + #if (defined(_SVID_SOURCE) && !defined(WITHOUT_MALLINFO)) #include <malloc.h> #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 } };