summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Crispin2023-01-15 10:04:00 +0000
committerJohn Crispin2023-01-15 12:06:01 +0000
commitfabce52c6e2390d6a67744aafcd68361100360ba (patch)
treeab119ba05f88814bf832f27780b5c45353fccbf9
parenta98a8be0fc26801b338f1494f5fd82e5eefae3ba (diff)
downloadmdnsd-fabce52c6e2390d6a67744aafcd68361100360ba.tar.gz
ubus: make it possible to return txt records as an array
Signed-off-by: John Crispin <john@phrozen.org>
-rw-r--r--cache.c9
-rw-r--r--cache.h2
-rw-r--r--ubus.c11
3 files changed, 17 insertions, 5 deletions
diff --git a/cache.c b/cache.c
index ea6a4c8..9de0fa0 100644
--- a/cache.c
+++ b/cache.c
@@ -382,7 +382,7 @@ void cache_answer(struct interface *iface, struct sockaddr *from, uint8_t *base,
}
void
-cache_dump_records(struct blob_buf *buf, const char *name)
+cache_dump_records(struct blob_buf *buf, const char *name, int txt_array)
{
struct cache_record *r, *last, *next;
const char *txt;
@@ -393,11 +393,18 @@ cache_dump_records(struct blob_buf *buf, const char *name)
switch (r->type) {
case TYPE_TXT:
if (r->txt && strlen(r->txt)) {
+ void *c = NULL;
+
+ if (txt_array)
+ c = blobmsg_open_array(buf, "txt");
+
txt = r->txt;
do {
blobmsg_add_string(buf, "txt", txt);
txt = &txt[strlen(txt) + 1];
} while (*txt);
+ if (c)
+ blobmsg_close_array(buf, c);
}
break;
diff --git a/cache.h b/cache.h
index 897d01b..44d407a 100644
--- a/cache.h
+++ b/cache.h
@@ -58,7 +58,7 @@ void cache_answer(struct interface *iface, struct sockaddr *from, uint8_t *base,
int blen, char *name, struct dns_answer *a, uint8_t *rdata,
int flush);
int cache_host_is_known(char *record);
-void cache_dump_records(struct blob_buf *buf, const char *name);
+void cache_dump_records(struct blob_buf *buf, const char *name, int txt_array);
void cache_dump_recursive(struct blob_buf *b, const char *name, uint16_t type, struct interface *iface);
#endif
diff --git a/ubus.c b/ubus.c
index bb63912..ff62e9a 100644
--- a/ubus.c
+++ b/ubus.c
@@ -49,11 +49,13 @@ umdns_update(struct ubus_context *ctx, struct ubus_object *obj,
enum {
BROWSE_SERVICE,
+ BROWSE_TXT_ARRAY,
BROWSE_MAX
};
static const struct blobmsg_policy browse_policy[] = {
[BROWSE_SERVICE] = { "service", BLOBMSG_TYPE_STRING },
+ [BROWSE_TXT_ARRAY] = { "txt_array", BLOBMSG_TYPE_BOOL },
};
static int
@@ -66,10 +68,13 @@ umdns_browse(struct ubus_context *ctx, struct ubus_object *obj,
struct blob_attr *data[BROWSE_MAX];
void *c1 = NULL, *c2;
char *service = NULL;
+ int txt_array = 0;
blobmsg_parse(browse_policy, BROWSE_MAX, data, blob_data(msg), blob_len(msg));
if (data[BROWSE_SERVICE])
service = blobmsg_get_string(data[BROWSE_SERVICE]);
+ if (data[BROWSE_TXT_ARRAY])
+ txt_array = blobmsg_get_u8(data[BROWSE_TXT_ARRAY]);
blob_buf_init(&b, 0);
avl_for_each_element(&services, s, avl) {
@@ -92,8 +97,8 @@ umdns_browse(struct ubus_context *ctx, struct ubus_object *obj,
*local = '\0';
c2 = blobmsg_open_table(&b, buffer);
strncat(buffer, ".local", MAX_NAME_LEN);
- cache_dump_records(&b, buffer);
- cache_dump_records(&b, s->entry);
+ cache_dump_records(&b, buffer, txt_array);
+ cache_dump_records(&b, s->entry, txt_array);
blobmsg_close_table(&b, c2);
q = avl_next_element(s, avl);
if (!q || avl_is_last(&services, &s->avl) || strcmp(s->avl.key, q->avl.key)) {
@@ -122,7 +127,7 @@ umdns_hosts(struct ubus_context *ctx, struct ubus_object *obj,
/* Query each domain just once */
if (!prev || strcmp(r->record, prev->record)) {
c = blobmsg_open_table(&b, r->record);
- cache_dump_records(&b, r->record);
+ cache_dump_records(&b, r->record, false);
blobmsg_close_table(&b, c);
}
prev = r;