+static NTSTATUS dns_server_reload_zones(struct dns_server *dns)
+{
+ NTSTATUS status;
+ struct dns_server_zone *new_list = NULL;
+ struct dns_server_zone *old_list = NULL;
+ struct dns_server_zone *old_zone;
+ status = dns_common_zones(dns->samdb, dns, &new_list);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+ dns->zones = new_list;
+ while ((old_zone = DLIST_TAIL(old_list)) != NULL) {
+ DLIST_REMOVE(old_list, old_zone);
+ talloc_free(old_zone);
+ }
+
+ return NT_STATUS_OK;
+}
+
+/**
+ * Called when the internal DNS server should reload the zones from DB, for
+ * example, when zones are added or deleted through RPC or replicated by
+ * inbound DRS.
+ */
+static NTSTATUS dns_reload_zones(struct irpc_message *msg,
+ struct dnssrv_reload_dns_zones *r)
+{
+ struct dns_server *dns;
+
+ dns = talloc_get_type(msg->private_data, struct dns_server);
+ if (dns == NULL) {
+ r->out.result = NT_STATUS_INTERNAL_ERROR;
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
+ r->out.result = dns_server_reload_zones(dns);
+
+ return NT_STATUS_OK;
+}
+