From 2d3cf76ffcf3a9c804f7904334cfb8736dd03420 Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Mon, 9 Feb 2026 22:17:39 -0400 Subject: [PATCH 1/6] Jank test: allow specifying remote port 12345 was hard-coded, but that's a bit annoying: this allows adding `:8888` (or whatever you want) to control the mapped remote port. --- contrib/libsession-router_jank_test.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/contrib/libsession-router_jank_test.cpp b/contrib/libsession-router_jank_test.cpp index 4740afba6..da0679c0e 100644 --- a/contrib/libsession-router_jank_test.cpp +++ b/contrib/libsession-router_jank_test.cpp @@ -6,6 +6,7 @@ #include #include #include +#include extern "C" { @@ -18,7 +19,7 @@ int main(int argc, char** argv) { if (argc <= 1) { - std::cerr << "USAGE: " << argv[0] << " {PUBKEY.sesh | PUBKEY.snode | ONS.loki}\n"; + std::cerr << "USAGE: " << argv[0] << " {PUBKEY.sesh | PUBKEY.snode | ONS.loki}[:REMOTEPORT]\n"; return 1; } @@ -32,6 +33,12 @@ int main(int argc, char** argv) std::string target{argv[1]}; + int port = 12345; // Default, but updated if target ends with :PORT + if (std::smatch m; std::regex_match(target, m, std::regex{"(.*):(\\d+)$"})) { + port = std::stoi(m[2]); + target = m[1]; + } + auto srouter = std::make_unique(std::filesystem::path{"jank.ini"}); std::promise prom; @@ -83,12 +90,12 @@ int main(int argc, char** argv) srouter->establish_udp( target, - 12345, - [&prom, &start](auto udp_info) { + port, + [&prom, &start, &port](auto udp_info) { std::cout << "\n\x1b[32;1mSession established (" << std::chrono::round(std::chrono::steady_clock::now() - start).count() - << "ms); UDP bound to port [::1]:" << udp_info.local_port << "\x1b[0m\n\n" + << "ms); remote UDP port " << port << " bound to local port [::1]:" << udp_info.local_port << "\x1b[0m\n\n" << std::flush; prom.set_value(); }, @@ -133,7 +140,7 @@ int main(int argc, char** argv) << " Ctrl-C -- shut down\x1b[0m\n\n\n"; /* - srouter.map_tcp_remote_port(std::string{argv[1]}, 12345, + srouter.map_tcp_remote_port(std::string{argv[1]}, port, [&](auto tunnel_info) { std::cout << "\n\nTCP bound to port " << tunnel_info.local_port << "\n\n"; }, @@ -151,12 +158,12 @@ int main(int argc, char** argv) { case SIGHUP: std::cout << "\n\n\n\x1b[33;1mHangup signal received; closing UDP tunnel\x1b[0m\n\n\n"; - srouter->close_udp(target, 12345); + srouter->close_udp(target, port); break; case SIGUSR1: { std::cout << "\n\n\n\x1b[32;1mSIGUSR1 received: (re-)opening UDP tunnel\x1b[0m\n"; - auto ti = srouter->establish_udp(target, 12345); + auto ti = srouter->establish_udp(target, port); std::cout << "\n\x1b[32;1mUDP bound to port " << ti.local_port << "\x1b[0m\n\n"; break; } From 12ac953f7b4650763895550c359da75bbcc1da27 Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Fri, 13 Feb 2026 16:52:57 -0400 Subject: [PATCH 2/6] Bump clang versions For 21+, we have to ensure we don't use system oxenc because clang 21 breaks in all sorts of ways with the system fmt 10. It appears that we also need the associated llvm-N package installed for the build to succeed, so this adds that as well. --- .drone.jsonnet | 15 +++++++++------ external/oxen-libquic | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.drone.jsonnet b/.drone.jsonnet index 58aead638..834f71a89 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -284,14 +284,17 @@ local deb_builder(image, distro, distro_branch, arch='amd64', oxen_repo=oxen_rep local clang(version) = debian_pipeline( 'Debian sid/clang-' + version, docker_base + 'debian-sid-clang', - deps=default_deps(add='clang-' + version, remove='g++'), - cmake_extra='-DCMAKE_C_COMPILER=clang-' + version + ' -DCMAKE_CXX_COMPILER=clang++-' + version + ' ' + deps=default_deps(add=['clang-' + version, 'llvm-' + version], remove='g++'), + cmake_extra='-DCMAKE_C_COMPILER=clang-' + version + ' -DCMAKE_CXX_COMPILER=clang++-' + version + ( + // clang-21 breaks lots of things in fmt 10, so we have to avoid it. + if version >= 21 then ' -DFORCE_OXENLOGGING_SUBMODULE=ON -DOXEN_LOGGING_FORCE_SUBMODULES=ON ' else ' ' + ) ); local full_llvm(version) = debian_pipeline( 'Debian sid/llvm-' + version, docker_base + 'debian-sid-clang', - deps=default_deps(add=['clang-' + version, ' lld-' + version, ' libc++-' + version + '-dev', 'libc++abi-' + version + '-dev', 'libunwind-' + version + '-dev', 'libngtcp2-crypto-gnutls-dev', 'libngtcp2-dev'], + deps=default_deps(add=['clang-' + version, 'llvm-' + version, 'lld-' + version, 'libc++-' + version + '-dev', 'libc++abi-' + version + '-dev', 'libunwind-' + version + '-dev', 'libngtcp2-crypto-gnutls-dev', 'libngtcp2-dev'], remove='g++'), oxen_repo=[], cmake_extra='-DCMAKE_C_COMPILER=clang-' + version + @@ -301,7 +304,7 @@ local full_llvm(version) = debian_pipeline( '-DCMAKE_' + type + '_LINKER_FLAGS=-fuse-ld=lld-' + version for type in ['EXE', 'MODULE', 'SHARED'] ]) + - ' -DOXEN_LOGGING_FORCE_SUBMODULES=ON' + ' -DFORCE_OXENLOGGING_SUBMODULE=ON -DOXEN_LOGGING_FORCE_SUBMODULES=ON ' ); // Macos build @@ -394,10 +397,10 @@ local docs_pipeline(name, image, extra_cmds=[], allow_fail=false) = { debian_pipeline('Debian sid/debug', docker_base + 'debian-sid', build_type='Debug'), debian_pipeline('Debian sid/debug [arm64]', docker_base + 'debian-sid', build_type='Debug', arch='arm64', jobs=4), - clang(17), - full_llvm(17), clang(19), full_llvm(19), + clang(21), + full_llvm(21), debian_pipeline('Debian testing', docker_base + 'debian-forky'), debian_pipeline('Debian testing [i386]', docker_base + 'debian-forky/i386'), diff --git a/external/oxen-libquic b/external/oxen-libquic index 9c813b93e..33805caeb 160000 --- a/external/oxen-libquic +++ b/external/oxen-libquic @@ -1 +1 @@ -Subproject commit 9c813b93e4bc9779f208989d3438b599506e61db +Subproject commit 33805caebe28d1b6ce02c21587aec184fd894f00 From 83455225fdc97ae112f4c06e3ee8f937b282772e Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Mon, 23 Feb 2026 19:44:52 -0400 Subject: [PATCH 3/6] replaced deprecated exec_program call --- CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb279f080..bc318b46b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -245,8 +245,12 @@ unset(GIT_VERSION) unset(GIT_VERSION_REAL) if(NOT GIT_VERSION) - exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "rev-parse --short HEAD" OUTPUT_VARIABLE GIT_VERSION_UNSTRIP) - string(STRIP "${GIT_VERSION_UNSTRIP}" GIT_VERSION) + execute_process( + COMMAND git rev-parse --short HEAD + WOKRING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE GIT_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) endif() string(REGEX REPLACE "^fatal.*$" nogit GIT_VERSION_REAL "${GIT_VERSION}") From 63f86cc468f71943e7d50142e96d4b55b313e560 Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Mon, 23 Feb 2026 20:22:34 -0400 Subject: [PATCH 4/6] Fix LTO mismatch Some components are using WITH_LTO and others are using USE_LTO, and so we can end up with a static library needing LTO linking to one that doesn't, which leads to build failures (particularly with clang). --- .drone.jsonnet | 1 + 1 file changed, 1 insertion(+) diff --git a/.drone.jsonnet b/.drone.jsonnet index 834f71a89..d37dde8ff 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -107,6 +107,7 @@ local debian_pipeline(name, '-DWARN_DEPRECATED=OFF ' + (if werror then '-DWARNINGS_AS_ERRORS=ON ' else '') + '-DWITH_LTO=' + (if lto then 'ON ' else 'OFF ') + + '-DUSE_LTO=' + (if lto then 'ON ' else 'OFF ') + '-DWITH_TESTS=' + (if tests then 'ON ' else 'OFF ') + cmake_extra + ci_dep_mirror(local_mirror), From 5c235362028e12a4e8f7e3ac4cc4453b5ffb0ccf Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Mon, 23 Feb 2026 21:51:52 -0400 Subject: [PATCH 5/6] Update to latest libquic --- external/oxen-libquic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/oxen-libquic b/external/oxen-libquic index 33805caeb..13f490c0e 160000 --- a/external/oxen-libquic +++ b/external/oxen-libquic @@ -1 +1 @@ -Subproject commit 33805caebe28d1b6ce02c21587aec184fd894f00 +Subproject commit 13f490c0ea9ea13ffb38e41f05835229f1529b46 From 1063dafd0e84d9ffacb1d722e04e6cbd541ced2c Mon Sep 17 00:00:00 2001 From: Jason Rhinelander Date: Mon, 23 Feb 2026 20:33:31 -0400 Subject: [PATCH 6/6] Privatize libevent usage We don't declare libevent a PUBLIC link target, and so we mustn't include its headers in .hpp files. This fixes it with forward declarations/typedef in the .hpp, moving the actual includes to the cpp. --- src/dns/listener.cpp | 2 ++ src/ev/tcp.cpp | 7 +++++++ src/ev/tcp.hpp | 20 ++++++++++++-------- src/session/session.cpp | 1 + 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/dns/listener.cpp b/src/dns/listener.cpp index 0c5861264..cabf9d725 100644 --- a/src/dns/listener.cpp +++ b/src/dns/listener.cpp @@ -3,6 +3,8 @@ #include "router/router.hpp" #include "util/logging.hpp" +#include +#include #include #include diff --git a/src/ev/tcp.cpp b/src/ev/tcp.cpp index cbe917365..89c186051 100644 --- a/src/ev/tcp.cpp +++ b/src/ev/tcp.cpp @@ -1,10 +1,17 @@ #include "tcp.hpp" #include "net/ip_packet.hpp" +#include "util/logging.hpp" #include "util/logging/buffer.hpp" +#include +#include +#include + namespace srouter { + static_assert(std::same_as); + static auto logcat = oxen::log::Cat("ev-tcp"); constexpr auto evconnlistener_deleter = [](::evconnlistener *e) { diff --git a/src/ev/tcp.hpp b/src/ev/tcp.hpp index c0d1d9187..c86c63fe8 100644 --- a/src/ev/tcp.hpp +++ b/src/ev/tcp.hpp @@ -1,16 +1,13 @@ #pragma once -#include "util/logging.hpp" - #include #include extern "C" { #include -#include -#include -#include + struct bufferevent; + struct evconnlistener; } namespace srouter @@ -21,7 +18,14 @@ namespace srouter struct TCPConnection { - TCPConnection(bufferevent* _bev, evutil_socket_t _fd, std::shared_ptr _s); + // This should be a evutil_socket_t; we check in the .cpp: +#ifdef _WIN32 + using fd_t = intptr_t; +#else + using fd_t = int; +#endif + + TCPConnection(bufferevent* _bev, fd_t _fd, std::shared_ptr _s); TCPConnection() = delete; @@ -34,7 +38,7 @@ namespace srouter ~TCPConnection(); bufferevent* bev; - evutil_socket_t fd; + fd_t fd; std::shared_ptr stream; @@ -50,7 +54,7 @@ namespace srouter void resume_reading(); }; - using tcpconn_hook = std::function; + using tcpconn_hook = std::function; class TCPHandle { diff --git a/src/session/session.cpp b/src/session/session.cpp index 529578eb8..b91060304 100644 --- a/src/session/session.cpp +++ b/src/session/session.cpp @@ -15,6 +15,7 @@ #include "util/time.hpp" #include "util/underlying.hpp" +#include #include #include #include