=== DNS server Disabled by default; enable with `-DMG_ENABLE_DNS_SERVER`. ==== mg_dns_create_reply() [source,c] ---- struct mg_dns_reply mg_dns_create_reply(struct mbuf *io, struct mg_dns_message *msg); ---- Create a DNS reply. The reply will be based on an existing query message `msg`. The query body will be appended to the output buffer. "reply + recursion allowed" will be added to the message flags and message's num_answers will be set to 0. Answer records can be appended with `mg_dns_send_reply` or by lower level function defined in the DNS API. In order to send the reply use `mg_dns_send_reply`. It's possible to use a connection's send buffer as reply buffers, and it will work for both UDP and TCP connections. Example: ```c reply = mg_dns_create_reply(&nc->send_mbuf, msg); for (i = 0; i < msg->num_questions; i++) { rr = &msg->questions[i]; if (rr->rtype == MG_DNS_A_RECORD) { mg_dns_reply_record(&reply, rr, 3600, &dummy_ip_addr, 4); } } mg_dns_send_reply(nc, &reply); ``` ==== mg_dns_reply_record() [source,c] ---- int mg_dns_reply_record(struct mg_dns_reply *reply, struct mg_dns_resource_record *question, const char *name, int rtype, int ttl, const void *rdata, size_t rdata_len); ---- Append a DNS reply record to the IO buffer and to the DNS message. The message num_answers field will be incremented. It's caller's duty to ensure num_answers is propertly initialized. Returns -1 on error. ==== mg_dns_send_reply() [source,c] ---- void mg_dns_send_reply(struct mg_connection *nc, struct mg_dns_reply *r); ---- Send a DNS reply through a connection. The DNS data is stored in an IO buffer pointed by reply structure in `r`. This function mutates the content of that buffer in order to ensure that the DNS header reflects size and flags of the mssage, that might have been updated either with `mg_dns_reply_record` or by direct manipulation of `r->message`. Once sent, the IO buffer will be trimmed unless the reply IO buffer is the connection's send buffer and the connection is not in UDP mode.