X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util-src%2Fpposix.c;h=99a308cfea8f79ac8c626ad2392523cde2ed86d6;hb=b603eb8625bcd9cf715d751e93c6fe54830ab2f1;hp=7600766f3ca489e794638c2c5101358a73f314fb;hpb=f06067bea6170b236b86677c4078cfec00d8440e;p=prosody.git diff --git a/util-src/pposix.c b/util-src/pposix.c index 7600766f..99a308cf 100644 --- a/util-src/pposix.c +++ b/util-src/pposix.c @@ -89,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()) @@ -479,6 +483,9 @@ int string2resource(const char *s) { if (!strcmp(s, "MEMLOCK")) return RLIMIT_MEMLOCK; if (!strcmp(s, "NPROC")) return RLIMIT_NPROC; if (!strcmp(s, "RSS")) return RLIMIT_RSS; +#endif +#ifdef RLIMIT_NICE + if (!strcmp(s, "NICE")) return RLIMIT_NICE; #endif return -1; } @@ -662,22 +669,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 - 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