aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xconfigure377
-rw-r--r--plugins/mod_saslauth.lua15
-rw-r--r--plugins/mod_websocket.lua8
-rw-r--r--util-src/crand.c21
-rw-r--r--util-src/net.c1
-rw-r--r--util-src/pposix.c29
-rw-r--r--util-src/ringbuffer.c4
-rw-r--r--util-src/signal.c2
-rw-r--r--util-src/table.c3
-rw-r--r--util/datamanager.lua24
-rw-r--r--util/envload.lua14
11 files changed, 358 insertions, 140 deletions
diff --git a/configure b/configure
index 974823c3..c416709d 100755
--- a/configure
+++ b/configure
@@ -21,7 +21,7 @@ EXCERTS="yes"
PRNG=
PRNGLIBS=
-CFLAGS="-fPIC -Wall -pedantic -std=c89"
+CFLAGS="-fPIC -Wall -pedantic -std=c99"
LDFLAGS="-shared"
IDN_LIBRARY="idn"
@@ -42,10 +42,15 @@ Configure Prosody prior to building.
Default is \$PREFIX/lib
--datadir=DIR Location where the server data should be stored.
Default is \$PREFIX/var/lib/prosody
+--lua-version=VERSION Use specific Lua version: 5.1, 5.2, or 5.3
+ Default is auto-detected.
--lua-suffix=SUFFIX Versioning suffix to use in Lua filenames.
Default is "$LUA_SUFFIX" (lua$LUA_SUFFIX...)
--with-lua=PREFIX Use Lua from given prefix.
- Default is $LUA_DIR
+ Default is auto-detected (the parent directory of \$LUA_BINDIR).
+--with-lua-bin=DIR You can also specify Lua's bin dir.
+ Default is the directory of the auto-detected Lua interpreter,
+ or \$LUA_DIR/bin if --with-lua is used.
--runwith=BINARY What Lua binary to set as runtime environment.
Default is $RUNWITH
--with-lua-include=DIR You can also specify Lua's includes dir.
@@ -78,31 +83,86 @@ Configure Prosody prior to building.
EOF
}
+# Helper functions
-while [ "$1" ]
+find_program() {
+ prog=`command -v "$1" 2>/dev/null`
+ if [ -n "$prog" ]
+ then
+ dirname "$prog"
+ fi
+}
+
+die() {
+ echo "$*"
+ echo
+ echo "configure failed."
+ echo
+ exit 1
+}
+
+find_helper() {
+ explanation="$1"
+ shift
+ tried="$*"
+ while [ -n "$1" ]
+do
+ found=`find_program "$1"`
+ if [ -n "$found" ]
+ then
+ echo "$1 found at $found"
+ HELPER=$1
+ return
+ fi
+ shift
+ done
+ echo "Could not find $explanation. Tried: $tried."
+ die "Make sure one of them is installed and available in your PATH."
+}
+
+case `echo -n x` in
+-n*) echo_n_flag='';;
+*) echo_n_flag='-n';;
+esac
+
+echo_n() {
+ echo $echo_n_flag "$*"
+}
+
+# ----------------------------------------------------------------------------
+# MAIN PROGRAM
+# ----------------------------------------------------------------------------
+
+# Parse options
+
+while [ -n "$1" ]
do
- value="$(echo "$1" | sed 's/[^=]*=\(.*\)/\1/')"
- if echo "$value" | grep -q "~"
+ value="`echo $1 | sed 's/[^=]*.\(.*\)/\1/'`"
+ key="`echo $1 | sed 's/=.*//'`"
+ if `echo "$value" | grep "~" >/dev/null 2>/dev/null`
then
echo
echo '*WARNING*: the "~" sign is not expanded in flags.'
echo 'If you mean the home directory, use $HOME instead.'
echo
fi
- case "$1" in
+ case "$key" in
--help)
show_help
exit 0
;;
- --prefix=*)
+ --prefix)
+ [ -n "$value" ] || die "Missing value in flag $key."
PREFIX="$value"
PREFIX_SET=yes
;;
- --sysconfdir=*)
+ --sysconfdir)
+ [ -n "$value" ] || die "Missing value in flag $key."
SYSCONFDIR="$value"
SYSCONFDIR_SET=yes
;;
- --ostype=*)
+ --ostype)
+ # TODO make this a switch?
OSTYPE="$value"
OSTYPE_SET=yes
if [ "$OSTYPE" = "debian" ]; then
@@ -110,10 +170,9 @@ do
LUA_SUFFIX="5.1";
LUA_SUFFIX_SET=yes
fi
- RUNWITH="lua$LUA_SUFFIX"
LUA_INCDIR="/usr/include/lua$LUA_SUFFIX"
LUA_INCDIR_SET=yes
- CFLAGS="$CFLAGS -ggdb -D_GNU_SOURCE"
+ CFLAGS="$CFLAGS -ggdb"
fi
if [ "$OSTYPE" = "macosx" ]; then
LUA_INCDIR=/usr/local/include;
@@ -128,7 +187,7 @@ do
LUA_INCDIR_SET=yes
LUA_LIBDIR=/usr/local/lib
LUA_LIBDIR_SET=yes
- CFLAGS="$CFLAGS -ggdb -D_GNU_SOURCE"
+ CFLAGS="$CFLAGS -ggdb"
fi
if [ "$OSTYPE" = "freebsd" -o "$OSTYPE" = "openbsd" ]; then
LUA_INCDIR="/usr/local/include/lua51"
@@ -147,7 +206,6 @@ do
LUA_INCDIR_SET="yes"
fi
if [ "$OSTYPE" = "netbsd" ]; then
- RUNWITH="lua5.1"
LUA_INCDIR="/usr/pkg/include/lua-5.1"
LUA_INCDIR_SET=yes
LUA_LIBDIR="/usr/pkg/lib/lua/5.1"
@@ -167,79 +225,98 @@ do
LUA_INCDIR="$LUA_CF"
LUA_INCDIR_SET=yes
fi
- CFLAGS="$CFLAGS -D_GNU_SOURCE"
+ CFLAGS="$CFLAGS"
fi
;;
- --libdir=*)
+ --libdir)
LIBDIR="$value"
LIBDIR_SET=yes
;;
- --datadir=*)
+ --datadir)
DATADIR="$value"
DATADIR_SET=yes
;;
--require-config)
REQUIRE_CONFIG=yes
;;
- --lua-suffix=*)
+ --lua-suffix)
+ [ -n "$value" ] || die "Missing value in flag $key."
LUA_SUFFIX="$value"
LUA_SUFFIX_SET=yes
;;
- --with-lua=*)
+ --lua-version|--with-lua-version)
+ [ -n "$value" ] || die "Missing value in flag $key."
+ LUA_VERSION="$value"
+ [ "$LUA_VERSION" = "5.1" -o "$LUA_VERSION" = "5.2" -o "$LUA_VERSION" = "5.3" ] || die "Invalid Lua version in flag $key."
+ LUA_VERSION_SET=yes
+ ;;
+ --with-lua)
+ [ -n "$value" ] || die "Missing value in flag $key."
LUA_DIR="$value"
LUA_DIR_SET=yes
;;
- --with-lua-include=*)
+ --with-lua-bin)
+ [ -n "$value" ] || die "Missing value in flag $key."
+ LUA_BINDIR="$value"
+ LUA_BINDIR_SET=yes
+ ;;
+ --with-lua-include)
+ [ -n "$value" ] || die "Missing value in flag $key."
LUA_INCDIR="$value"
LUA_INCDIR_SET=yes
;;
- --with-lua-lib=*)
- LUA_LIBDIR="$value" LUA_LIBDIR_SET=yes
+ --with-lua-lib)
+ [ -n "$value" ] || die "Missing value in flag $key."
+ LUA_LIBDIR="$value"
+ LUA_LIBDIR_SET=yes
;;
- --with-idn=*)
+ --with-idn)
IDN_LIB="$value"
;;
- --idn-library=*)
+ --idn-library)
IDN_LIBRARY="$value"
;;
- --with-ssl=*)
+ --with-ssl)
OPENSSL_LIB="$value"
;;
- --with-random=getrandom)
- PRNG=GETRANDOM
- ;;
- --with-random=openssl)
- PRNG=OPENSSL
- PRNGLIBS=-lcrypto
+ --with-random)
+ case "$value" in
+ getrandom)
+ PRNG=GETRANDOM
+ ;;
+ openssl)
+ PRNG=OPENSSL
+ ;;
+ arc4random)
+ PRNG=ARC4RANDOM
+ ;;
+ esac
;;
- --with-random=arc4random)
- PRNG=ARC4RANDOM
- ;;
- --cflags=*)
+ --cflags)
CFLAGS="$value"
;;
- --ldflags=*)
+ --ldflags)
LDFLAGS="$value"
;;
- --c-compiler=*)
+ --c-compiler)
CC="$value"
;;
- --linker=*)
+ --linker)
LD="$value"
;;
- --runwith=*)
+ --runwith)
RUNWITH="$value"
+ RUNWITH_SET=yes
;;
--no-example-certs)
EXCERTS=
;;
- --compiler-wrapper=*)
+ --compiler-wrapper)
CC="$value $CC"
LD="$value $LD"
;;
*)
- echo "Error: Unknown flag: $1"
- exit 1
+ die "Error: Unknown flag: $1"
;;
esac
shift
@@ -261,72 +338,103 @@ then
fi
fi
-if [ "$PREFIX_SET" = "yes" -a ! "$LIBDIR_SET" = "yes" ]
-then
- LIBDIR=$PREFIX/lib
-fi
-
-find_program() {
- path="$PATH"
- item="$(echo "$path" | sed 's/\([^:]*\):.*/\1/')"
- path="$(echo "$path" | sed -n 's/[^:]*::*\(.*\)/\1/p')"
- found="no"
- while [ "$item" ]
- do
- if [ -f "$item/$1" ]
+detect_lua_version() {
+ detected_lua=`$1 -e 'print(_VERSION:match(" (5%.[123])$"))' 2> /dev/null`
+ if [ "$detected_lua" != "nil" ]
+ then
+ if [ "$LUA_VERSION_SET" != "yes" ]
then
- found="yes"
- break
+ echo "Lua version detected: $detected_lua"
+ LUA_VERSION=$detected_lua
+ return 0
+ elif [ "$LUA_VERSION" = "$detected_lua" ]
+ then
+ return 0
fi
- item="$(echo "$path" | sed 's/\([^:]*\):.*/\1/')"
- path="$(echo "$path" | sed -n 's/[^:]*::*\(.*\)/\1/p')"
- done
- if [ "$found" = "yes" ]
- then
- echo "$item"
- else
- echo ""
fi
+ return 1
}
-if [ "$LUA_SUFFIX_SET" != "yes" ]
-then
- for suffix in "5.1" "51" ""
- do
- LUA_SUFFIX="$suffix"
- if [ "$LUA_DIR_SET" = "yes" ]
+search_interpreter() {
+ suffix="$1"
+ if [ "$LUA_BINDIR_SET" = "yes" ]
then
- if [ -f "$LUA_DIR/bin/lua$suffix" ]
- then
- find_lua="$LUA_DIR"
- fi
- else
- find_lua="$(find_program lua$suffix)"
+ find_lua="$LUA_BINDIR"
+ elif [ "$LUA_DIR_SET" = "yes" ]
+ then
+ LUA_BINDIR="$LUA_DIR/bin"
+ if [ -f "$LUA_BINDIR/lua$suffix" ]
+ then
+ find_lua="$LUA_BINDIR"
fi
- if [ "$find_lua" ]
+ else
+ find_lua=`find_program lua$suffix`
+ fi
+ if [ -n "$find_lua" -a -x "$find_lua/lua$suffix" ]
+ then
+ if detect_lua_version "$find_lua/lua$suffix"
then
echo "Lua interpreter found: $find_lua/lua$suffix..."
- break
+ if [ "$LUA_BINDIR_SET" != "yes" ]
+ then
+ LUA_BINDIR="$find_lua"
+ fi
+ if [ "$LUA_DIR_SET" != "yes" ]
+ then
+ LUA_DIR=`dirname "$find_lua"`
+ fi
+ LUA_SUFFIX="$suffix"
+ return 0
fi
- done
-fi
+ fi
+ return 1
+}
-if [ "$LUA_DIR_SET" != "yes" ]
+lua_interp_found=no
+if [ "$LUA_SUFFIX_SET" != "yes" ]
then
- echo -n "Looking for Lua... "
- if [ ! "$find_lua" ]
+ if [ "$LUA_VERSION_SET" = "yes" -a "$LUA_VERSION" = "5.1" ]
+ then
+ suffixes="5.1 51 -5.1 -51"
+ elif [ "$LUA_VERSION_SET" = "yes" -a "$LUA_VERSION" = "5.2" ]
+ then
+ suffixes="5.2 52 -5.2 -52"
+ elif [ "$LUA_VERSION_SET" = "yes" -a "$LUA_VERSION" = "5.3" ]
then
- find_lua="$(find_program lua$LUA_SUFFIX)"
- echo "lua$LUA_SUFFIX found in \$PATH: $find_lua"
+ suffixes="5.3 53 -5.3 -53"
+ else
+ suffixes="5.1 51 -5.1 -51 5.2 52 -5.2 -52 5.3 53 -5.3 -53"
fi
- if [ "$find_lua" ]
+ for suffix in "" `echo $suffixes`
+ do
+ search_interpreter "$suffix" && {
+ lua_interp_found=yes
+ break
+ }
+done
+else
+ search_interpreter "$LUA_SUFFIX" && {
+ lua_interp_found=yes
+}
+fi
+
+if [ "$lua_interp_found" != "yes" ]
+then
+ [ "$LUA_VERSION_SET" ] && { interp="Lua $LUA_VERSION" ;} || { interp="Lua" ;}
+ [ "$LUA_DIR_SET" -o "$LUA_BINDIR_SET" ] && { where="$LUA_BINDIR" ;} || { interp="\$PATH" ;}
+ echo "$interp interpreter not found in $where"
+ die "You may want to use the flags --with-lua, --with-lua-bin and/or --lua-suffix. See --help."
+fi
+
+if [ "$LUA_VERSION_SET" = "yes" ]
+then
+ echo_n "Checking if $LUA_BINDIR/lua$LUA_SUFFIX is Lua version $LUA_VERSION... "
+ if detect_lua_version "$LUA_BINDIR/lua$LUA_SUFFIX"
then
- LUA_DIR="$(dirname $find_lua)"
- LUA_BINDIR="$find_lua"
+ echo "yes"
else
- echo "lua$LUA_SUFFIX not found in \$PATH."
- echo "You may want to use the flags --with-lua and/or --lua-suffix. See --help."
- exit 1
+ echo "no"
+ die "You may want to use the flags --with-lua, --with-lua-bin and/or --lua-suffix. See --help."
fi
fi
@@ -340,9 +448,69 @@ then
LUA_LIBDIR="$LUA_DIR/lib"
fi
-if [ "$LUA_DIR_SET" = "yes" ]
+echo_n "Checking Lua includes... "
+lua_h="$LUA_INCDIR/lua.h"
+if [ -f "$lua_h" ]
+then
+ echo "lua.h found in $lua_h"
+else
+ v_dir="$LUA_INCDIR/lua/$LUA_VERSION"
+ lua_h="$v_dir/lua.h"
+ if [ -f "$lua_h" ]
+ then
+ echo "lua.h found in $lua_h"
+ LUA_INCDIR="$v_dir"
+ else
+ d_dir="$LUA_INCDIR/lua$LUA_VERSION"
+ lua_h="$d_dir/lua.h"
+ if [ -f "$lua_h" ]
+ then
+ echo "lua.h found in $lua_h (Debian/Ubuntu)"
+ LUA_INCDIR="$d_dir"
+ else
+ echo "lua.h not found (looked in $LUA_INCDIR, $v_dir, $d_dir)"
+ die "You may want to use the flag --with-lua or --with-lua-include. See --help."
+ fi
+ fi
+fi
+
+echo_n "Checking if Lua header version matches that of the interpreter... "
+header_version=$(sed -n 's/.*LUA_VERSION_NUM.*5.\(.\).*/5.\1/p' "$lua_h")
+if [ "$header_version" = "$LUA_VERSION" ]
+then
+ echo "yes"
+else
+ echo "no"
+ echo "lua.h version mismatch (interpreter: $LUA_VERSION; lua.h: $header_version)."
+ die "You may want to use the flag --with-lua or --with-lua-include. See --help."
+fi
+
+echo_n "Configuring for system... "
+if uname -s
+then
+ UNAME_S=`uname -s`
+else
+ die "Could not determine operating system. 'uname -s' failed."
+fi
+echo_n "Configuring for architecture... "
+if uname -m
+then
+ UNAME_M=`uname -m`
+else
+ die "Could not determine processor architecture. 'uname -m' failed."
+fi
+
+if [ "$UNAME_S" = Linux ]
then
- LUA_BINDIR="$LUA_DIR/bin"
+ GCC_ARCH=`gcc -print-multiarch 2>/dev/null`
+ if [ -n "$GCC_ARCH" -a -d "/usr/lib/$GCC_ARCH" ]
+ then
+ MULTIARCH_SUBDIR="lib/$GCC_ARCH"
+ elif [ -d "/usr/lib64" ]
+ then
+ # Useful for Fedora systems
+ MULTIARCH_SUBDIR="lib64"
+ fi
fi
if [ "$IDN_LIBRARY" = "icu" ]
@@ -355,17 +523,18 @@ then
IDNA_LIBS="-l$IDN_LIB"
fi
+if [ -f config.unix ]; then
+ rm -f config.unix
+fi
+
+if [ "$RUNWITH_SET" != yes ]; then
+ RUNWITH="lua$LUA_SUFFIX"
+fi
+
OPENSSL_LIBS="-l$OPENSSL_LIB"
-echo -n "Checking Lua includes... "
-lua_h="$LUA_INCDIR/lua.h"
-if [ -f "$lua_h" ]
-then
- echo "lua.h found in $lua_h"
-else
- echo "lua.h not found (looked in $lua_h)"
- echo "You may want to use the flag --with-lua-include. See --help."
- exit 1
+if [ "$PRNG" = "OPENSSL" ]; then
+ PRNGLIBS=$OPENSSL_LIBS
fi
# Write config
@@ -373,19 +542,23 @@ fi
echo "Writing configuration..."
echo
+rm -f built
cat <<EOF > config.unix
# This file was automatically generated by the configure script.
# Run "./configure --help" for details.
+LUA_VERSION=$LUA_VERSION
PREFIX=$PREFIX
SYSCONFDIR=$SYSCONFDIR
LIBDIR=$LIBDIR
DATADIR=$DATADIR
LUA_SUFFIX=$LUA_SUFFIX
LUA_DIR=$LUA_DIR
+LUA_DIR_SET=$LUA_DIR_SET
LUA_INCDIR=$LUA_INCDIR
LUA_LIBDIR=$LUA_LIBDIR
LUA_BINDIR=$LUA_BINDIR
+MULTIARCH_SUBDIR=$MULTIARCH_SUBDIR
REQUIRE_CONFIG=$REQUIRE_CONFIG
IDN_LIB=$IDN_LIB
IDNA_LIBS=$IDNA_LIBS
diff --git a/plugins/mod_saslauth.lua b/plugins/mod_saslauth.lua
index 68c4fe64..ee468c17 100644
--- a/plugins/mod_saslauth.lua
+++ b/plugins/mod_saslauth.lua
@@ -96,8 +96,19 @@ end)
module:hook_stanza(xmlns_sasl, "failure", function (session, stanza)
if session.type ~= "s2sout_unauthed" or session.external_auth ~= "attempting" then return; end
- module:log("info", "SASL EXTERNAL with %s failed", session.to_host)
- -- TODO: Log the failure reason
+ local text = stanza:get_child_text("text");
+ local condition = "unknown-condition";
+ for child in stanza:childtags() do
+ if child.name ~= "text" then
+ condition = child.name;
+ break;
+ end
+ end
+ if text and condition then
+ condition = connection .. ": " .. text;
+ end
+ module:log("info", "SASL EXTERNAL with %s failed: %s", session.to_host, condition);
+
session.external_auth = "failed"
session:close();
return true;
diff --git a/plugins/mod_websocket.lua b/plugins/mod_websocket.lua
index 47d170a1..3c96f780 100644
--- a/plugins/mod_websocket.lua
+++ b/plugins/mod_websocket.lua
@@ -51,13 +51,17 @@ local sessions = module:shared("c2s/sessions");
local c2s_listener = portmanager.get_service("c2s").listener;
--- Session methods
-local function session_open_stream(session)
+local function session_open_stream(session, from, to)
local attr = {
xmlns = xmlns_framing,
+ ["xml:lang"] = "en",
version = "1.0",
id = session.streamid or "",
- from = session.host
+ from = from or session.host, to = to,
};
+ if session.stream_attrs then
+ session:stream_attrs(from, to, attr)
+ end
session.send(st.stanza("open", attr));
end
diff --git a/util-src/crand.c b/util-src/crand.c
index f3fa00ea..ef9da4d2 100644
--- a/util-src/crand.c
+++ b/util-src/crand.c
@@ -19,6 +19,8 @@
*
*/
+#define _DEFAULT_SOURCE
+
#include "lualib.h"
#include "lauxlib.h"
@@ -26,21 +28,22 @@
#include <errno.h>
#if defined(WITH_GETRANDOM)
+
+#if ! __GLIBC_PREREQ(2,25)
#include <unistd.h>
#include <sys/syscall.h>
-#include <linux/random.h>
#ifndef SYS_getrandom
#error getrandom() requires Linux 3.17 or later
#endif
-/*
- * This acts like a read from /dev/urandom with the exception that it
- * *does* block if the entropy pool is not yet initialized.
- */
-int getrandom(void *buf, size_t len, int flags) {
- return syscall(SYS_getrandom, buf, len, flags);
+/* This wasn't present before glibc 2.25 */
+int getrandom(void *buf, size_t buflen, unsigned int flags) {
+ return syscall(SYS_getrandom, buf, buflen, flags);
}
+#else
+#include <sys/random.h>
+#endif
#elif defined(WITH_ARC4RANDOM)
#include <stdlib.h>
@@ -56,6 +59,10 @@ int Lrandom(lua_State *L) {
void *buf = lua_newuserdata(L, len);
#if defined(WITH_GETRANDOM)
+ /*
+ * This acts like a read from /dev/urandom with the exception that it
+ * *does* block if the entropy pool is not yet initialized.
+ */
ret = getrandom(buf, len, 0);
if(ret < 0) {
diff --git a/util-src/net.c b/util-src/net.c
index 32f69025..35f2c362 100644
--- a/util-src/net.c
+++ b/util-src/net.c
@@ -9,6 +9,7 @@
--
*/
+#define _GNU_SOURCE
#include <stddef.h>
#include <string.h>
#include <errno.h>
diff --git a/util-src/pposix.c b/util-src/pposix.c
index 10edbd71..f9c07e54 100644
--- a/util-src/pposix.c
+++ b/util-src/pposix.c
@@ -15,6 +15,14 @@
#define MODULE_VERSION "0.3.6"
+
+#if defined(__linux__)
+#define _GNU_SOURCE
+#else
+#define _DEFAULT_SOURCE
+#endif
+#define _POSIX_C_SOURCE 200809L
+
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
@@ -40,11 +48,11 @@
#endif
#include <fcntl.h>
-#if defined(__linux__) && defined(_GNU_SOURCE)
+#if defined(__linux__)
#include <linux/falloc.h>
#endif
-#if (defined(_SVID_SOURCE) && !defined(WITHOUT_MALLINFO))
+#if !defined(WITHOUT_MALLINFO)
#include <malloc.h>
#define WITH_MALLINFO
#endif
@@ -663,7 +671,7 @@ int lc_uname(lua_State *L) {
lua_setfield(L, -2, "version");
lua_pushstring(L, uname_info.machine);
lua_setfield(L, -2, "machine");
-#ifdef _GNU_SOURCE
+#ifdef __USE_GNU
lua_pushstring(L, uname_info.domainname);
lua_setfield(L, -2, "domainname");
#endif
@@ -726,7 +734,6 @@ int lc_meminfo(lua_State *L) {
* 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) {
int ret;
off_t offset, len;
@@ -739,7 +746,7 @@ int lc_fallocate(lua_State *L) {
offset = luaL_checkinteger(L, 2);
len = luaL_checkinteger(L, 3);
-#if defined(__linux__) && defined(_GNU_SOURCE)
+#if defined(__linux__)
errno = 0;
ret = fallocate(fileno(f), FALLOC_FL_KEEP_SIZE, offset, len);
@@ -759,10 +766,6 @@ int lc_fallocate(lua_State *L) {
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
ret = posix_fallocate(fileno(f), offset, len);
@@ -784,7 +787,6 @@ int lc_fallocate(lua_State *L) {
return 2;
}
}
-#endif
/* Register functions */
@@ -825,9 +827,7 @@ 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 }
};
@@ -835,6 +835,11 @@ int luaopen_util_pposix(lua_State *L) {
lua_newtable(L);
luaL_setfuncs(L, exports, 0);
+#ifdef ENOENT
+ lua_pushinteger(L, ENOENT);
+ lua_setfield(L, -2, "ENOENT");
+#endif
+
lua_pushliteral(L, "pposix");
lua_setfield(L, -2, "_NAME");
diff --git a/util-src/ringbuffer.c b/util-src/ringbuffer.c
index 831b1fe2..2a13903c 100644
--- a/util-src/ringbuffer.c
+++ b/util-src/ringbuffer.c
@@ -31,7 +31,7 @@ void modpos(ringbuffer *b) {
b->wpos = b->wpos % b->alen;
}
-int find(ringbuffer *b, const char *s, int l) {
+int find(ringbuffer *b, const char *s, size_t l) {
size_t i, j;
int m;
@@ -74,7 +74,7 @@ int rb_find(lua_State *L) {
int rb_read(lua_State *L) {
ringbuffer *b = luaL_checkudata(L, 1, "ringbuffer_mt");
- int r = luaL_checkinteger(L, 2);
+ size_t r = luaL_checkinteger(L, 2);
int peek = lua_toboolean(L, 3);
if(r > b->blen) {
diff --git a/util-src/signal.c b/util-src/signal.c
index a083df54..2cf68800 100644
--- a/util-src/signal.c
+++ b/util-src/signal.c
@@ -26,6 +26,8 @@
* OTHER DEALINGS IN THE SOFTWARE.
*/
+#define _POSIX_C_SOURCE 200809L
+
#include <signal.h>
#include <stdlib.h>
diff --git a/util-src/table.c b/util-src/table.c
index 0e547858..f1cd9e12 100644
--- a/util-src/table.c
+++ b/util-src/table.c
@@ -7,12 +7,11 @@ static int Lcreate_table(lua_State *L) {
}
static int Lpack(lua_State *L) {
- int arg;
unsigned int n_args = lua_gettop(L);
lua_createtable(L, n_args, 1);
lua_insert(L, 1);
- for(arg = n_args; arg >= 1; arg--) {
+ for(int arg = n_args; arg >= 1; arg--) {
lua_rawseti(L, 1, arg);
}
diff --git a/util/datamanager.lua b/util/datamanager.lua
index 585bb83d..2b47c3c4 100644
--- a/util/datamanager.lua
+++ b/util/datamanager.lua
@@ -39,10 +39,12 @@ local function fallocate(f, offset, len)
f:seek("set", offset);
return true;
end;
+local ENOENT = 2;
pcall(function()
local pposix = require "util.pposix";
raw_mkdir = pposix.mkdir or raw_mkdir; -- Doesn't trample on umask
fallocate = pposix.fallocate or fallocate;
+ ENOENT = pposix.ENOENT or ENOENT;
end);
local _ENV = nil;
@@ -122,8 +124,12 @@ local function getpath(username, host, datastore, ext, create)
end
local function load(username, host, datastore)
- local data, err = envloadfile(getpath(username, host, datastore), {});
+ local data, err, errno = envloadfile(getpath(username, host, datastore), {});
if not data then
+ if errno == ENOENT then
+ -- No such file, ok to ignore
+ return nil;
+ end
local mode = lfs.attributes(getpath(username, host, datastore), "mode");
if not mode then
log("debug", "Assuming empty %s storage ('%s') for user: %s@%s", datastore, err, username or "nil", host or "nil");
@@ -145,9 +151,9 @@ end
local function atomic_store(filename, data)
local scratch = filename.."~";
- local f, ok, msg;
+ local f, ok, msg, errno;
- f, msg = io_open(scratch, "w");
+ f, msg, errno = io_open(scratch, "w");
if not f then
return nil, msg;
end
@@ -222,11 +228,8 @@ local function append(username, host, datastore, ext, data)
local ok;
local f, msg = io_open(filename, "r+");
if not f then
+ return atomic_store(filename, data);
-- File did probably not exist, let's create it
- f, msg = io_open(filename, "w");
- if not f then
- return nil, msg, "open";
- end
end
local pos = f:seek("end");
@@ -295,8 +298,12 @@ end
local function list_load(username, host, datastore)
local items = {};
- local data, err = envloadfile(getpath(username, host, datastore, "list"), {item = function(i) t_insert(items, i); end});
+ local data, err, errno = envloadfile(getpath(username, host, datastore, "list"), {item = function(i) t_insert(items, i); end});
if not data then
+ if errno == ENOENT then
+ -- No such file, ok to ignore
+ return nil;
+ end
local mode = lfs.attributes(getpath(username, host, datastore, "list"), "mode");
if not mode then
log("debug", "Assuming empty %s storage ('%s') for user: %s@%s", datastore, err, username or "nil", host or "nil");
@@ -408,6 +415,7 @@ return {
load = load;
store = store;
append_raw = append;
+ store_raw = atomic_store;
list_append = list_append;
list_store = list_store;
list_load = list_load;
diff --git a/util/envload.lua b/util/envload.lua
index 3c5190df..926f20c0 100644
--- a/util/envload.lua
+++ b/util/envload.lua
@@ -6,7 +6,8 @@
--
-- luacheck: ignore 113/setfenv
-local load, loadstring, loadfile, setfenv = load, loadstring, loadfile, setfenv;
+local load, loadstring, setfenv = load, loadstring, setfenv;
+local io_open = io.open;
local envload;
local envloadfile;
@@ -18,7 +19,10 @@ if setfenv then
end
function envloadfile(file, env)
- local f, err = loadfile(file);
+ local fh, err, errno = io_open(file);
+ if not fh then return fh, err, errno; end
+ local f, err = load(function () return fh:read(2048); end, "@"..file);
+ fh:close();
if f and env then setfenv(f, env); end
return f, err;
end
@@ -28,7 +32,11 @@ else
end
function envloadfile(file, env)
- return loadfile(file, nil, env);
+ local fh, err, errno = io_open(file);
+ if not fh then return fh, err, errno; end
+ local f, err = load(fh:lines(2048), "@"..file, nil, env);
+ fh:close();
+ return f, err;
end
end