From 7f8f64a355d8dff0c74b3268dc6925dacda41dd3 Mon Sep 17 00:00:00 2001 From: bol-van Date: Wed, 4 Feb 2026 15:04:21 +0300 Subject: [PATCH] nfqws2: compile compat --- nfq2/conntrack.c | 8 ++++---- nfq2/helpers.c | 33 ++++++++++++++++++++++++++------- nfq2/helpers.h | 12 ++++++++++++ nfq2/{andr => }/random.c | 9 ++++++--- nfq2/{andr => }/random.h | 12 +++++++++++- 5 files changed, 59 insertions(+), 15 deletions(-) rename nfq2/{andr => }/random.c (82%) rename nfq2/{andr => }/random.h (50%) diff --git a/nfq2/conntrack.c b/nfq2/conntrack.c index 176b3d4..a7cfba8 100644 --- a/nfq2/conntrack.c +++ b/nfq2/conntrack.c @@ -216,7 +216,7 @@ static void ConntrackFeedPacket(t_ctrack *t, bool bReverse, const struct dissect ConntrackApplyPos(t, bReverse, dis); } - clock_gettime(CLOCK_BOOTTIME, &t->pos.t_last); + clock_gettime(CLOCK_BOOT_OR_UPTIME, &t->pos.t_last); // make sure t_start gets exactly the same value as first t_last if (!t->t_start.tv_sec) t->t_start = t->pos.t_last; } @@ -346,10 +346,10 @@ static void taddr2str(uint8_t l3proto, const t_addr *a, char *buf, size_t bufsiz void ConntrackPoolDump(const t_conntrack *p) { t_conntrack_pool *t, *tmp; - struct timespec tnow; + time_t tnow; char sa1[40], sa2[40]; - if (clock_gettime(CLOCK_BOOTTIME, &tnow)) return; + if (!(tnow=boottime())) return; HASH_ITER(hh, p->pool, t, tmp) { taddr2str(t->conn.l3proto, &t->conn.src, sa1, sizeof(sa1)); taddr2str(t->conn.l3proto, &t->conn.dst, sa2, sizeof(sa2)); @@ -357,7 +357,7 @@ void ConntrackPoolDump(const t_conntrack *p) proto_name(t->conn.l4proto), sa1, t->conn.sport, sa2, t->conn.dport, t->conn.l4proto == IPPROTO_TCP ? connstate_s[t->track.pos.state] : "-", - (unsigned long long)t->track.t_start.tv_sec, (unsigned long long)(t->track.pos.t_last.tv_sec - t->track.t_start.tv_sec), (unsigned long long)(tnow.tv_sec - t->track.pos.t_last.tv_sec), + (unsigned long long)t->track.t_start.tv_sec, (unsigned long long)(t->track.pos.t_last.tv_sec - t->track.t_start.tv_sec), (unsigned long long)(tnow - t->track.pos.t_last.tv_sec), (unsigned long long)t->track.pos.client.pdcounter, (unsigned long long)t->track.pos.client.pcounter, (unsigned long long)t->track.pos.client.pbcounter, (unsigned long long)t->track.pos.server.pdcounter, (unsigned long long)t->track.pos.server.pcounter, (unsigned long long)t->track.pos.server.pbcounter); if (t->conn.l4proto == IPPROTO_TCP) diff --git a/nfq2/helpers.c b/nfq2/helpers.c index 2004fe3..cfb085c 100644 --- a/nfq2/helpers.c +++ b/nfq2/helpers.c @@ -1,6 +1,7 @@ #define _GNU_SOURCE #include "helpers.h" +#include "random.h" #include #include @@ -11,12 +12,6 @@ #include #include -#if defined(__ANDROID__) -#include "andr/random.h" -#elif defined(__linux__) || defined(__CYGWIN__) -#include -#endif - #define UNIQ_SORT \ { \ size_t i, j, u; \ @@ -479,6 +474,30 @@ void fill_random_az09(uint8_t *p,size_t sz) p[k] = rnd<10 ? rnd+'0' : 'a'+rnd-10; } } +#if defined(__FreeBSD__) && __FreeBSD_version <= 1200000 +#include +int getentropy(void *buf, size_t len) +{ + int mib[2]; + size_t size = len; + + // Check for reasonable length (getentropy limits to 256) + if (len > 256) { + errno = EIO; + return -1; + } + + mib[0] = CTL_KERN; + mib[1] = KERN_ARND; + + if (sysctl(mib, 2, buf, &size, NULL, 0) == -1) { + return -1; + } + + return (size == len) ? 0 : -1; +} +#endif + bool fill_crypto_random_bytes(uint8_t *p,size_t sz) { ssize_t rd; @@ -626,5 +645,5 @@ const struct in6_addr *mask_from_bitcount6(uint32_t zct) time_t boottime(void) { struct timespec ts; - return clock_gettime(CLOCK_BOOTTIME, &ts) ? 0 : ts.tv_sec; + return clock_gettime(CLOCK_BOOT_OR_UPTIME, &ts) ? 0 : ts.tv_sec; } diff --git a/nfq2/helpers.h b/nfq2/helpers.h index 4b3ef47..01fc78b 100644 --- a/nfq2/helpers.h +++ b/nfq2/helpers.h @@ -85,6 +85,10 @@ time_t file_mod_time(const char *filename); bool file_size(const char *filename, off_t *size); bool file_open_test(const char *filename, int flags); +#if defined(__FreeBSD__) && __FreeBSD_version <= 1200000 +int getentropy(void *buf, size_t len); +#endif + void fill_random_bytes(uint8_t *p,size_t sz); void fill_random_az(uint8_t *p,size_t sz); void fill_random_az09(uint8_t *p,size_t sz); @@ -105,4 +109,12 @@ uint32_t mask_from_bitcount(uint32_t zct); void mask_from_bitcount6_prepare(void); const struct in6_addr *mask_from_bitcount6(uint32_t zct); +#ifdef CLOCK_BOOTTIME +#define CLOCK_BOOT_OR_UPTIME CLOCK_BOOTTIME +#elif defined(CLOCK_UPTIME) +#define CLOCK_BOOT_OR_UPTIME CLOCK_UPTIME +#else +#define CLOCK_BOOT_OR_UPTIME CLOCK_MONOTINIC +#endif + time_t boottime(void); diff --git a/nfq2/andr/random.c b/nfq2/random.c similarity index 82% rename from nfq2/andr/random.c rename to nfq2/random.c index 10d2f3b..e893795 100644 --- a/nfq2/andr/random.c +++ b/nfq2/random.c @@ -1,8 +1,8 @@ -#if __ANDROID_API__ < 28 - #include "random.h" + +#ifdef NEED_GETRANDOM + #include -#include #ifndef SYS_getrandom @@ -19,6 +19,9 @@ #elif defined(__i386__) #define SYS_getrandom 355 +#elif defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32 + #define SYS_getrandom 4353 + #else #error "Unsupported architecture: SYS_getrandom not defined" #endif diff --git a/nfq2/andr/random.h b/nfq2/random.h similarity index 50% rename from nfq2/andr/random.h rename to nfq2/random.h index c4178fa..8fc83c8 100644 --- a/nfq2/andr/random.h +++ b/nfq2/random.h @@ -1,6 +1,14 @@ #pragma once -#if __ANDROID_API__ < 28 +// shim for old NDK and old gcc linux compilers + +#include + +#if defined(__linux__) + +#if defined(__ANDROID__) && __ANDROID_API__ < 28 || !defined(SYS_getrandom) + +#define NEED_GETRANDOM #include @@ -15,3 +23,5 @@ ssize_t getrandom(void *ptr, size_t len, unsigned int flags); #include #endif + +#endif