s4-rpc: dnsserver: Fix enumeration of IPv4 and IPv6 addresses
[samba.git] / source4 / rpc_server / dnsserver / dnsserver.h
1 /*
2    Unix SMB/CIFS implementation.
3
4    DNS Server
5
6    Copyright (C) Amitay Isaacs 2011
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 #ifndef __DNSSERVER_H__
23 #define __DNSSERVER_H__
24
25 #include "librpc/gen_ndr/dnsp.h"
26 #include "librpc/gen_ndr/dnsserver.h"
27 #include "param/param.h"
28 #include "ldb.h"
29
30 struct dnsserver_serverinfo {
31         uint32_t        dwVersion;
32         uint8_t         fBootMethod;
33         uint8_t         fAdminConfigured;
34         uint8_t         fAllowUpdate;
35         uint8_t         fDsAvailable;
36
37         char *          pszServerName;
38         char *          pszDsContainer;
39
40         uint32_t        dwDsForestVersion;
41         uint32_t        dwDsDomainVersion;
42         uint32_t        dwDsDsaVersion;
43         uint32_t        fReadOnlyDC;
44         char *          pszDomainName;
45         char *          pszForestName;
46         char *          pszDomainDirectoryPartition;
47         char *          pszForestDirectoryPartition;
48
49         struct DNS_ADDR_ARRAY * aipServerAddrs;
50         struct DNS_ADDR_ARRAY * aipListenAddrs;
51         struct IP4_ARRAY * aipForwarders;
52
53         struct IP4_ARRAY * aipLogFilter;
54         char *          pwszLogFilePath;
55
56         uint32_t        dwLogLevel;
57         uint32_t        dwDebugLevel;
58         uint32_t        dwEventLogLevel;
59         uint32_t        dwLogFileMaxSize;
60
61         uint32_t        dwForwardTimeout;
62         uint32_t        dwRpcProtocol;
63         uint32_t        dwNameCheckFlag;
64         uint32_t        cAddressAnswerLimit;
65         uint32_t        dwRecursionRetry;
66         uint32_t        dwRecursionTimeout;
67         uint32_t        dwMaxCacheTtl;
68         uint32_t        dwDsPollingInterval;
69         uint32_t        dwLocalNetPriorityNetMask;
70
71         uint32_t        dwScavengingInterval;
72         uint32_t        dwDefaultRefreshInterval;
73         uint32_t        dwDefaultNoRefreshInterval;
74         uint32_t        dwLastScavengeTime;
75
76         uint8_t         fAutoReverseZones;
77         uint8_t         fAutoCacheUpdate;
78
79         uint8_t         fRecurseAfterForwarding;
80         uint8_t         fForwardDelegations;
81         uint8_t         fNoRecursion;
82         uint8_t         fSecureResponses;
83
84         uint8_t         fRoundRobin;
85         uint8_t         fLocalNetPriority;
86
87         uint8_t         fBindSecondaries;
88         uint8_t         fWriteAuthorityNs;
89
90         uint8_t         fStrictFileParsing;
91         uint8_t         fLooseWildcarding;
92         uint8_t         fDefaultAgingState;
93 };
94
95 struct dnsserver_zoneinfo {
96         uint8_t         Version;
97         uint32_t        Flags;
98         uint8_t         dwZoneType;
99         uint8_t         fReverse;
100         uint8_t         fAllowUpdate;
101         uint8_t         fPaused;
102         uint8_t         fShutdown;
103         uint8_t         fAutoCreated;
104
105         uint8_t         fUseDatabase;
106         char *          pszDataFile;
107
108         struct IP4_ARRAY * aipMasters;
109
110         uint32_t        fSecureSecondaries;
111         uint32_t        fNotifyLevel;
112         struct IP4_ARRAY * aipSecondaries;
113         struct IP4_ARRAY * aipNotify;
114
115         uint32_t        fUseWins;
116         uint32_t        fUseNbstat;
117
118         uint32_t        fAging;
119         uint32_t        dwNoRefreshInterval;
120         uint32_t        dwRefreshInterval;
121         uint32_t        dwAvailForScavengeTime;
122         struct IP4_ARRAY * aipScavengeServers;
123
124         uint32_t        dwForwarderTimeout;
125         uint32_t        fForwarderSlave;
126
127         struct IP4_ARRAY * aipLocalMasters;
128
129         char *          pwszZoneDn;
130
131         uint32_t        dwLastSuccessfulSoaCheck;
132         uint32_t        dwLastSuccessfulXfr;
133
134         uint32_t        fQueuedForBackgroundLoad;
135         uint32_t        fBackgroundLoadInProgress;
136         uint8_t         fReadOnlyZone;
137
138         uint32_t        dwLastXfrAttempt;
139         uint32_t        dwLastXfrResult;
140 };
141
142
143 struct dnsserver_partition {
144         struct dnsserver_partition *prev, *next;
145         struct ldb_dn *partition_dn;
146         const char *pszDpFqdn;
147         uint32_t dwDpFlags;
148         bool is_forest;
149         int zones_count;
150 };
151
152
153 struct dnsserver_partition_info {
154         const char *pszCrDn;
155         uint32_t dwState;
156         uint32_t dwReplicaCount;
157         struct DNS_RPC_DP_REPLICA **ReplicaArray;
158 };
159
160
161 struct dnsserver_zone {
162         struct dnsserver_zone *prev, *next;
163         struct dnsserver_partition *partition;
164         const char *name;
165         struct ldb_dn *zone_dn;
166         struct dnsserver_zoneinfo *zoneinfo;
167 };
168
169
170 struct dns_tree {
171         const char *name;
172         int level;
173         unsigned int num_children;
174         struct dns_tree **children;
175         void *data;
176 };
177
178 /* Data structure manipulation functions from dnsdata.c */
179
180 struct IP4_ARRAY *ip4_array_copy(TALLOC_CTX *mem_ctx, struct IP4_ARRAY *ip4);
181 struct DNS_ADDR_ARRAY *ip4_array_to_dns_addr_array(TALLOC_CTX *mem_ctx, struct IP4_ARRAY *ip4);
182 struct IP4_ARRAY *dns_addr_array_to_ip4_array(TALLOC_CTX *mem_ctx,
183                                               struct DNS_ADDR_ARRAY *ip);
184 struct DNS_ADDR_ARRAY *dns_addr_array_copy(TALLOC_CTX *mem_ctx, struct DNS_ADDR_ARRAY *addr);
185
186 int dns_split_name_components(TALLOC_CTX *mem_ctx, const char *name, char ***components);
187 char *dns_split_node_name(TALLOC_CTX *mem_ctx, const char *node_name, const char *zone_name);
188
189 int dns_name_compare(const struct ldb_message **m1, const struct ldb_message **m2,
190                         char *search_name);
191 bool dns_name_equal(const char *name1, const char *name2);
192 bool dns_record_match(struct dnsp_DnssrvRpcRecord *rec1, struct dnsp_DnssrvRpcRecord *rec2);
193
194 void dnsp_to_dns_copy(TALLOC_CTX *mem_ctx, struct dnsp_DnssrvRpcRecord *dnsp,
195                         struct DNS_RPC_RECORD *dns);
196 struct dnsp_DnssrvRpcRecord *dns_to_dnsp_copy(TALLOC_CTX *mem_ctx, struct DNS_RPC_RECORD *dns);
197
198 struct dns_tree *dns_build_tree(TALLOC_CTX *mem_ctx, const char *name, struct ldb_result *res);
199 WERROR dns_fill_records_array(TALLOC_CTX *mem_ctx, struct dnsserver_zone *z,
200                         enum dns_record_type record_type,
201                         unsigned int select_flag, const char *zone_name,
202                         struct ldb_message *msg, int num_children,
203                         struct DNS_RPC_RECORDS_ARRAY *recs,
204                         char ***add_names, int *add_count);
205
206
207 /* Utility functions from dnsutils.c */
208
209 struct dnsserver_serverinfo *dnsserver_init_serverinfo(TALLOC_CTX *mem_ctx,
210                                         struct loadparm_context *lp_ctx,
211                                         struct ldb_context *samdb);
212 struct dnsserver_zoneinfo *dnsserver_init_zoneinfo(struct dnsserver_zone *zone,
213                                         struct dnsserver_serverinfo *serverinfo);
214 struct dnsserver_partition *dnsserver_find_partition(struct dnsserver_partition *partitions,
215                                         const char *dp_fqdn);
216 struct dnsserver_zone *dnsserver_find_zone(struct dnsserver_zone *zones,
217                                         const char *zone_name);
218 struct ldb_dn *dnsserver_name_to_dn(TALLOC_CTX *mem_ctx, struct dnsserver_zone *z,
219                                         const char *name);
220 uint32_t dnsserver_zone_to_request_filter(const char *zone);
221
222 /* Database functions from dnsdb.c */
223
224 struct dnsserver_partition *dnsserver_db_enumerate_partitions(TALLOC_CTX *mem_ctx,
225                                         struct dnsserver_serverinfo *serverinfo,
226                                         struct ldb_context *samdb);
227 struct dnsserver_zone *dnsserver_db_enumerate_zones(TALLOC_CTX *mem_ctx,
228                                         struct ldb_context *samdb,
229                                         struct dnsserver_partition *p);
230 struct dnsserver_partition_info *dnsserver_db_partition_info(TALLOC_CTX *mem_ctx,
231                                         struct ldb_context *samdb,
232                                         struct dnsserver_partition *p);
233 WERROR dnsserver_db_add_empty_node(TALLOC_CTX *mem_ctx,
234                                         struct ldb_context *samdb,
235                                         struct dnsserver_zone *z,
236                                         const char *node_name);
237 WERROR dnsserver_db_add_record(TALLOC_CTX *mem_ctx,
238                                         struct ldb_context *samdb,
239                                         struct dnsserver_zone *z,
240                                         const char *node_name,
241                                         struct DNS_RPC_RECORD *add_record);
242 WERROR dnsserver_db_update_record(TALLOC_CTX *mem_ctx,
243                                         struct ldb_context *samdb,
244                                         struct dnsserver_zone *z,
245                                         const char *node_name,
246                                         struct DNS_RPC_RECORD *add_record,
247                                         struct DNS_RPC_RECORD *del_record);
248 WERROR dnsserver_db_delete_record(TALLOC_CTX *mem_ctx,
249                                         struct ldb_context *samdb,
250                                         struct dnsserver_zone *z,
251                                         const char *node_name,
252                                         struct DNS_RPC_RECORD *del_record);
253 WERROR dnsserver_db_create_zone(struct ldb_context *samdb,
254                                 struct dnsserver_partition *partitions,
255                                 struct dnsserver_zone *z,
256                                 struct loadparm_context *lp_ctx);
257 WERROR dnsserver_db_delete_zone(struct ldb_context *samdb,
258                                 struct dnsserver_zone *z);
259
260 #endif /* __DNSSERVER_H__ */