Changeset

7944:36a9a4af1873

Merge 0.10->trunk
author Kim Alvefur <zash@zash.se>
date Thu, 02 Mar 2017 23:03:02 +0100
parents 7923:81f3068fc30c (current diff) 7943:da791f11e20c (diff)
children 7946:c92102fe409b
files
diffstat 11 files changed, 361 insertions(+), 143 deletions(-) [+]
line wrap: on
line diff
--- a/configure	Wed Mar 01 02:38:05 2017 +0100
+++ b/configure	Thu Mar 02 23:03:02 2017 +0100
@@ -21,7 +21,7 @@
 PRNG=
 PRNGLIBS=
 
-CFLAGS="-fPIC -Wall -pedantic -std=c89"
+CFLAGS="-fPIC -Wall -pedantic -std=c99"
 LDFLAGS="-shared"
 
 IDN_LIBRARY="idn"
@@ -42,10 +42,15 @@
                             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 @@
 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
-   value="$(echo "$1" | sed 's/[^=]*=\(.*\)/\1/')"
-   if echo "$value" | grep -q "~"
+      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/'`"
+   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 @@
             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 @@
          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 @@
          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 @@
             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)
+      case "$value" in
+         getrandom)
+            PRNG=GETRANDOM
+            ;;
+         openssl)
+            PRNG=OPENSSL
+            ;;
+         arc4random)
+            PRNG=ARC4RANDOM
+            ;;
+      esac
       ;;
-  --with-random=openssl)
-      PRNG=OPENSSL
-      PRNGLIBS=-lcrypto
-      ;;
-  --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 @@
    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
 }
 
+search_interpreter() {
+   suffix="$1"
+   if [ "$LUA_BINDIR_SET" = "yes" ]
+      then
+      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
+   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..."
+         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
+   fi
+   return 1
+}
+
+lua_interp_found=no
 if [ "$LUA_SUFFIX_SET" != "yes" ]
 then
-   for suffix in "5.1" "51" ""
+   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
+      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
+   for suffix in "" `echo $suffixes`
    do
-      LUA_SUFFIX="$suffix"
-      if [ "$LUA_DIR_SET" = "yes" ]
-      then
-         if [ -f "$LUA_DIR/bin/lua$suffix" ]
-         then
-            find_lua="$LUA_DIR"
-         fi
-      else
-         find_lua="$(find_program lua$suffix)"
-      fi
-      if [ "$find_lua" ]
-      then
-         echo "Lua interpreter found: $find_lua/lua$suffix..."
-         break
-      fi
-   done
+      search_interpreter "$suffix" && {
+      lua_interp_found=yes
+      break
+   }
+done
+else
+   search_interpreter "$LUA_SUFFIX" && {
+   lua_interp_found=yes
+}
 fi
 
-if [ "$LUA_DIR_SET" != "yes" ]
+if [ "$lua_interp_found" != "yes" ]
 then
-   echo -n "Looking for Lua... "
-   if [ ! "$find_lua" ]
+   [ "$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
-      find_lua="$(find_program lua$LUA_SUFFIX)"
-      echo "lua$LUA_SUFFIX found in \$PATH: $find_lua"
-   fi
-   if [ "$find_lua" ]
-   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 @@
    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
-   LUA_BINDIR="$LUA_DIR/bin"
+   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
+   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 @@
    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 @@
 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
--- a/plugins/mod_saslauth.lua	Wed Mar 01 02:38:05 2017 +0100
+++ b/plugins/mod_saslauth.lua	Thu Mar 02 23:03:02 2017 +0100
@@ -96,8 +96,19 @@
 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;
--- a/plugins/mod_websocket.lua	Wed Mar 01 02:38:05 2017 +0100
+++ b/plugins/mod_websocket.lua	Thu Mar 02 23:03:02 2017 +0100
@@ -51,13 +51,17 @@
 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
 
--- a/util-src/crand.c	Wed Mar 01 02:38:05 2017 +0100
+++ b/util-src/crand.c	Thu Mar 02 23:03:02 2017 +0100
@@ -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 @@
 	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) {
--- a/util-src/net.c	Wed Mar 01 02:38:05 2017 +0100
+++ b/util-src/net.c	Thu Mar 02 23:03:02 2017 +0100
@@ -9,6 +9,7 @@
 --
 */
 
+#define _GNU_SOURCE
 #include <stddef.h>
 #include <string.h>
 #include <errno.h>
--- a/util-src/pposix.c	Wed Mar 01 02:38:05 2017 +0100
+++ b/util-src/pposix.c	Thu Mar 02 23:03:02 2017 +0100
@@ -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 @@
 	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 @@
  * 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 @@
 	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 @@
 		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 @@
 		return 2;
 	}
 }
-#endif
 
 /* Register functions */
 
@@ -825,9 +827,7 @@
 		{ "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 @@
 	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");
 
--- a/util-src/ringbuffer.c	Wed Mar 01 02:38:05 2017 +0100
+++ b/util-src/ringbuffer.c	Thu Mar 02 23:03:02 2017 +0100
@@ -31,7 +31,7 @@
 	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_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) {
--- a/util-src/signal.c	Wed Mar 01 02:38:05 2017 +0100
+++ b/util-src/signal.c	Thu Mar 02 23:03:02 2017 +0100
@@ -26,6 +26,8 @@
  * OTHER DEALINGS IN THE SOFTWARE.
 */
 
+#define _POSIX_C_SOURCE 200809L
+
 #include <signal.h>
 #include <stdlib.h>
 
--- a/util-src/table.c	Wed Mar 01 02:38:05 2017 +0100
+++ b/util-src/table.c	Thu Mar 02 23:03:02 2017 +0100
@@ -7,12 +7,11 @@
 }
 
 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);
 	}
 
--- a/util/datamanager.lua	Wed Mar 01 02:38:05 2017 +0100
+++ b/util/datamanager.lua	Thu Mar 02 23:03:02 2017 +0100
@@ -39,10 +39,12 @@
 	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 @@
 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 @@
 
 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 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 @@
 
 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 @@
 	load = load;
 	store = store;
 	append_raw = append;
+	store_raw = atomic_store;
 	list_append = list_append;
 	list_store = list_store;
 	list_load = list_load;
--- a/util/envload.lua	Wed Mar 01 02:38:05 2017 +0100
+++ b/util/envload.lua	Thu Mar 02 23:03:02 2017 +0100
@@ -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 @@
 	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 @@
 	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