]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
kr_zonecut_move(): new function
authorVladimír Čunát <vladimir.cunat@nic.cz>
Tue, 23 Oct 2018 15:43:25 +0000 (17:43 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Wed, 21 Nov 2018 13:26:58 +0000 (14:26 +0100)
It's more efficient for some our use cases,
and hopefully also more idiomatic.

lib/resolve.c
lib/zonecut.c
lib/zonecut.h

index 90ea2f92d1c89c651132315e1864f0047e91d99a..4ef01b5d2f3b30b87c1f9bc217000d5477a57b72 100644 (file)
@@ -246,13 +246,13 @@ static int ns_fetch_cut(struct kr_query *qry, const knot_dname_t *requested_name
        if (ret == kr_error(ENOENT)) {
                /* No cached cut found, start from SBELT
                 * and issue priming query. */
+               kr_zonecut_deinit(&cut_found);
                ret = kr_zonecut_set_sbelt(req->ctx, &qry->zone_cut);
                if (ret != 0) {
                        return KR_STATE_FAIL;
                }
                VERBOSE_MSG(qry, "=> using root hints\n");
                qry->flags.AWAIT_CUT = false;
-               kr_zonecut_deinit(&cut_found);
                return KR_STATE_DONE;
        } else if (ret != kr_ok()) {
                kr_zonecut_deinit(&cut_found);
@@ -295,12 +295,8 @@ static int ns_fetch_cut(struct kr_query *qry, const knot_dname_t *requested_name
                qry->flags.AWAIT_CUT = false;
                return KR_STATE_DONE;
        }
-       /* Copy fetched name */
-       qry->zone_cut.name = knot_dname_copy(cut_found.name, qry->zone_cut.pool);
-       /* Copy fetched address set */
-       kr_zonecut_copy(&qry->zone_cut, &cut_found);
-       /* Copy fetched ta & keys */
-       kr_zonecut_copy_trust(&qry->zone_cut, &cut_found);
+       /* Use the found zone cut. */
+       kr_zonecut_move(&qry->zone_cut, &cut_found);
        /* Check if there's a non-terminal between target and current cut. */
        struct kr_cache *cache = &req->ctx->cache;
        check_empty_nonterms(qry, pkt, cache, qry->timestamp.tv_sec);
index d0abe9daa0ca70f4c786fd5c8ff8013ae26fa3e2..1c31d933e6e719d85e26c9b8b0e1ab4778f1de1d 100644 (file)
@@ -98,6 +98,13 @@ void kr_zonecut_deinit(struct kr_zonecut *cut)
        knot_rrset_free(cut->trust_anchor, cut->pool);
 }
 
+void kr_zonecut_move(struct kr_zonecut *to, const struct kr_zonecut *from)
+{
+       if (!to || !from) abort();
+       kr_zonecut_deinit(to);
+       memcpy(to, from, sizeof(*to));
+}
+
 void kr_zonecut_set(struct kr_zonecut *cut, const knot_dname_t *name)
 {
        if (!cut || !name) {
index f1ab0c31cfda2e413c58024e20b681528afafb33..b7def14bfca3bf69daa669e128b95d9425cef076 100644 (file)
@@ -53,6 +53,14 @@ int kr_zonecut_init(struct kr_zonecut *cut, const knot_dname_t *name, knot_mm_t
 KR_EXPORT
 void kr_zonecut_deinit(struct kr_zonecut *cut);
 
+/**
+ * Move a zonecut, transferring ownership of any pointed-to memory.
+ * @param to the target - it gets deinit-ed
+ * @param from the source - not modified, but shouldn't be used afterward
+ */
+KR_EXPORT
+void kr_zonecut_move(struct kr_zonecut *to, const struct kr_zonecut *from);
+
 /**
  * Reset zone cut to given name and clear address list.
  * @note This clears the address list even if the name doesn't change. TA and DNSKEY don't change.