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)12 wdns_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