From: Felix Fietkau Date: Thu, 19 Oct 2023 08:58:04 +0000 (+0200) Subject: use hostname from SRV record to look up IP addresses X-Git-Url: http://git.openwrt.org/b27977b41be6d010c9d5a8fc67e5e48135f11aae.?a=commitdiff_plain;h=b42b22152d73c0b5825bd20742d501d47adabed1;p=project%2Fmdnsd.git use hostname from SRV record to look up IP addresses On many devices, the main record name contains the long form hostname, whereas the A/AAAA records are assigned to the hostname indicated in the SRV record. This fixes getting IP addresses via browse for many devices Signed-off-by: Felix Fietkau --- diff --git a/cache.c b/cache.c index 9df051d..8324993 100644 --- a/cache.c +++ b/cache.c @@ -382,7 +382,8 @@ void cache_answer(struct interface *iface, struct sockaddr *from, uint8_t *base, } void -cache_dump_records(struct blob_buf *buf, const char *name, int array) +cache_dump_records(struct blob_buf *buf, const char *name, int array, + const char **hostname) { struct cache_record *r, *last, *next; const char *txt; @@ -454,8 +455,11 @@ cache_dump_records(struct blob_buf *buf, const char *name, int array) break; case TYPE_SRV: - if (r->rdata) + if (r->rdata) { blobmsg_add_string(buf, "host", (char *)r->rdata + sizeof(struct dns_srv_data)); + if (hostname) + *hostname = (char *)r->rdata + sizeof(struct dns_srv_data); + } if (r->port) blobmsg_add_u32(buf, "port", r->port); break; diff --git a/cache.h b/cache.h index 8affee6..7c81418 100644 --- a/cache.h +++ b/cache.h @@ -58,7 +58,8 @@ 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, int array); +void cache_dump_records(struct blob_buf *buf, const char *name, int array, + const char **hostname); 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 cf75cdc..e0a40aa 100644 --- a/ubus.c +++ b/ubus.c @@ -83,6 +83,7 @@ umdns_browse(struct ubus_context *ctx, struct ubus_object *obj, blob_buf_init(&b, 0); avl_for_each_element(&services, s, avl) { + const char *hostname = buffer; char *local; snprintf(buffer, MAX_NAME_LEN, "%s", (const char *) s->avl.key); @@ -103,9 +104,9 @@ umdns_browse(struct ubus_context *ctx, struct ubus_object *obj, c2 = blobmsg_open_table(&b, buffer); strncat(buffer, ".local", MAX_NAME_LEN); blobmsg_add_string(&b, "iface", s->iface->name); + cache_dump_records(&b, s->entry, array, &hostname); if (address) - cache_dump_records(&b, buffer, array); - cache_dump_records(&b, s->entry, array); + cache_dump_records(&b, hostname, array, NULL); 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)) { @@ -134,7 +135,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, false); + cache_dump_records(&b, r->record, false, NULL); blobmsg_close_table(&b, c); } prev = r;