Skip to content
Snippets Groups Projects
Verified Commit 2fe4bd83 authored by Michal Hrusecky's avatar Michal Hrusecky :mouse:
Browse files

knot-resolver{,6}: Fix lua on 32-bit systems with 64-bit time_t

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.
parent 565e659a
No related branches found
No related tags found
1 merge request!708knot-resolver{,6}: Fix lua on 32-bit systems with 64-bit time_t
Pipeline #123140 failed
From 795b790adf7a2c057f5b59de49fa4e62b22e63f1 Mon Sep 17 00:00:00 2001
From: Michal Hrusecky <michal.hrusecky@turris.com>
Date: Wed, 6 Mar 2024 15:22:08 +0100
Subject: [PATCH] knot-resolver{,6}: Fix lua on 32-bit systems with 64-bit
time_t
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.
---
.../patches/040-lua_time_t.patch | 140 ++++++++++++++++++
.../patches/040-lua_time_t.patch | 140 ++++++++++++++++++
2 files changed, 280 insertions(+)
create mode 100644 net/knot-resolver/patches/040-lua_time_t.patch
create mode 100644 net/knot-resolver6/patches/040-lua_time_t.patch
diff --git a/net/knot-resolver/patches/040-lua_time_t.patch b/net/knot-resolver/patches/040-lua_time_t.patch
new file mode 100644
index 000000000..461748d81
--- /dev/null
+++ b/net/knot-resolver/patches/040-lua_time_t.patch
@@ -0,0 +1,140 @@
+From 6261af1cd54339ba7d8944c539a12912f1571eff Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= <vladimir.cunat@nic.cz>
+Date: Wed, 6 Mar 2024 12:19:28 +0100
+Subject: [PATCH] daemon/lua: fix on 32-bit systems with 64-bit time_t
+
+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.
+---
+ daemon/lua/kres-gen-30.lua | 7 ++++---
+ daemon/lua/kres-gen-31.lua | 7 ++++---
+ daemon/lua/kres-gen-32.lua | 7 ++++---
+ daemon/lua/kres-gen.sh | 15 +++++++++------
+ daemon/lua/meson.build | 19 ++++++++++++++++---
+ 6 files changed, 45 insertions(+), 18 deletions(-)
+
+diff --git a/daemon/lua/kres-gen-30.lua b/daemon/lua/kres-gen-30.lua
+index 7639e797e..f3f8a499c 100644
+--- a/daemon/lua/kres-gen-30.lua
++++ b/daemon/lua/kres-gen-30.lua
+@@ -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;
+diff --git a/daemon/lua/kres-gen-31.lua b/daemon/lua/kres-gen-31.lua
+index e555a6a07..46b349ea1 100644
+--- a/daemon/lua/kres-gen-31.lua
++++ b/daemon/lua/kres-gen-31.lua
+@@ -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;
+diff --git a/daemon/lua/kres-gen-32.lua b/daemon/lua/kres-gen-32.lua
+index 31a5c5dde..88b50ded0 100644
+--- a/daemon/lua/kres-gen-32.lua
++++ b/daemon/lua/kres-gen-32.lua
+@@ -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;
+diff --git a/daemon/lua/kres-gen.sh b/daemon/lua/kres-gen.sh
+index 70afb408b..3befd5dae 100755
+--- a/daemon/lua/kres-gen.sh
++++ b/daemon/lua/kres-gen.sh
+@@ -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
+
+diff --git a/daemon/lua/meson.build b/daemon/lua/meson.build
+index b19777c2d..6df5bc5b2 100644
+--- a/daemon/lua/meson.build
++++ b/daemon/lua/meson.build
+@@ -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
+--
+GitLab
+
diff --git a/net/knot-resolver6/patches/040-lua_time_t.patch b/net/knot-resolver6/patches/040-lua_time_t.patch
new file mode 100644
index 000000000..461748d81
--- /dev/null
+++ b/net/knot-resolver6/patches/040-lua_time_t.patch
@@ -0,0 +1,140 @@
+From 6261af1cd54339ba7d8944c539a12912f1571eff Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Vladim=C3=ADr=20=C4=8Cun=C3=A1t?= <vladimir.cunat@nic.cz>
+Date: Wed, 6 Mar 2024 12:19:28 +0100
+Subject: [PATCH] daemon/lua: fix on 32-bit systems with 64-bit time_t
+
+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.
+---
+ daemon/lua/kres-gen-30.lua | 7 ++++---
+ daemon/lua/kres-gen-31.lua | 7 ++++---
+ daemon/lua/kres-gen-32.lua | 7 ++++---
+ daemon/lua/kres-gen.sh | 15 +++++++++------
+ daemon/lua/meson.build | 19 ++++++++++++++++---
+ 6 files changed, 45 insertions(+), 18 deletions(-)
+
+diff --git a/daemon/lua/kres-gen-30.lua b/daemon/lua/kres-gen-30.lua
+index 7639e797e..f3f8a499c 100644
+--- a/daemon/lua/kres-gen-30.lua
++++ b/daemon/lua/kres-gen-30.lua
+@@ -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;
+diff --git a/daemon/lua/kres-gen-31.lua b/daemon/lua/kres-gen-31.lua
+index e555a6a07..46b349ea1 100644
+--- a/daemon/lua/kres-gen-31.lua
++++ b/daemon/lua/kres-gen-31.lua
+@@ -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;
+diff --git a/daemon/lua/kres-gen-32.lua b/daemon/lua/kres-gen-32.lua
+index 31a5c5dde..88b50ded0 100644
+--- a/daemon/lua/kres-gen-32.lua
++++ b/daemon/lua/kres-gen-32.lua
+@@ -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;
+diff --git a/daemon/lua/kres-gen.sh b/daemon/lua/kres-gen.sh
+index 70afb408b..3befd5dae 100755
+--- a/daemon/lua/kres-gen.sh
++++ b/daemon/lua/kres-gen.sh
+@@ -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
+
+diff --git a/daemon/lua/meson.build b/daemon/lua/meson.build
+index b19777c2d..6df5bc5b2 100644
+--- a/daemon/lua/meson.build
++++ b/daemon/lua/meson.build
+@@ -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
+--
+GitLab
+
--
2.44.0
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment