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;
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;
}
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;
+}