1 /** 2 * Convert a domain name to a human-readable string. 3 * 4 * \param[in] src domain name in wire format 5 * \param[in] src_len length of domain name in bytes 6 * \param[out] dst caller-allocated string buffer of size WDNS_PRESLEN_NAME 7 * 8 * \return Number of bytes read from src. 9 */ 10 11 size_t wdns_domain_to_str(const uint8_t * src,size_t src_len,char * dst)12wdns_domain_to_str(const uint8_t *src, size_t src_len, char *dst) 13 { 14 size_t bytes_read = 0; 15 size_t bytes_remaining = src_len; 16 uint8_t oclen; 17 18 assert(src != NULL); 19 20 oclen = *src; 21 while (bytes_remaining > 0 && oclen != 0) { 22 src++; 23 bytes_remaining--; 24 25 bytes_read += oclen + 1 /* length octet */; 26 27 while (oclen-- && bytes_remaining > 0) { 28 uint8_t c = *src++; 29 bytes_remaining--; 30 31 if (c == '.' || c == '\\') { 32 *dst++ = '\\'; 33 *dst++ = c; 34 } else if (c >= '!' && c <= '~') { 35 *dst++ = c; 36 } else { 37 snprintf(dst, 5, "\\%.3d", c); 38 dst += 4; 39 } 40 } 41 *dst++ = '.'; 42 oclen = *src; 43 } 44 if (bytes_read == 0) 45 *dst++ = '.'; 46 bytes_read++; 47 48 *dst = '\0'; 49 return (bytes_read); 50 } 51