#include "daemon/bindings/impl.h"
#include "lib/cache/cdb_lmdb.h"
-#include "daemon/worker.h"
#include "daemon/zimport.h"
/** @internal return cache, or throw lua error if not open */
-struct kr_cache * cache_assert_open(lua_State *L)
+static struct kr_cache * cache_assert_open(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_cache *cache = &engine->resolver.cache;
+ struct kr_cache *cache = &the_worker->engine->resolver.cache;
assert(cache);
if (!cache || !kr_cache_is_open(cache))
lua_error_p(L, "no cache is open yet, use cache.open() or cache.size, etc.");
/** Return available cached backends. */
static int cache_backends(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
+ struct engine *engine = the_worker->engine;
lua_newtable(L);
for (unsigned i = 0; i < engine->backends.len; ++i) {
lua_error_p(L, "expected 'open(number max_size, string config = \"\")'");
/* Select cache storage backend */
- struct engine *engine = engine_luaget(L);
+ struct engine *engine = the_worker->engine;
lua_Integer csize_lua = lua_tointeger(L, 1);
if (!(csize_lua >= 8192 && csize_lua < SIZE_MAX)) { /* min. is basically arbitrary */
static int cache_close(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_cache *cache = &engine->resolver.cache;
+ struct kr_cache *cache = &the_worker->engine->resolver.cache;
if (!kr_cache_is_open(cache)) {
return 0;
}
lua_error_maybe(L, ret);
/* Clear reputation tables */
- struct engine *engine = engine_luaget(L);
- lru_reset(engine->resolver.cache_rtt);
- lru_reset(engine->resolver.cache_rep);
- lru_reset(engine->resolver.cache_cookie);
+ struct kr_context *ctx = &the_worker->engine->resolver;
+ lru_reset(ctx->cache_rtt);
+ lru_reset(ctx->cache_rep);
+ lru_reset(ctx->cache_cookie);
lua_pushboolean(L, true);
return 1;
}
* in NS elections again. */
static int cache_ns_tout(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_context *ctx = &engine->resolver;
+ struct kr_context *ctx = &the_worker->engine->resolver;
/* Check parameters */
int n = lua_gettop(L);
/** List loaded modules */
static int mod_list(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
+ const module_array_t * const modules = &the_worker->engine->modules;
lua_newtable(L);
- for (unsigned i = 0; i < engine->modules.len; ++i) {
- struct kr_module *module = engine->modules.at[i];
+ for (unsigned i = 0; i < modules->len; ++i) {
+ struct kr_module *module = modules->at[i];
lua_pushstring(L, module->name);
lua_rawseti(L, -2, i + 1);
}
const char *precedence = strtok(NULL, " ");
const char *ref = strtok(NULL, " ");
/* Load engine module */
- struct engine *engine = engine_luaget(L);
- int ret = engine_register(engine, name, precedence, ref);
+ int ret = engine_register(the_worker->engine, name, precedence, ref);
free(declaration);
if (ret != 0) {
if (ret == kr_error(EIDRM)) {
if (n != 1 || !lua_isstring(L, 1))
lua_error_p(L, "expected 'unload(string name)'");
/* Unload engine module */
- struct engine *engine = engine_luaget(L);
- int ret = engine_unregister(engine, lua_tostring(L, 1));
+ int ret = engine_unregister(the_worker->engine, lua_tostring(L, 1));
lua_error_maybe(L, ret);
lua_pushboolean(L, 1);
#include "contrib/base64.h"
#include "daemon/network.h"
#include "daemon/tls.h"
-#include "daemon/worker.h"
#include <stdlib.h>
/** List active endpoints. */
static int net_list(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
lua_newtable(L);
lua_pushinteger(L, 1);
- map_walk(&engine->net.endpoints, net_list_add, L);
+ map_walk(&the_worker->engine->net.endpoints, net_list_add, L);
lua_pop(L, 1);
return 1;
}
/* Case: string, representing a single address. */
const char *str = lua_tostring(L, -1);
if (str != NULL) {
- struct engine *engine = engine_luaget(L);
+ struct network *net = &the_worker->engine->net;
int ret = 0;
endpoint_flags_t flags = { .tls = tls, .freebind = freebind };
if (!kind && !flags.tls) { /* normal UDP */
flags.sock_type = SOCK_DGRAM;
- ret = network_listen(&engine->net, str, port, flags);
+ ret = network_listen(net, str, port, flags);
}
if (!kind && ret == 0) { /* common for normal TCP and TLS */
flags.sock_type = SOCK_STREAM;
- ret = network_listen(&engine->net, str, port, flags);
+ ret = network_listen(net, str, port, flags);
}
if (kind) {
flags.kind = strdup(kind);
flags.sock_type = SOCK_STREAM; /* TODO: allow to override this? */
- ret = network_listen(&engine->net, str, port, flags);
+ ret = network_listen(net, str, port, flags);
}
if (ret != 0) {
if (str[0] == '/') {
if (!ok)
lua_error_p(L, "expected 'close(string addr, [number port])'");
- struct network *net = &engine_luaget(L)->net;
- int ret = network_close(net, addr, port);
+ int ret = network_close(&the_worker->engine->net, addr, port);
lua_pushboolean(L, ret == 0);
return 1;
}
/** Set UDP maximum payload size. */
static int net_bufsize(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- knot_rrset_t *opt_rr = engine->resolver.opt_rr;
+ knot_rrset_t *opt_rr = the_worker->engine->resolver.opt_rr;
if (!lua_isnumber(L, 1)) {
lua_pushinteger(L, knot_edns_get_payload(opt_rr));
return 1;
static int net_tls(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- if (!engine) {
- return 0;
- }
- struct network *net = &engine->net;
+ struct network *net = &the_worker->engine->net;
if (!net) {
return 0;
}
/* TODO idea: allow starting the lua table with *multiple* IP targets,
* meaning the authentication config should be applied to each.
*/
- struct network *net = &engine_luaget(L)->net;
+ struct network *net = &the_worker->engine->net;
if (lua_gettop(L) == 0)
return tls_params2lua(L, net->tls_client_params);
/* Various basic sanity-checking. */
if (!addr)
lua_error_p(L, "invalid IP address");
/* Do the actual removal. */
- struct network *net = &engine_luaget(L)->net;
+ struct network *net = &the_worker->engine->net;
int r = tls_client_param_remove(net->tls_client_params, addr);
free_const(addr);
lua_error_maybe(L, r);
static int net_tls_padding(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
+ struct kr_context *ctx = &the_worker->engine->resolver;
/* Only return current padding. */
if (lua_gettop(L) == 0) {
- if (engine->resolver.tls_padding < 0) {
+ if (ctx->tls_padding < 0) {
lua_pushboolean(L, true);
return 1;
- } else if (engine->resolver.tls_padding == 0) {
+ } else if (ctx->tls_padding == 0) {
lua_pushboolean(L, false);
return 1;
}
- lua_pushinteger(L, engine->resolver.tls_padding);
+ lua_pushinteger(L, ctx->tls_padding);
return 1;
}
if (lua_isboolean(L, 1)) {
bool x = lua_toboolean(L, 1);
if (x) {
- engine->resolver.tls_padding = -1;
+ ctx->tls_padding = -1;
} else {
- engine->resolver.tls_padding = 0;
+ ctx->tls_padding = 0;
}
} else if (lua_isnumber(L, 1)) {
int padding = lua_tointeger(L, 1);
if ((padding < 0) || (padding > MAX_TLS_PADDING))
lua_error_p(L, "%s", errstr);
- engine->resolver.tls_padding = padding;
+ ctx->tls_padding = padding;
} else {
lua_error_p(L, "%s", errstr);
}
static int net_tls_sticket_secret_string(lua_State *L)
{
- struct network *net = &engine_luaget(L)->net;
+ struct network *net = &the_worker->engine->net;
size_t secret_len;
const char *secret;
}
fclose(fp);
- struct network *net = &engine_luaget(L)->net;
+ struct network *net = &the_worker->engine->net;
tls_session_ticket_ctx_destroy(net->tls_session_ticket_ctx);
net->tls_session_ticket_ctx =
static int net_tcp_in_idle(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct network *net = &engine->net;
-
+ struct network *net = &the_worker->engine->net;
return net_update_timeout(L, &net->tcp.in_idle_timeout, "net.tcp_in_idle");
}
static int net_tls_handshake_timeout(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct network *net = &engine->net;
-
+ struct network *net = &the_worker->engine->net;
return net_update_timeout(L, &net->tcp.tls_handshake_timeout, "net.tls_handshake_timeout");
}
#if __linux__
- struct engine *engine = engine_luaget(L);
- struct network *net = &engine->net;
int progfd = lua_tointeger(L, 1);
if (progfd == 0) {
/* conversion error despite that fact
}
lua_pop(L, 1);
- if (network_set_bpf(net, progfd) == 0) {
+ if (network_set_bpf(&the_worker->engine->net, progfd) == 0) {
lua_error_p(L, "failed to attach BPF program to some networks: %s",
kr_strerror(errno));
}
#if __linux__
- struct engine *engine = engine_luaget(L);
- struct network *net = &engine->net;
- network_clear_bpf(net);
+ network_clear_bpf(&the_worker->engine->net);
lua_pushboolean(L, 1);
return 1;
}
size_t kind_len;
const char *kind = lua_tolstring(L, 1, &kind_len);
- struct network *net = &engine_luaget(L)->net;
+ struct network *net = &the_worker->engine->net;
/* Unregistering */
if (param_count == 1) {
/** Quit current executable. */
static int l_quit(lua_State *L)
{
- engine_stop(engine_luaget(L));
+ engine_stop(the_worker->engine);
return 0;
}
/** Return hostname. */
static int l_hostname(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
+ struct engine *engine = the_worker->engine;
if (lua_gettop(L) == 0) {
lua_pushstring(L, engine_get_hostname(engine));
return 1;
/** Load root hints from zonefile. */
static int l_hint_root_file(lua_State *L)
{
- struct engine *engine = engine_luaget(L);
- struct kr_context *ctx = &engine->resolver;
+ struct kr_context *ctx = &the_worker->engine->resolver;
const char *file = lua_tostring(L, 1);
const char *err = engine_hint_root_file(ctx, file);
if (lua_gettop(L) != 1 || !lua_isstring(L, 1))
lua_error_p(L, "map('string with a lua expression')");
- struct engine *engine = engine_luaget(L);
const char *cmd = lua_tostring(L, 1);
uint32_t len = strlen(cmd);
lua_newtable(L);
lua_settop(L, ntop + 1); /* Push only one return value to table */
lua_rawseti(L, -2, 1);
- for (size_t i = 0; i < engine->ipc_set.len; ++i) {
- int fd = engine->ipc_set.at[i];
+ for (size_t i = 0; i < the_worker->engine->ipc_set.len; ++i) {
+ int fd = the_worker->engine->ipc_set.at[i];
/* Send command */
expr_checked(write(fd, &len, sizeof(len)) == sizeof(len));
expr_checked(write(fd, cmd, len) == len);
return kr_error(ENOENT);
}
-struct engine *engine_luaget(lua_State *L)
-{
- return the_worker->engine;
-}