+ query_context_t *context = client_data(pcy);
+ const query_t* query = &context->query;
+ buffer_t *buf = client_output_buffer(pcy);
+
+ /* Write reply "action=ACTION [text]" */
+ buffer_addstr(buf, "action=");
+ buffer_ensure(buf, m_strlen(message) + 64);
+
+ ssize_t size = array_size(*buf) - array_len(*buf);
+ ssize_t format_size = query_format(array_ptr(*buf, array_len(*buf)),
+ size, message, query);
+ if (format_size == -1) {
+ buffer_addstr(buf, message);
+ } else if (format_size > size) {
+ buffer_ensure(buf, format_size + 1);
+ query_format(array_ptr(*buf, array_len(*buf)),
+ array_size(*buf) - array_len(*buf),
+ message, query);
+ array_len(*buf) += format_size;
+ } else {
+ array_len(*buf) += format_size;
+ }
+ buffer_addstr(buf, "\n\n");
+
+ /* Finalize query. */
+ buf = client_input_buffer(pcy);
+ buffer_consume(buf, query->eoq - buf->data);
+ client_io_rw(pcy);
+}
+
+static const filter_t *next_filter(client_t *pcy, const filter_t *filter,
+ const query_t *query, const filter_hook_t *hook, bool *ok) {
+ if (hook != NULL) {
+ query_context_t *context = client_data(pcy);
+ if (hook->counter >= 0 && hook->counter < MAX_COUNTERS && hook->cost > 0) {
+ context->context.counters[hook->counter] += hook->cost;
+ debug("request client=%s, from=<%s>, to=<%s>: added %d to counter %d (now %u)",
+ query->client_name,
+ query->sender == NULL ? "undefined" : query->sender,
+ query->recipient == NULL ? "undefined" : query->recipient,
+ hook->cost, hook->counter, context->context.counters[hook->counter]);
+ }
+ }
+ if (hook == NULL) {
+ warn("request client=%s, from=<%s>, to=<%s>: aborted",
+ query->client_name,
+ query->sender == NULL ? "undefined" : query->sender,
+ query->recipient == NULL ? "undefined" : query->recipient);
+ *ok = false;
+ return NULL;
+ } else if (hook->async) {
+ debug("request client=%s, from=<%s>, to=<%s>: "
+ "asynchronous filter from filter %s",
+ query->client_name,
+ query->sender == NULL ? "undefined" : query->sender,
+ query->recipient == NULL ? "undefined" : query->recipient,
+ filter->name);
+ *ok = true;
+ return NULL;
+ } else if (hook->postfix) {
+ info("request client=%s, from=<%s>, to=<%s>: "
+ "awswer %s from filter %s: \"%s\"",
+ query->client_name,
+ query->sender == NULL ? "undefined" : query->sender,
+ query->recipient == NULL ? "undefined" : query->recipient,
+ htokens[hook->type], filter->name, hook->value);
+ policy_answer(pcy, hook->value);
+ *ok = true;
+ return NULL;
+ } else {
+ debug("request client=%s, from=<%s>, to=<%s>: "
+ "awswer %s from filter %s: next filter %s",
+ query->client_name,
+ query->sender == NULL ? "undefined" : query->sender,
+ query->recipient == NULL ? "undefined" : query->recipient,
+ htokens[hook->type], filter->name,
+ (array_ptr(config->filters, hook->filter_id))->name);
+ return array_ptr(config->filters, hook->filter_id);
+ }