1 /**
2  * Serialize a wdns_rrset_t.
3  *
4  * \param[in] rrset the RRset to serialize
5  * \param[out] buf the output buffer (may be NULL)
6  * \param[out] sz serialized length (may be NULL)
7  *
8  * \return wdns_res_success
9  */
10 
11 wdns_res
wdns_serialize_rrset(const wdns_rrset_t * rrset,uint8_t * buf,size_t * sz)12 wdns_serialize_rrset(const wdns_rrset_t *rrset, uint8_t *buf, size_t *sz)
13 {
14 	if (sz) {
15 		*sz = 1;			/* length of name */
16 		*sz += rrset->name.len;		/* name */
17 		*sz += 2;			/* type */
18 		*sz += 2;			/* class */
19 		*sz += 4;			/* ttl */
20 		*sz += 2;			/* number of rdatas */
21 
22 		for (size_t i = 0; i < rrset->n_rdatas; i++) {
23 			/* rdata length */
24 			*sz += 2;
25 
26 			/* rdata */
27 			*sz += rrset->rdatas[i]->len;
28 		}
29 	}
30 
31 	if (buf) {
32 		/* length of name */
33 		memcpy(buf, &rrset->name.len, 1);
34 		buf += 1;
35 
36 		/* name */
37 		memcpy(buf, rrset->name.data, rrset->name.len);
38 		buf += rrset->name.len;
39 
40 		/* type */
41 		memcpy(buf, &rrset->rrtype, 2);
42 		buf += 2;
43 
44 		/* class */
45 		memcpy(buf, &rrset->rrclass, 2);
46 		buf += 2;
47 
48 		/* ttl */
49 		memcpy(buf, &rrset->rrttl, 4);
50 		buf += 4;
51 
52 		/* number of rdatas */
53 		memcpy(buf, &rrset->n_rdatas, 2);
54 		buf += 2;
55 
56 		for (size_t i = 0; i < rrset->n_rdatas; i++) {
57 			uint16_t rdlen = rrset->rdatas[i]->len;
58 
59 			/* rdata length */
60 			memcpy(buf, &rdlen, 2);
61 			buf += 2;
62 
63 			/* rdata */
64 			memcpy(buf, &rrset->rdatas[i]->data, rdlen);
65 			buf += rdlen;
66 		}
67 	}
68 
69 	return (wdns_res_success);
70 }
71