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