s4 dns_server Bind9: Log opertion durations
[samba.git] / source4 / dns_server / dnsserver_common.h
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__ */