-- Tests and scripts can use global variables
files['scripts'].ignore = {'111', '112', '113'}
files['tests'].ignore = {'111', '112', '113'}
- files['modules/*/*_test.lua'].ignore = {'111', '112', '113', '121', '122'}
-files['modules/**/*.test.lua'].ignore = {'111', '112', '113', '122'}
++files['modules/**/*.test.lua'].ignore = {'111', '112', '113', '121', '122'}
if (!lua_isnumber(L, 3)) { /* Default class is IN */
rrclass = KNOT_CLASS_IN;
}
- lua_pushstring(L, strerror(ENOMEM));
+
+ /* Add query options */
+ const struct kr_qflags *options = lua_topointer(L, 4);
+ if (!options) { /* but we rely on the lua wrapper when dereferencing non-NULL */
+ lua_pushstring(L, "invalid options");
+ lua_error(L);
+ }
+
+ /* Create query packet */
+ knot_pkt_t *pkt = knot_pkt_new(NULL, KNOT_EDNS_MAX_UDP_PAYLOAD, NULL);
+ if (!pkt) {
++ lua_pushstring(L, kr_strerror(ENOMEM));
+ lua_error(L);
+ }
knot_pkt_put_question(pkt, dname, rrclass, rrtype);
knot_wire_set_rd(pkt->wire);
+
/* Add OPT RR */
pkt->opt_rr = knot_rrset_copy(worker->engine->resolver.opt_rr, NULL);
if (!pkt->opt_rr) {
kr_log_error("[system] not enough memory\n");
return EXIT_FAILURE;
}
- /* Bind to passed fds and run */
- for (size_t i = 0; i < fd_set.len; ++i) {
- ret = network_listen_fd(&engine.net, fd_set.at[i], false);
- if (ret != 0) {
- kr_log_error("[system] listen on fd=%d %s\n", fd_set.at[i], kr_strerror(ret));
- ret = EXIT_FAILURE;
- break;
- }
- }
- /* Do the same for TLS */
- for (size_t i = 0; i < tls_fd_set.len; ++i) {
- ret = network_listen_fd(&engine.net, tls_fd_set.at[i], true);
- if (ret != 0) {
- kr_log_error("[system] TLS listen on fd=%d %s\n", tls_fd_set.at[i], kr_strerror(ret));
- ret = EXIT_FAILURE;
- break;
- }
- }
- /* Bind to sockets and run */
- if (ret == 0) {
- for (size_t i = 0; i < addr_set.len; ++i) {
- int port = 53;
- const char *addr = set_addr(addr_set.at[i], &port);
- ret = network_listen(&engine.net, addr, (uint16_t)port, NET_UDP|NET_TCP);
- if (ret != 0) {
- kr_log_error("[system] bind to '%s@%d' %s\n", addr, port, kr_strerror(ret));
- ret = EXIT_FAILURE;
- break;
- }
- }
- }
- /* Bind to TLS sockets */
- if (ret == 0) {
- for (size_t i = 0; i < tls_set.len; ++i) {
- int port = KR_DNS_TLS_PORT;
- const char *addr = set_addr(tls_set.at[i], &port);
- ret = network_listen(&engine.net, addr, (uint16_t)port, NET_TCP|NET_TLS);
- if (ret != 0) {
- kr_log_error("[system] bind to '%s@%d' (TLS) %s\n", addr, port, kr_strerror(ret));
- ret = EXIT_FAILURE;
- break;
- }
- }
-
++
++ uv_loop_t *loop = NULL;
+ /* Bind to passed fds and sockets*/
+ if (bind_fds(&engine.net, &args.fd_set, false) != 0 ||
+ bind_fds(&engine.net, &args.tls_fd_set, true) != 0 ||
+ bind_sockets(&engine.net, &args.addr_set, false) != 0 ||
+ bind_sockets(&engine.net, &args.tls_set, true) != 0
+ ) {
+ ret = EXIT_FAILURE;
+ goto cleanup;
}
/* Workaround for https://github.com/libuv/libuv/issues/45
goto cleanup;
}
- engine_set_moduledir(&engine, moduledir);
+ engine_set_moduledir(&engine, args.moduledir);
/* Block signals. */
- uv_loop_t *loop = uv_default_loop();
+ loop = uv_default_loop();
uv_signal_t sigint, sigterm;
uv_signal_init(loop, &sigint);
uv_signal_init(loop, &sigterm);
cleanup:/* Cleanup. */
engine_deinit(&engine);
worker_reclaim(worker);
+ if (loop != NULL) {
+ uv_loop_close(loop);
+ }
mp_delete(pool.ctx);
- array_clear(addr_set);
- array_clear(tls_set);
+ array_clear(args.addr_set);
+ array_clear(args.tls_set);
kr_crypto_cleanup();
return ret;
}
}
}
+bool kr_log_trace(const struct kr_query *query, const char *source, const char *fmt, ...)
+{
+ if (!kr_log_trace_enabled(query)) {
+ return false;
+ }
+
+ auto_free char *msg = NULL;
+
+ va_list args;
+ va_start(args, fmt);
+ int len = vasprintf(&msg, fmt, args);
+ va_end(args);
+
+ /* Check formatting result before logging */
+ if (len < 0) {
+ return false;
+ }
+
+ query->request->trace_log(query, source, msg);
+ return true;
+}
+
char* kr_strcatdup(unsigned n, ...)
{
+ if (n < 1) {
+ return NULL;
+ }
+
/* Calculate total length */
size_t total_len = 0;
va_list vl;