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; }