+ ifname = blobmsg_get_string(c);
+
+ if ((c = tb[QUERY_QUESTION]))
+ question = blobmsg_get_string(c);
+
+ if ((c = tb[QUERY_TYPE]))
+ type = blobmsg_get_u32(c);
+
+ struct interface *iface_v4 = interface_get(ifname, 0, 1);
+ struct interface *iface_v6 = interface_get(ifname, 1, 1);
+
+ if (!iface_v4 && !iface_v6)
+ return UBUS_STATUS_NOT_FOUND;
+
+ if (!strcmp(method, "query")) {
+ if (iface_v4)
+ dns_send_question(iface_v4, NULL, question, type, 1);
+
+ if (iface_v6)
+ dns_send_question(iface_v6, NULL, question, type, 1);
+
+ return UBUS_STATUS_OK;
+ } else if (!strcmp(method, "fetch")) {
+ blob_buf_init(&b, 0);
+ void *k = blobmsg_open_array(&b, "records");
+ cache_dump_recursive(&b, question, type, iface_v4 ? iface_v4 : iface_v6);
+ blobmsg_close_array(&b, k);
+ ubus_send_reply(ctx, req, b.head);
+ return UBUS_STATUS_OK;
+ } else {
+ return UBUS_STATUS_INVALID_ARGUMENT;
+ }
+}
+
+
+static const struct ubus_method umdns_methods[] = {
+ UBUS_METHOD("set_config", umdns_set_config, config_policy),
+ UBUS_METHOD("query", umdns_query, query_policy),
+ UBUS_METHOD("fetch", umdns_query, query_policy),
+ UBUS_METHOD_NOARG("update", umdns_update),
+ UBUS_METHOD_NOARG("browse", umdns_browse),
+ UBUS_METHOD_NOARG("hosts", umdns_hosts),
+ UBUS_METHOD_NOARG("reload", umdns_reload),
+};
+
+static struct ubus_object_type umdns_object_type =
+ UBUS_OBJECT_TYPE("umdns", umdns_methods);
+
+static struct ubus_object umdns_object = {
+ .name = "umdns",
+ .type = &umdns_object_type,
+ .methods = umdns_methods,
+ .n_methods = ARRAY_SIZE(umdns_methods),