Because why not. It's easy and it might become useful one day.
Unfortunately porting this to 5.x was a bit involved,
as there's no `the_network` yet - I reordered struct engine for it.
> (require 'ffi').C.the_worker.engine.net.tcp.user_timeout
1000
#include "daemon/network.h"
struct engine {
- struct kr_context resolver;
struct network net;
+ struct kr_context resolver;
module_array_t modules;
array_t(const struct kr_cdb_api *) backends;
knot_mm_t *pool;
int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
int kr_cache_commit(struct kr_cache *);
uint32_t packet_ttl(const knot_pkt_t *);
+struct tls_credentials;
typedef struct {
int sock_type;
_Bool tls;
zi_callback cb;
void *cb_param;
} zi_config_t;
+typedef struct uv_loop_s uv_loop_t;
+typedef struct trie tls_client_params_t;
+struct net_tcp_param {
+ uint64_t in_idle_timeout;
+ uint64_t tls_handshake_timeout;
+ unsigned int user_timeout;
+};
+struct network {
+ uv_loop_t *loop;
+ trie_t *endpoints;
+ trie_t *endpoint_kinds;
+ _Bool missing_kind_is_error : 1;
+ _Bool proxy_all4 : 1;
+ _Bool proxy_all6 : 1;
+ trie_t *proxy_addrs4;
+ trie_t *proxy_addrs6;
+ struct tls_credentials *tls_credentials;
+ tls_client_params_t *tls_client_params;
+ struct tls_session_ticket_ctx *tls_session_ticket_ctx;
+ struct net_tcp_param tcp;
+ int tcp_backlog;
+ struct {
+ int snd;
+ int rcv;
+ } listen_udp_buflens;
+ struct {
+ int snd;
+ int rcv;
+ } listen_tcp_buflens;
+};
struct args *the_args;
struct endpoint {
void *handle;
struct qr_task *worker_resolve_start(knot_pkt_t *, struct kr_qflags);
int zi_zone_import(const zi_config_t);
struct engine {
+ struct network net;
struct kr_context resolver;
char _stub[];
};
int kr_cache_remove_subtree(struct kr_cache *, const knot_dname_t *, _Bool, int);
int kr_cache_commit(struct kr_cache *);
uint32_t packet_ttl(const knot_pkt_t *);
+struct tls_credentials;
typedef struct {
int sock_type;
_Bool tls;
zi_callback cb;
void *cb_param;
} zi_config_t;
+typedef struct uv_loop_s uv_loop_t;
+typedef struct trie tls_client_params_t;
+struct net_tcp_param {
+ uint64_t in_idle_timeout;
+ uint64_t tls_handshake_timeout;
+ unsigned int user_timeout;
+};
+struct network {
+ uv_loop_t *loop;
+ trie_t *endpoints;
+ trie_t *endpoint_kinds;
+ _Bool missing_kind_is_error : 1;
+ _Bool proxy_all4 : 1;
+ _Bool proxy_all6 : 1;
+ trie_t *proxy_addrs4;
+ trie_t *proxy_addrs6;
+ struct tls_credentials *tls_credentials;
+ tls_client_params_t *tls_client_params;
+ struct tls_session_ticket_ctx *tls_session_ticket_ctx;
+ struct net_tcp_param tcp;
+ int tcp_backlog;
+ struct {
+ int snd;
+ int rcv;
+ } listen_udp_buflens;
+ struct {
+ int snd;
+ int rcv;
+ } listen_tcp_buflens;
+};
struct args *the_args;
struct endpoint {
void *handle;
struct qr_task *worker_resolve_start(knot_pkt_t *, struct kr_qflags);
int zi_zone_import(const zi_config_t);
struct engine {
+ struct network net;
struct kr_context resolver;
char _stub[];
};
## kresd itself: worker stuff
+echo "struct tls_credentials;"
${CDEFS} ${KRESD} types <<-EOF
endpoint_flags_t
config_array_t
struct args
zi_config_t
+ # struct network - and all requirements that are missing so far
+ typedef uv_loop_t
+ typedef tls_client_params_t
+ struct net_tcp_param
+ struct network
EOF
echo "struct args *the_args;"
zi_zone_import
EOF
-echo "struct engine" | ${CDEFS} ${KRESD} types | sed '/struct network/,$ d'
+echo "struct engine" | ${CDEFS} ${KRESD} types | sed '/modules/,$ d'
printf "\tchar _stub[];\n};\n"
echo "struct worker_ctx" | ${CDEFS} ${KRESD} types | sed '/uv_loop_t/,$ d'