]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/rules: add deletion prototype, commit transactions
authorVladimír Čunát <vladimir.cunat@nic.cz>
Sat, 11 Jun 2022 07:37:24 +0000 (09:37 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Mon, 12 Jun 2023 08:32:28 +0000 (10:32 +0200)
lib/rules/api.c
lib/rules/api.h

index 010751d5a47d03cea654ac6b08c08fc34e24ff91..fb15bf1a077d0c47a18395b0bbc78870edef7126 100644 (file)
@@ -386,11 +386,9 @@ static int answer_exact_match(struct kr_query *qry, knot_pkt_t *pkt, uint16_t ty
        return kr_ok();
 }
 
-int kr_rule_local_data_ins(const knot_rrset_t *rrs, const knot_rdataset_t *sig_rds,
-                               kr_rule_tags_t tags)
+
+static knot_db_val_t local_data_key(const knot_rrset_t *rrs, uint8_t key_data[KEY_MAXLEN])
 {
-       // Construct the DB key.
-       uint8_t key_data[KEY_MAXLEN];
        knot_db_val_t key;
        key.data = key_dname_lf(rrs->owner, key_data);
        key_data[KEY_DNAME_END_OFFSET + 1] = '\0'; // double zero
@@ -405,6 +403,14 @@ int kr_rule_local_data_ins(const knot_rrset_t *rrs, const knot_rdataset_t *sig_r
        memcpy(key_data + KEY_DNAME_END_OFFSET + 2, &rrs->type, sizeof(rrs->type));
        key.len = key_data + KEY_DNAME_END_OFFSET + 2 + sizeof(rrs->type)
                - (uint8_t *)key.data;
+       return key;
+}
+int kr_rule_local_data_ins(const knot_rrset_t *rrs, const knot_rdataset_t *sig_rds,
+                               kr_rule_tags_t tags)
+{
+       // Construct the DB key.
+       uint8_t key_data[KEY_MAXLEN];
+       knot_db_val_t key = local_data_key(rrs, key_data);
 
        // Allocate the data in DB.
        const int rr_ssize = rdataset_dematerialize_size(&rrs->rrs);
@@ -423,9 +429,18 @@ int kr_rule_local_data_ins(const knot_rrset_t *rrs, const knot_rdataset_t *sig_r
        val.data += rr_ssize;
        rdataset_dematerialize(sig_rds, val.data);
 
-       return kr_ok();
+       return ruledb_op(commit);
+}
+int kr_rule_local_data_del(const knot_rrset_t *rrs, kr_rule_tags_t tags)
+{
+       uint8_t key_data[KEY_MAXLEN];
+       knot_db_val_t key = local_data_key(rrs, key_data);
+       int ret = ruledb_op(remove, &key, 1);
+       if (ret != 1)
+               return ret;
+       ret = ruledb_op(commit);
+       return ret == 0 ? 1 : ret;
 }
-
 
 static int answer_zla_empty(struct kr_query *qry, knot_pkt_t *pkt,
                                const knot_db_val_t zla_lf, const knot_db_val_t val)
@@ -514,6 +529,7 @@ int kr_rule_local_data_emptyzone(const knot_dname_t *apex, kr_rule_tags_t tags)
        val.data += sizeof(tags);
        memcpy(val.data, &ztype, sizeof(ztype));
        val.data += sizeof(ztype);
-       return ret;
+
+       return ruledb_op(commit);
 }
 
index 1f9a25f411b2e9abc2c766fb3818e1c40b7bf3b2..d5b6b7993f3815b7c3b80e094a4231569fb04130 100644 (file)
@@ -24,6 +24,14 @@ void kr_rules_deinit(void);
  */
 int kr_rule_local_data_answer(struct kr_query *qry, struct knot_pkt *pkt);
 
+
+/* API to modify the rule DB.
+ *
+ * FIXME:
+ *  - what about transactions in this API?
+ *  - a way to read/modify a rule?
+ */
+
 /** Insert/overwrite a local data rule.
  *
  * Into the default rule-set ATM.
@@ -32,6 +40,16 @@ KR_EXPORT
 int kr_rule_local_data_ins(const knot_rrset_t *rrs, const knot_rdataset_t *sig_rds,
                                kr_rule_tags_t tags);
 
+/** Remove a local data rule.
+ *
+ * \return the number of deleted rules or error < 0
+ *
+ * TODO: some other matching than name+type?  Currently `tags` is unused; match all types?
+ * (would be useful in del_pair)
+ */
+KR_EXPORT
+int kr_rule_local_data_del(const knot_rrset_t *rrs, kr_rule_tags_t tags);
+
 /** Insert an empty zone.
  * Into the default rule-set ATM. */
 KR_EXPORT