1 /*
2    Unix SMB/CIFS implementation.
3 
4    DNS server utils
5 
6    Copyright (C) 2014 Stefan Metzmacher
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #include "rpc_server/dnsserver/dnsserver.h"
23 
24 #ifndef __DNSSERVER_COMMON_H__
25 #define __DNSSERVER_COMMON_H__
26 
27 uint8_t werr_to_dns_err(WERROR werr);
28 #define DNS_ERR(err_str) WERR_DNS_ERROR_RCODE_##err_str
29 
30 struct ldb_message_element;
31 struct ldb_context;
32 struct dnsp_DnssrvRpcRecord;
33 
34 struct dns_server_zone {
35 	struct dns_server_zone *prev, *next;
36 	const char *name;
37 	struct ldb_dn *dn;
38 };
39 
40 WERROR dns_common_extract(struct ldb_context *samdb,
41 			  const struct ldb_message_element *el,
42 			  TALLOC_CTX *mem_ctx,
43 			  struct dnsp_DnssrvRpcRecord **records,
44 			  uint16_t *num_records);
45 
46 WERROR dns_common_lookup(struct ldb_context *samdb,
47 			 TALLOC_CTX *mem_ctx,
48 			 struct ldb_dn *dn,
49 			 struct dnsp_DnssrvRpcRecord **records,
50 			 uint16_t *num_records,
51 			 bool *tombstoned);
52 WERROR dns_common_wildcard_lookup(struct ldb_context *samdb,
53 				  TALLOC_CTX *mem_ctx,
54 				  struct ldb_dn *dn,
55 				  struct dnsp_DnssrvRpcRecord **records,
56 				  uint16_t *num_records);
57 WERROR dns_name_check(TALLOC_CTX *mem_ctx,
58 		      size_t len,
59 		      const char *name);
60 WERROR dns_get_zone_properties(struct ldb_context *samdb,
61 			       TALLOC_CTX *mem_ctx,
62 			       struct ldb_dn *zone_dn,
63 			       struct dnsserver_zoneinfo *zoneinfo);
64 bool dns_name_is_static(struct dnsp_DnssrvRpcRecord *records,
65 			uint16_t rec_count);
66 WERROR dns_common_replace(struct ldb_context *samdb,
67 			  TALLOC_CTX *mem_ctx,
68 			  struct ldb_dn *dn,
69 			  bool needs_add,
70 			  uint32_t serial,
71 			  struct dnsp_DnssrvRpcRecord *records,
72 			  uint16_t rec_count);
73 bool dns_name_match(const char *zone, const char *name, size_t *host_part_len);
74 WERROR dns_common_name2dn(struct ldb_context *samdb,
75 			  struct dns_server_zone *zones,
76 			  TALLOC_CTX *mem_ctx,
77 			  const char *name,
78 			  struct ldb_dn **_dn);
79 bool dns_name_equal(const char *name1, const char *name2);
80 
81 /*
82  * For this routine, base_dn is generally NULL.  The exception comes
83  * from the python bindings to support setting ACLs on DNS objects
84  * when joining Windows
85  */
86 NTSTATUS dns_common_zones(struct ldb_context *samdb,
87 			  TALLOC_CTX *mem_ctx,
88 			  struct ldb_dn *base_dn,
89 			  struct dns_server_zone **zones_ret);
90 
91 bool dns_zoneinfo_load_zone_property(struct dnsserver_zoneinfo *zoneinfo,
92 				     struct dnsp_DnsProperty *prop);
93 /*
94  * Log a DNS operation along with it's duration
95  * Enabled by setting a log level of "dns:10"
96  *
97  * const char *operation
98  * const char *result
99  * const struct timeval *start
100  * const char *zone
101  * const char *name
102  * const char *data
103  */
104 #define DNS_COMMON_LOG_OPERATION(result, start, zone, name, data) \
105 	if (CHECK_DEBUGLVLC(DBGC_DNS, DBGLVL_DEBUG)) { \
106 		struct timeval now = timeval_current(); \
107 		uint64_t duration = usec_time_diff(&now, (start));\
108 		const char *re = (result);\
109 		const char *zn = (zone); \
110 		const char *nm = (name); \
111 		const char *dt = (data); \
112 		DBG_DEBUG( \
113 			"DNS timing: result: [%s] duration: (%" PRIi64 ") " \
114 			"zone: [%s] name: [%s] data: [%s]\n", \
115 			re == NULL ? "" : re, \
116 			duration, \
117 			zn == NULL ? "" : zn, \
118 			nm == NULL ? "" : nm, \
119 			dt == NULL ? "" : dt); \
120 	}
121 
122 #endif /* __DNSSERVER_COMMON_H__ */
123