diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/resolve/resolved-manager.c | 53 | ||||
-rw-r--r-- | src/shared/varlink.c | 48 | ||||
-rw-r--r-- | src/shared/varlink.h | 9 |
3 files changed, 81 insertions, 29 deletions
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 2eee418adf..9bbdc648fc 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -1165,7 +1165,6 @@ static int dns_question_to_json(DnsQuestion *q, sd_json_variant **ret) { int manager_monitor_send(Manager *m, DnsQuery *q) { _cleanup_(sd_json_variant_unrefp) sd_json_variant *jquestion = NULL, *jcollected_questions = NULL, *janswer = NULL; _cleanup_(dns_question_unrefp) DnsQuestion *merged = NULL; - Varlink *connection; DnsAnswerItem *rri; int r; @@ -1220,34 +1219,32 @@ int manager_monitor_send(Manager *m, DnsQuery *q) { return log_debug_errno(r, "Failed to append notification entry to array: %m"); } - SET_FOREACH(connection, m->varlink_subscription) { - r = varlink_notifybo( - connection, - SD_JSON_BUILD_PAIR("state", SD_JSON_BUILD_STRING(dns_transaction_state_to_string(q->state))), - SD_JSON_BUILD_PAIR_CONDITION(q->state == DNS_TRANSACTION_DNSSEC_FAILED, - "result", SD_JSON_BUILD_STRING(dnssec_result_to_string(q->answer_dnssec_result))), - SD_JSON_BUILD_PAIR_CONDITION(q->state == DNS_TRANSACTION_RCODE_FAILURE, - "rcode", SD_JSON_BUILD_INTEGER(q->answer_rcode)), - SD_JSON_BUILD_PAIR_CONDITION(q->state == DNS_TRANSACTION_ERRNO, - "errno", SD_JSON_BUILD_INTEGER(q->answer_errno)), - SD_JSON_BUILD_PAIR_CONDITION(IN_SET(q->state, - DNS_TRANSACTION_DNSSEC_FAILED, - DNS_TRANSACTION_RCODE_FAILURE) && - q->answer_ede_rcode >= 0, - "extendedDNSErrorCode", SD_JSON_BUILD_INTEGER(q->answer_ede_rcode)), - SD_JSON_BUILD_PAIR_CONDITION(IN_SET(q->state, - DNS_TRANSACTION_DNSSEC_FAILED, - DNS_TRANSACTION_RCODE_FAILURE) && - q->answer_ede_rcode >= 0 && !isempty(q->answer_ede_msg), - "extendedDNSErrorMessage", SD_JSON_BUILD_STRING(q->answer_ede_msg)), - SD_JSON_BUILD_PAIR("question", SD_JSON_BUILD_VARIANT(jquestion)), - SD_JSON_BUILD_PAIR_CONDITION(!!jcollected_questions, - "collectedQuestions", SD_JSON_BUILD_VARIANT(jcollected_questions)), - SD_JSON_BUILD_PAIR_CONDITION(!!janswer, + r = varlink_many_notifybo( + m->varlink_subscription, + SD_JSON_BUILD_PAIR("state", SD_JSON_BUILD_STRING(dns_transaction_state_to_string(q->state))), + SD_JSON_BUILD_PAIR_CONDITION(q->state == DNS_TRANSACTION_DNSSEC_FAILED, + "result", SD_JSON_BUILD_STRING(dnssec_result_to_string(q->answer_dnssec_result))), + SD_JSON_BUILD_PAIR_CONDITION(q->state == DNS_TRANSACTION_RCODE_FAILURE, + "rcode", SD_JSON_BUILD_INTEGER(q->answer_rcode)), + SD_JSON_BUILD_PAIR_CONDITION(q->state == DNS_TRANSACTION_ERRNO, + "errno", SD_JSON_BUILD_INTEGER(q->answer_errno)), + SD_JSON_BUILD_PAIR_CONDITION(IN_SET(q->state, + DNS_TRANSACTION_DNSSEC_FAILED, + DNS_TRANSACTION_RCODE_FAILURE) && + q->answer_ede_rcode >= 0, + "extendedDNSErrorCode", SD_JSON_BUILD_INTEGER(q->answer_ede_rcode)), + SD_JSON_BUILD_PAIR_CONDITION(IN_SET(q->state, + DNS_TRANSACTION_DNSSEC_FAILED, + DNS_TRANSACTION_RCODE_FAILURE) && + q->answer_ede_rcode >= 0 && !isempty(q->answer_ede_msg), + "extendedDNSErrorMessage", SD_JSON_BUILD_STRING(q->answer_ede_msg)), + SD_JSON_BUILD_PAIR("question", SD_JSON_BUILD_VARIANT(jquestion)), + SD_JSON_BUILD_PAIR_CONDITION(!!jcollected_questions, + "collectedQuestions", SD_JSON_BUILD_VARIANT(jcollected_questions)), + SD_JSON_BUILD_PAIR_CONDITION(!!janswer, "answer", SD_JSON_BUILD_VARIANT(janswer))); - if (r < 0) - log_debug_errno(r, "Failed to send monitor event, ignoring: %m"); - } + if (r < 0) + log_debug_errno(r, "Failed to send monitor event, ignoring: %m"); return 0; } diff --git a/src/shared/varlink.c b/src/shared/varlink.c index 8329f39021..d0a86157a2 100644 --- a/src/shared/varlink.c +++ b/src/shared/varlink.c @@ -4162,3 +4162,51 @@ int varlink_error_to_errno(const char *error, sd_json_variant *parameters) { return -EBADR; /* Catch-all */ } + +int varlink_many_notifyb(Set *s, ...) { + int r; + + /* Equivalent to varlink_notifyb(), but does this for each entry of the supplied set of Varlink connections */ + + if (set_isempty(s)) + return 0; + + _cleanup_(sd_json_variant_unrefp) sd_json_variant *parameters = NULL; + va_list ap; + va_start(ap, s); + r = sd_json_buildv(¶meters, ap); + va_end(ap); + if (r < 0) + return r; + + int ret = 1; + Varlink *link; + SET_FOREACH(link, s) + RET_GATHER(ret, varlink_notify(link, parameters)); + + return ret; +} + +int varlink_many_reply(Set *s, sd_json_variant *parameters) { + if (set_isempty(s)) + return 0; + + int ret = 1; + Varlink *link; + SET_FOREACH(link, s) + RET_GATHER(ret, varlink_reply(link, parameters)); + + return ret; +} + +int varlink_many_error(Set *s, const char *error_id, sd_json_variant *parameters) { + if (set_isempty(s)) + return 0; + + int ret = 1; + Varlink *link; + SET_FOREACH(link, s) + RET_GATHER(ret, varlink_error(link, error_id, parameters)); + + return ret; +} diff --git a/src/shared/varlink.h b/src/shared/varlink.h index 739786b975..40a8fd086f 100644 --- a/src/shared/varlink.h +++ b/src/shared/varlink.h @@ -2,9 +2,10 @@ #pragma once #include "sd-event.h" - #include "sd-json.h" + #include "pidref.h" +#include "set.h" #include "time-util.h" #include "varlink-idl.h" @@ -264,6 +265,12 @@ int varlink_invocation(VarlinkInvocationFlags flags); int varlink_error_to_errno(const char *error, sd_json_variant *parameters); +int varlink_many_notifyb(Set *s, ...); +#define varlink_many_notifybo(s, ...) \ + varlink_many_notifyb((s), SD_JSON_BUILD_OBJECT(__VA_ARGS__)) +int varlink_many_reply(Set *s, sd_json_variant *parameters); +int varlink_many_error(Set *s, const char *error_id, sd_json_variant *parameters); + DEFINE_TRIVIAL_CLEANUP_FUNC(Varlink *, varlink_unref); DEFINE_TRIVIAL_CLEANUP_FUNC(Varlink *, varlink_close_unref); DEFINE_TRIVIAL_CLEANUP_FUNC(Varlink *, varlink_flush_close_unref); |