Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Sat, 26 Apr 2014 23:02:54 +0000 (01:02 +0200)
committerKim Alvefur <zash@zash.se>
Sat, 26 Apr 2014 23:02:54 +0000 (01:02 +0200)
util-src/pposix.c
util/x509.lua

index 73e0d6e390e145be2d2080b67103462d99c56ab8..9b3e97eb772b6756d76e598376e3d49ba8b67893 100644 (file)
@@ -674,6 +674,7 @@ int lc_meminfo(lua_State* L)
 #if _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L || defined(_GNU_SOURCE)
 int lc_fallocate(lua_State* L)
 {
+       int ret;
        off_t offset, len;
        FILE *f = *(FILE**) luaL_checkudata(L, 1, LUA_FILEHANDLE);
        if (f == NULL)
@@ -683,11 +684,15 @@ int lc_fallocate(lua_State* L)
        len = luaL_checkinteger(L, 3);
 
 #if defined(__linux__) && defined(_GNU_SOURCE)
-       if(fallocate(fileno(f), FALLOC_FL_KEEP_SIZE, offset, len) == 0)
+       errno = 0;
+       ret = fallocate(fileno(f), FALLOC_FL_KEEP_SIZE, offset, len);
+       if(ret == 0)
        {
                lua_pushboolean(L, 1);
                return 1;
        }
+       /* Some old versions of Linux apparently use the return value instead of errno */
+       if(errno == 0) errno = ret;
 
        if(errno != ENOSYS && errno != EOPNOTSUPP)
        {
@@ -701,7 +706,8 @@ int lc_fallocate(lua_State* L)
 #warning Note that posix_fallocate() will still be used on filesystems that dont support fallocate()
 #endif
 
-       if(posix_fallocate(fileno(f), offset, len) == 0)
+       ret = posix_fallocate(fileno(f), offset, len);
+       if(ret == 0)
        {
                lua_pushboolean(L, 1);
                return 1;
@@ -709,7 +715,7 @@ int lc_fallocate(lua_State* L)
        else
        {
                lua_pushnil(L);
-               lua_pushstring(L, strerror(errno));
+               lua_pushstring(L, strerror(ret));
                /* 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);
index 857f02a409087e3dc8716ca2e4c8ba6f91ae9d82..5e1b49e501d3945fcce38593227b62649703d531 100644 (file)
 
 local nameprep = require "util.encodings".stringprep.nameprep;
 local idna_to_ascii = require "util.encodings".idna.to_ascii;
+local base64 = require "util.encodings".base64;
 local log = require "util.logger".init("x509");
-local pairs, ipairs = pairs, ipairs;
 local s_format = string.format;
-local t_insert = table.insert;
-local t_concat = table.concat;
 
 module "x509"
 
@@ -214,4 +212,23 @@ function verify_identity(host, service, cert)
        return false
 end
 
+local pat = "%-%-%-%-%-BEGIN ([A-Z ]+)%-%-%-%-%-\r?\n"..
+"([0-9A-Za-z+/=\r\n]*)\r?\n%-%-%-%-%-END %1%-%-%-%-%-";
+
+function pem2der(pem)
+       local typ, data = pem:match(pat);
+       if typ and data then
+               return base64.decode(data), typ;
+       end
+end
+
+local wrap = ('.'):rep(64);
+local envelope = "-----BEGIN %s-----\n%s\n-----END %s-----\n"
+
+function der2pem(data, typ)
+       typ = typ and typ:upper() or "CERTIFICATE";
+       data = base64.encode(data);
+       return s_format(envelope, typ, data:gsub(wrap, '%0\n', (#data-1)/64), typ);
+end
+
 return _M;