diff --git a/daemon/main.c b/daemon/main.c index 49735c62f9be4f03cdee99d44fb7526fa79ab4c8..d0e2ba426860ab0b111bb931ca993f0d222e0ba5 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -18,7 +18,6 @@ #include <string.h> #include <getopt.h> #include <uv.h> -#include <libknot/internal/sockaddr.h> #include "contrib/ucw/mempool.h" #include "contrib/ccan/asprintf/asprintf.h" diff --git a/daemon/worker.c b/daemon/worker.c index 5f1e01ee3e21b6195c823f6b99defdc21058a495..abf5e4ab8dc39d3ff8fca596d4d56cfee3a18110 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -17,7 +17,6 @@ #include <uv.h> #include <lua.h> #include <libknot/packet/pkt.h> -#include <libknot/internal/net.h> #include <contrib/ucw/lib.h> #include <contrib/ucw/mempool.h> #if defined(__GLIBC__) && defined(_GNU_SOURCE) diff --git a/lib/resolve.c b/lib/resolve.c index a9ca2c087881769b0d2eb6386081675811e943cd..4d5b69a417072f513cd967eefb7a79c697c316da 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -19,7 +19,6 @@ #include <fcntl.h> #include <libknot/rrtype/rdname.h> #include <libknot/descriptor.h> -#include <libknot/internal/net.h> #include <ucw/mempool.h> #include "lib/resolve.h" #include "lib/layer.h" @@ -136,70 +135,6 @@ static int ns_resolve_addr(struct kr_query *qry, struct kr_request *param) return kr_ok(); } -static int connected(struct sockaddr *addr, int proto, struct timeval *timeout) -{ - unsigned flags = (proto == SOCK_STREAM) ? O_NONBLOCK : 0; - int fd = net_connected_socket(proto, (struct sockaddr_storage *)addr, NULL, flags); - if (fd < 0) { - return kr_error(ECONNREFUSED); - } - - /* Workaround for timeout, as we have no control over - * connect() time limit in blocking mode. */ - if (proto == SOCK_STREAM) { - fd_set set; - FD_ZERO(&set); - FD_SET(fd, &set); - int ret = select(fd + 1, NULL, &set, NULL, timeout); - if (ret == 0) { - close(fd); - return kr_error(ETIMEDOUT); - } - if (ret < 0) { - close(fd); - return kr_error(ECONNREFUSED); - } - fcntl(fd, F_SETFL, 0); - } - - return fd; -} - -static int sendrecv(struct sockaddr *addr, int proto, const knot_pkt_t *query, knot_pkt_t *resp) -{ - struct timeval timeout = { KR_CONN_RTT_MAX / 1000, 0 }; - auto_close int fd = connected(addr, proto, &timeout); - resp->size = 0; - if (fd < 0) { - return fd; - } - - /* Send packet */ - int ret = 0; - if (proto == SOCK_STREAM) { - ret = tcp_send_msg(fd, query->wire, query->size, &timeout); - } else { - ret = udp_send_msg(fd, query->wire, query->size, NULL); - } - if (ret != query->size) { - return kr_error(EIO); - } - - /* Receive it */ - if (proto == SOCK_STREAM) { - ret = tcp_recv_msg(fd, resp->wire, resp->max_size, &timeout); - } else { - ret = udp_recv_msg(fd, resp->wire, resp->max_size, &timeout); - } - if (ret <= 0) { - return kr_error(ETIMEDOUT); - } - - /* Parse and return */ - resp->size = ret; - return knot_pkt_parse(resp, 0); -} - static int edns_put(knot_pkt_t *pkt) { if (!pkt->opt_rr) { @@ -272,64 +207,6 @@ static int query_finalize(struct kr_request *request, knot_pkt_t *pkt) return ret; } -int kr_resolve(struct kr_context* ctx, knot_pkt_t *answer, - const knot_dname_t *qname, uint16_t qclass, uint16_t qtype) -{ - if (ctx == NULL || answer == NULL || qname == NULL) { - return kr_error(EINVAL); - } - - /* Create memory pool */ - mm_ctx_t pool = { - .ctx = mp_new (KNOT_WIRE_MAX_PKTSIZE), - .alloc = (mm_alloc_t) mp_alloc - }; - knot_pkt_t *query = knot_pkt_new(NULL, KR_EDNS_PAYLOAD, &pool); - knot_pkt_t *resp = knot_pkt_new(NULL, KNOT_WIRE_MAX_PKTSIZE, &pool); - if (!query || !resp) { - mp_delete(pool.ctx); - return kr_error(ENOMEM); - } - - /* Initialize context. */ - struct kr_request request; - request.pool = pool; - kr_resolve_begin(&request, ctx, answer); -#ifdef WITH_DEBUG - struct kr_rplan *rplan = &request.rplan; /* for DEBUG_MSG */ -#endif - /* Resolve query, iteratively */ - int proto = 0; - struct sockaddr *addr = NULL; - unsigned iter_count = 0; - int state = kr_resolve_query(&request, qname, qclass, qtype); - while (state == KNOT_STATE_PRODUCE) { - /* Hardlimit on iterative queries */ - if (++iter_count > KR_ITER_LIMIT) { - DEBUG_MSG("iteration limit %d reached\n", KR_ITER_LIMIT); - state = KNOT_STATE_FAIL; - break; - } - /* Produce next query or finish */ - state = kr_resolve_produce(&request, &addr, &proto, query); - while (state == KNOT_STATE_CONSUME) { - /* Get answer from nameserver and consume it */ - int ret = sendrecv(addr, proto, query, resp); - if (ret != 0) { - DEBUG_MSG("sendrecv: %s\n", kr_strerror(ret)); - } - state = kr_resolve_consume(&request, resp); - knot_pkt_clear(resp); - } - knot_pkt_clear(query); - } - - /* Cleanup */ - kr_resolve_finish(&request, state); - mp_delete(pool.ctx); - return state == KNOT_STATE_DONE ? 0 : kr_error(EIO); -} - int kr_resolve_begin(struct kr_request *request, struct kr_context *ctx, knot_pkt_t *answer) { /* Initialize request */ diff --git a/lib/resolve.h b/lib/resolve.h index 67aca7461224179bc4ca3bca5ddb4054584454af..a6afb2ba65b65415c71573c858c3dcd99675bb1a 100644 --- a/lib/resolve.h +++ b/lib/resolve.h @@ -28,26 +28,8 @@ /** * @file resolve.h - * @brief The API provides a high-level API for simple name resolution, - * and an API providing a "consumer-producer"-like interface to enable - * you write custom I/O or special iterative resolution driver. - * - * # Example usage of the high-level API: - * - * @code{.c} - * - * struct kr_context ctx = { - * .cache = ..., // open cache instance (or NULL) - * .layers = &modules, - * }; - * - * // Resolve "IN A cz." - * knot_pkt_t *answer = knot_pkt_new(NULL, 65535, ctx.pool); - * int ret = kr_resolve(&ctx, answer, (uint8_t*)"\x02cz", 1, 1); - * printf("rcode: %d, ancount: %u\n", - * knot_wire_get_rcode(answer->wire), - * knot_wire_get_ancount(answer->wire)); - * @endcode + * @brief The API provides an API providing a "consumer-producer"-like interface to enable + * user to plug it into existing event loop or I/O code. * * # Example usage of the iterative API: * @@ -131,21 +113,6 @@ struct kr_request { mm_ctx_t pool; }; -/** - * Resolve an input query and produce a packet with an answer. - * - * @note The function doesn't change the packet question or message ID. - * - * @param ctx resolution context - * @param answer answer packet to be written - * @param qname resolved query name - * @param qclass resolved query class - * @param qtype resolved query type - * @return 0 or an error code - */ -int kr_resolve(struct kr_context* ctx, knot_pkt_t *answer, - const knot_dname_t *qname, uint16_t qclass, uint16_t qtype); - /** * Begin name resolution. * diff --git a/modules/hints/hints.c b/modules/hints/hints.c index c99d170165830a44e70339fcff3c96a52474d2f3..509ebfd79e9e4e5a19f6a86b23d45d858fbc3830 100644 --- a/modules/hints/hints.c +++ b/modules/hints/hints.c @@ -23,7 +23,6 @@ #include <libknot/packet/pkt.h> #include <libknot/descriptor.h> -#include <libknot/internal/lists.h> #include <libknot/rrtype/aaaa.h> #include <ccan/json/json.h> #include <ucw/mempool.h> diff --git a/tests/test_resolve.c b/tests/test_resolve.c deleted file mode 100644 index eafff00d8090ecb754c8bae0f3116835035f9d89..0000000000000000000000000000000000000000 --- a/tests/test_resolve.c +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <libknot/descriptor.h> -#include "tests/test.h" -#include <cmocka.h> -#include "lib/resolve.h" - -static void test_resolve_nullparams(void **state) -{ - int ret = KNOT_EOK; - - /* NULL parameter check */ - void *non_null = (void *)0xDEADBEEF; - ret = kr_resolve(NULL, non_null, non_null, KNOT_CLASS_NONE, KNOT_RRTYPE_ANY); - assert_int_equal(ret, KNOT_EINVAL); - ret = kr_resolve(non_null, NULL, non_null, KNOT_CLASS_NONE, KNOT_RRTYPE_ANY); - assert_int_equal(ret, KNOT_EINVAL); - ret = kr_resolve(non_null, non_null, NULL, KNOT_CLASS_NONE, KNOT_RRTYPE_ANY); - assert_int_equal(ret, KNOT_EINVAL); -} - -static void test_resolve_dummy(void **state) -{ - /* Create resolution context */ - module_array_t module_arr = { NULL, 0, 0 }; - struct kr_context ctx = { - .pool = NULL, - .modules = &module_arr - }; - /* Resolve a query (no iterator) */ - knot_pkt_t *answer = knot_pkt_new(NULL, 4096, NULL); - int ret = kr_resolve(&ctx, answer, (const uint8_t *)"", KNOT_CLASS_IN, KNOT_RRTYPE_NS); - assert_int_not_equal(ret, kr_ok()); - assert_int_equal(knot_wire_get_rcode(answer->wire), KNOT_RCODE_SERVFAIL); - knot_pkt_free(&answer); -} - -int main(void) -{ - const UnitTest tests[] = { - /* Parameter sanity checks */ - unit_test(test_resolve_nullparams), - /* Simple resolution test cases */ - unit_test(test_resolve_dummy) - }; - - return run_tests(tests); -} diff --git a/tests/unit.mk b/tests/unit.mk index 3b69799d66cd901e1f588a2e11acb36cd3bd46cf..d944d5967799390103f4213614faafd8cdfadb47 100644 --- a/tests/unit.mk +++ b/tests/unit.mk @@ -12,8 +12,7 @@ tests_BIN := \ test_module \ test_cache \ test_zonecut \ - test_rplan \ - test_resolve + test_rplan mock_cmodule_SOURCES := tests/mock_cmodule.c $(eval $(call make_lib,mock_cmodule,tests))