From fa365a65b4822d8d2017cc95dbd2d3b07df76780 Mon Sep 17 00:00:00 2001 From: Mohd Husaam Mehdi Date: Sun, 14 Jan 2024 20:18:32 +0530 Subject: [PATCH] display more srv attributes in output of ubus browse function In the output of ubus call umdns browse, the following srv params have been exposed with this commit: * domain, * ttl, * last_update, * priority * weight The new output looks as follows: "_http._tcp": { "Apache service": { "iface": "br-lan", "host": "user831.local", "domain": "local", "port": 80, "ttl": 120, "last_update": "2024-01-16T02:41:02Z", "priority": 0, "weight": 0, "ipv4": "192.168.1.245", "ipv6": "9999:1234:830::1f0", "ipv6": "fdc5:c8b6:f412::1f0", "ipv6": "fdc5:c8b6:f412:0:a800:aaff:fe53:101", "ipv6": "9999:1234:830:0:a800:aaff:fe53:101" } } Signed-off-by: Mohd Husaam --- cache.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/cache.c b/cache.c index 8324993..59acbfc 100644 --- a/cache.c +++ b/cache.c @@ -460,8 +460,59 @@ cache_dump_records(struct blob_buf *buf, const char *name, int array, if (hostname) *hostname = (char *)r->rdata + sizeof(struct dns_srv_data); } - if (r->port) - blobmsg_add_u32(buf, "port", r->port); + + + if (r->record) { + char *domain = NULL; + /* + * search for ._udp. or ._tcp. because: + * Service Instance Name = . . + * = _ . _ + * and, according to rfc6763, _ can be **tcp or udp only** + */ + domain = strstr(r->record, "._udp."); + + /* udp not found */ + if (!domain) + domain = strstr(r->record, "._tcp."); + + /* tcp also not found, seems like a wrong record */ + if (!domain) { + break; + } + + /* tcp could have been used instead of udp, they have the same length */ + domain = domain + strlen("._udp."); + blobmsg_add_string(buf, "domain", domain); + + if (r->port) + blobmsg_add_u32(buf, "port", r->port); + + if (r->ttl) + blobmsg_add_u32(buf, "ttl", r->ttl); + + if (r->time) { + struct tm *local_time; + char str_tm[32] = {0}; + /* + * last_update_real_seconds = + * current_real_seconds - (current_monotonic_seconds - srv_last_update_monotonic_seconds) + */ + time_t last_update = time(NULL) - (monotonic_time() - r->time); + local_time = localtime(&last_update); + strftime(str_tm, sizeof(str_tm), "%Y-%m-%dT%H:%M:%SZ", local_time); + + blobmsg_add_string(buf, "last_update", str_tm); + } + + const struct dns_srv_data *dsd = (const struct dns_srv_data*)r->rdata; + + if (r->rdlength > sizeof(*dsd)) { + blobmsg_add_u32(buf, "priority", be16_to_cpu(dsd->priority)); + blobmsg_add_u32(buf, "weight", be16_to_cpu(dsd->weight)); + } + } + break; }