]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/lua: fix on 32-bit systems with 64-bit time_t docs-develop-time-t0zmsd/deployments/3550
authorVladimír Čunát <vladimir.cunat@nic.cz>
Wed, 6 Mar 2024 11:19:28 +0000 (12:19 +0100)
committerOto Šťáva <oto.stava@nic.cz>
Fri, 22 Mar 2024 10:40:02 +0000 (11:40 +0100)
This improves the heuristics.
The problem would be detected by meson, but not when cross-compiling,
in which case things would mostly run OK, except some lua code/modules.

NEWS
daemon/lua/kres-gen-30.lua
daemon/lua/kres-gen-31.lua
daemon/lua/kres-gen-32.lua
daemon/lua/kres-gen.sh
daemon/lua/meson.build

diff --git a/NEWS b/NEWS
index dd8137abf0a08e82b1e182315d65fa04a2e25b74..2288b377b3637769feead7942a2c80f0b5116e41 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,11 @@
+Knot Resolver 5.7.2 (2024-0m-dd)
+================================
+
+Bugfixes
+--------
+- fix on 32-bit systems with 64-bit time_t (!1510)
+
+
 Knot Resolver 5.7.1 (2024-02-13)
 ================================
 
index 7639e797e09d359866095213372a1e5338595919..f3f8a499c8f7070829e4c98829ec8f428c28e240 100644 (file)
@@ -2,9 +2,10 @@
 
 local ffi = require('ffi')
 --[[ This file is generated by ./kres-gen.sh ]] ffi.cdef[[
-typedef long time_t;
-typedef long __time_t;
-typedef long __suseconds_t;
+
+typedef @time_t@ time_t;
+typedef @time_t@ __time_t;
+typedef @time_t@ __suseconds_t;
 struct timeval {
        __time_t tv_sec;
        __suseconds_t tv_usec;
index e555a6a07ed01a9d86c615b97ce3b5893dcf6f0d..46b349ea1aa48dd5f45fcf1e2da0aa005020ff63 100644 (file)
@@ -2,9 +2,10 @@
 
 local ffi = require('ffi')
 --[[ This file is generated by ./kres-gen.sh ]] ffi.cdef[[
-typedef long time_t;
-typedef long __time_t;
-typedef long __suseconds_t;
+
+typedef @time_t@ time_t;
+typedef @time_t@ __time_t;
+typedef @time_t@ __suseconds_t;
 struct timeval {
        __time_t tv_sec;
        __suseconds_t tv_usec;
index 31a5c5dde1e7ca4afaa6c90277943c66ea6e6ced..88b50ded0ed20da587d6a63cbf5b15c0b8a0dc77 100644 (file)
@@ -2,9 +2,10 @@
 
 local ffi = require('ffi')
 --[[ This file is generated by ./kres-gen.sh ]] ffi.cdef[[
-typedef long time_t;
-typedef long __time_t;
-typedef long __suseconds_t;
+
+typedef @time_t@ time_t;
+typedef @time_t@ __time_t;
+typedef @time_t@ __suseconds_t;
 struct timeval {
        __time_t tv_sec;
        __suseconds_t tv_usec;
index 70afb408b297e81185313c50ecc478d2ad030da1..3befd5dae45e9bbb8909e8bf16984a67aca30944 100755 (executable)
@@ -53,12 +53,15 @@ printf -- "local ffi = require('ffi')\n"
 printf -- "--[[ This file is generated by ./kres-gen.sh ]] ffi.cdef[[\n"
 
 # Some system dependencies.  TODO: this generated part isn't perfectly portable.
-${CDEFS} ${LIBKRES} types <<-EOF
-       typedef time_t
-       __time_t
-       __suseconds_t
-       struct timeval
-EOF
+printf "
+typedef @time_t@ time_t;
+typedef @time_t@ __time_t;
+typedef @time_t@ __suseconds_t;
+struct timeval {
+       __time_t tv_sec;
+       __suseconds_t tv_usec;
+};
+"
 
 ## Various types (mainly), from libknot and libkres
 
index b19777c2d4e99b99abefbf8ddf35d9b59dbf3f37..6df5bc5b2fcaf2aa137bd681f88ec0d8fdf9784d 100644 (file)
@@ -47,10 +47,23 @@ else
   kres_gen_fname = 'kres-gen-30.lua'
 endif
 
+# Exact types around time_t aren't easy to detect, but at least we need the same size.
+time_t_size = meson.get_compiler('c').sizeof('time_t', prefix: '#include <sys/time.h>')
+kres_gen_config = {}
+foreach t: [ 'long', 'long long' ]
+  if meson.get_compiler('c').sizeof(t) == time_t_size
+    kres_gen_config = { 'time_t': t }
+    break
+  endif
+endforeach
+if kres_gen_config == {}
+  error('Unexpected sizeof(time_t) == @0@'.format(time_t_size))
+endif
+
 kres_gen_lua = configure_file(
   input: kres_gen_fname,
   output: 'kres-gen.lua',
-  copy: true,
+  configuration: kres_gen_config,
 )
 
 run_target(  # run manually to re-generate kres-gen.lua
@@ -72,9 +85,9 @@ if get_option('kres_gen_test') and not meson.is_cross_build()
   ]
   # Construct the lua tester as a meson string.
   kres_gen_test_luastr = '''
-    dofile('@0@')
+    dofile('@0@/../../@1@')
     local ffi = require('ffi')
-  '''.format(meson.current_source_dir() / kres_gen_fname)
+  '''.format(meson.current_build_dir(), kres_gen_lua)
   foreach ttc: types_to_check
     # We're careful with adding just includes; otherwise it's more fragile (e.g. linking flags).
     if 'dep' in ttc