xref: /minix3/external/bsd/bind/dist/contrib/dlz/modules/include/dlz_minimal.h (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: dlz_minimal.h,v 1.1.1.3 2014/12/10 03:34:31 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2011  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the
8*00b67f09SDavid van Moolenbroek  * above copyright notice and this permission notice appear in all
9*00b67f09SDavid van Moolenbroek  * copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR
12*00b67f09SDavid van Moolenbroek  * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
13*00b67f09SDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
14*00b67f09SDavid van Moolenbroek  * THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
15*00b67f09SDavid van Moolenbroek  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
16*00b67f09SDavid van Moolenbroek  * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
17*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
18*00b67f09SDavid van Moolenbroek  * USE OR PERFORMANCE OF THIS SOFTWARE.
19*00b67f09SDavid van Moolenbroek  */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek /*
22*00b67f09SDavid van Moolenbroek  * This header provides a minimal set of defines and typedefs needed
23*00b67f09SDavid van Moolenbroek  * for building an external DLZ module for bind9. When creating a new
24*00b67f09SDavid van Moolenbroek  * external DLZ driver, please copy this header into your own source
25*00b67f09SDavid van Moolenbroek  * tree.
26*00b67f09SDavid van Moolenbroek  */
27*00b67f09SDavid van Moolenbroek 
28*00b67f09SDavid van Moolenbroek #ifndef DLZ_MINIMAL_H
29*00b67f09SDavid van Moolenbroek #define DLZ_MINIMAL_H 1
30*00b67f09SDavid van Moolenbroek 
31*00b67f09SDavid van Moolenbroek #include <sys/types.h>
32*00b67f09SDavid van Moolenbroek #include <sys/socket.h>
33*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVESYSUNH
34*00b67f09SDavid van Moolenbroek #include <sys/un.h>
35*00b67f09SDavid van Moolenbroek #endif
36*00b67f09SDavid van Moolenbroek #include <net/if.h>
37*00b67f09SDavid van Moolenbroek #include <netinet/in.h>
38*00b67f09SDavid van Moolenbroek #include <arpa/inet.h>
39*00b67f09SDavid van Moolenbroek 
40*00b67f09SDavid van Moolenbroek typedef unsigned int isc_result_t;
41*00b67f09SDavid van Moolenbroek typedef int isc_boolean_t;
42*00b67f09SDavid van Moolenbroek typedef uint32_t dns_ttl_t;
43*00b67f09SDavid van Moolenbroek 
44*00b67f09SDavid van Moolenbroek /*
45*00b67f09SDavid van Moolenbroek  * Define DLZ_DLOPEN_VERSION to different values to use older versions
46*00b67f09SDavid van Moolenbroek  * of the interface
47*00b67f09SDavid van Moolenbroek  */
48*00b67f09SDavid van Moolenbroek #ifndef DLZ_DLOPEN_VERSION
49*00b67f09SDavid van Moolenbroek #define DLZ_DLOPEN_VERSION 3
50*00b67f09SDavid van Moolenbroek #define DLZ_DLOPEN_AGE 0
51*00b67f09SDavid van Moolenbroek #endif
52*00b67f09SDavid van Moolenbroek 
53*00b67f09SDavid van Moolenbroek /* return these in flags from dlz_version() */
54*00b67f09SDavid van Moolenbroek #define DNS_SDLZFLAG_THREADSAFE		0x00000001U
55*00b67f09SDavid van Moolenbroek #define DNS_SDLZFLAG_RELATIVEOWNER	0x00000002U
56*00b67f09SDavid van Moolenbroek #define DNS_SDLZFLAG_RELATIVERDATA	0x00000004U
57*00b67f09SDavid van Moolenbroek 
58*00b67f09SDavid van Moolenbroek /* result codes */
59*00b67f09SDavid van Moolenbroek #define ISC_R_SUCCESS			0
60*00b67f09SDavid van Moolenbroek #define ISC_R_NOMEMORY			1
61*00b67f09SDavid van Moolenbroek #define ISC_R_NOPERM			6
62*00b67f09SDavid van Moolenbroek #define ISC_R_NOSPACE			19
63*00b67f09SDavid van Moolenbroek #define ISC_R_NOTFOUND			23
64*00b67f09SDavid van Moolenbroek #define ISC_R_FAILURE			25
65*00b67f09SDavid van Moolenbroek #define ISC_R_NOTIMPLEMENTED		27
66*00b67f09SDavid van Moolenbroek #define ISC_R_NOMORE			29
67*00b67f09SDavid van Moolenbroek #define ISC_R_INVALIDFILE		30
68*00b67f09SDavid van Moolenbroek #define ISC_R_UNEXPECTED		34
69*00b67f09SDavid van Moolenbroek #define ISC_R_FILENOTFOUND		38
70*00b67f09SDavid van Moolenbroek 
71*00b67f09SDavid van Moolenbroek /* boolean values */
72*00b67f09SDavid van Moolenbroek #define ISC_TRUE 1
73*00b67f09SDavid van Moolenbroek #define ISC_FALSE 0
74*00b67f09SDavid van Moolenbroek 
75*00b67f09SDavid van Moolenbroek /* log levels */
76*00b67f09SDavid van Moolenbroek #define ISC_LOG_INFO		(-1)
77*00b67f09SDavid van Moolenbroek #define ISC_LOG_NOTICE		(-2)
78*00b67f09SDavid van Moolenbroek #define ISC_LOG_WARNING 	(-3)
79*00b67f09SDavid van Moolenbroek #define ISC_LOG_ERROR		(-4)
80*00b67f09SDavid van Moolenbroek #define ISC_LOG_CRITICAL	(-5)
81*00b67f09SDavid van Moolenbroek #define ISC_LOG_DEBUG(level)	(level)
82*00b67f09SDavid van Moolenbroek 
83*00b67f09SDavid van Moolenbroek /* other useful definitions */
84*00b67f09SDavid van Moolenbroek #define UNUSED(x) (void)(x)
85*00b67f09SDavid van Moolenbroek 
86*00b67f09SDavid van Moolenbroek /* opaque structures */
87*00b67f09SDavid van Moolenbroek typedef void *dns_sdlzlookup_t;
88*00b67f09SDavid van Moolenbroek typedef void *dns_sdlzallnodes_t;
89*00b67f09SDavid van Moolenbroek typedef void *dns_view_t;
90*00b67f09SDavid van Moolenbroek typedef void *dns_dlzdb_t;
91*00b67f09SDavid van Moolenbroek 
92*00b67f09SDavid van Moolenbroek #if DLZ_DLOPEN_VERSION > 1
93*00b67f09SDavid van Moolenbroek /*
94*00b67f09SDavid van Moolenbroek  * Method and type definitions needed for retrieval of client info
95*00b67f09SDavid van Moolenbroek  * from the caller.
96*00b67f09SDavid van Moolenbroek  */
97*00b67f09SDavid van Moolenbroek typedef struct isc_sockaddr {
98*00b67f09SDavid van Moolenbroek 	union {
99*00b67f09SDavid van Moolenbroek 		struct sockaddr         sa;
100*00b67f09SDavid van Moolenbroek 		struct sockaddr_in      sin;
101*00b67f09SDavid van Moolenbroek 		struct sockaddr_in6     sin6;
102*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVESYSUNH
103*00b67f09SDavid van Moolenbroek 		struct sockaddr_un      sunix;
104*00b67f09SDavid van Moolenbroek #endif
105*00b67f09SDavid van Moolenbroek 	}                               type;
106*00b67f09SDavid van Moolenbroek 	unsigned int                    length;
107*00b67f09SDavid van Moolenbroek 	void *                          link;
108*00b67f09SDavid van Moolenbroek } isc_sockaddr_t;
109*00b67f09SDavid van Moolenbroek 
110*00b67f09SDavid van Moolenbroek #define DNS_CLIENTINFO_VERSION 1
111*00b67f09SDavid van Moolenbroek typedef struct dns_clientinfo {
112*00b67f09SDavid van Moolenbroek 	uint16_t version;
113*00b67f09SDavid van Moolenbroek 	void *data;
114*00b67f09SDavid van Moolenbroek } dns_clientinfo_t;
115*00b67f09SDavid van Moolenbroek 
116*00b67f09SDavid van Moolenbroek typedef isc_result_t (*dns_clientinfo_sourceip_t)(dns_clientinfo_t *client,
117*00b67f09SDavid van Moolenbroek 						  isc_sockaddr_t **addrp);
118*00b67f09SDavid van Moolenbroek 
119*00b67f09SDavid van Moolenbroek #define DNS_CLIENTINFOMETHODS_VERSION 1
120*00b67f09SDavid van Moolenbroek #define DNS_CLIENTINFOMETHODS_AGE 0
121*00b67f09SDavid van Moolenbroek 
122*00b67f09SDavid van Moolenbroek typedef struct dns_clientinfomethods {
123*00b67f09SDavid van Moolenbroek 	uint16_t version;
124*00b67f09SDavid van Moolenbroek 	uint16_t age;
125*00b67f09SDavid van Moolenbroek 	dns_clientinfo_sourceip_t sourceip;
126*00b67f09SDavid van Moolenbroek } dns_clientinfomethods_t;
127*00b67f09SDavid van Moolenbroek #endif /* DLZ_DLOPEN_VERSION > 1 */
128*00b67f09SDavid van Moolenbroek 
129*00b67f09SDavid van Moolenbroek /*
130*00b67f09SDavid van Moolenbroek  * Method definitions for callbacks provided by the dlopen driver
131*00b67f09SDavid van Moolenbroek  */
132*00b67f09SDavid van Moolenbroek typedef void log_t(int level, const char *fmt, ...);
133*00b67f09SDavid van Moolenbroek 
134*00b67f09SDavid van Moolenbroek typedef isc_result_t dns_sdlz_putrr_t(dns_sdlzlookup_t *lookup,
135*00b67f09SDavid van Moolenbroek 				      const char *type,
136*00b67f09SDavid van Moolenbroek 				      dns_ttl_t ttl,
137*00b67f09SDavid van Moolenbroek 				      const char *data);
138*00b67f09SDavid van Moolenbroek 
139*00b67f09SDavid van Moolenbroek typedef isc_result_t dns_sdlz_putnamedrr_t(dns_sdlzallnodes_t *allnodes,
140*00b67f09SDavid van Moolenbroek 					   const char *name,
141*00b67f09SDavid van Moolenbroek 					   const char *type,
142*00b67f09SDavid van Moolenbroek 					   dns_ttl_t ttl,
143*00b67f09SDavid van Moolenbroek 					   const char *data);
144*00b67f09SDavid van Moolenbroek 
145*00b67f09SDavid van Moolenbroek #if DLZ_DLOPEN_VERSION < 3
146*00b67f09SDavid van Moolenbroek typedef isc_result_t dns_dlz_writeablezone_t(dns_view_t *view,
147*00b67f09SDavid van Moolenbroek 					     const char *zone_name);
148*00b67f09SDavid van Moolenbroek #else /* DLZ_DLOPEN_VERSION >= 3 */
149*00b67f09SDavid van Moolenbroek typedef isc_result_t dns_dlz_writeablezone_t(dns_view_t *view,
150*00b67f09SDavid van Moolenbroek 					     dns_dlzdb_t *dlzdb,
151*00b67f09SDavid van Moolenbroek 					     const char *zone_name);
152*00b67f09SDavid van Moolenbroek #endif /* DLZ_DLOPEN_VERSION */
153*00b67f09SDavid van Moolenbroek 
154*00b67f09SDavid van Moolenbroek /*
155*00b67f09SDavid van Moolenbroek  * prototypes for the functions you can include in your module
156*00b67f09SDavid van Moolenbroek  */
157*00b67f09SDavid van Moolenbroek 
158*00b67f09SDavid van Moolenbroek /*
159*00b67f09SDavid van Moolenbroek  * dlz_version() is required for all DLZ external drivers. It should
160*00b67f09SDavid van Moolenbroek  * return DLZ_DLOPEN_VERSION.  'flags' is updated to indicate capabilities
161*00b67f09SDavid van Moolenbroek  * of the module.  In particular, if the module is thread-safe then it
162*00b67f09SDavid van Moolenbroek  * sets 'flags' to include DNS_SDLZFLAG_THREADSAFE.  Other capability
163*00b67f09SDavid van Moolenbroek  * flags may be added in the future.
164*00b67f09SDavid van Moolenbroek  */
165*00b67f09SDavid van Moolenbroek int
166*00b67f09SDavid van Moolenbroek dlz_version(unsigned int *flags);
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek /*
169*00b67f09SDavid van Moolenbroek  * dlz_create() is required for all DLZ external drivers.
170*00b67f09SDavid van Moolenbroek  */
171*00b67f09SDavid van Moolenbroek isc_result_t
172*00b67f09SDavid van Moolenbroek dlz_create(const char *dlzname, unsigned int argc, char *argv[],
173*00b67f09SDavid van Moolenbroek 	   void **dbdata, ...);
174*00b67f09SDavid van Moolenbroek 
175*00b67f09SDavid van Moolenbroek /*
176*00b67f09SDavid van Moolenbroek  * dlz_destroy() is optional, and will be called when the driver is
177*00b67f09SDavid van Moolenbroek  * unloaded if supplied
178*00b67f09SDavid van Moolenbroek  */
179*00b67f09SDavid van Moolenbroek void
180*00b67f09SDavid van Moolenbroek dlz_destroy(void *dbdata);
181*00b67f09SDavid van Moolenbroek 
182*00b67f09SDavid van Moolenbroek /*
183*00b67f09SDavid van Moolenbroek  * dlz_findzonedb is required for all DLZ external drivers
184*00b67f09SDavid van Moolenbroek  */
185*00b67f09SDavid van Moolenbroek #if DLZ_DLOPEN_VERSION < 3
186*00b67f09SDavid van Moolenbroek isc_result_t
187*00b67f09SDavid van Moolenbroek dlz_findzonedb(void *dbdata, const char *name);
188*00b67f09SDavid van Moolenbroek #else /* DLZ_DLOPEN_VERSION >= 3 */
189*00b67f09SDavid van Moolenbroek isc_result_t
190*00b67f09SDavid van Moolenbroek dlz_findzonedb(void *dbdata, const char *name,
191*00b67f09SDavid van Moolenbroek 	       dns_clientinfomethods_t *methods,
192*00b67f09SDavid van Moolenbroek 	       dns_clientinfo_t *clientinfo);
193*00b67f09SDavid van Moolenbroek #endif /* DLZ_DLOPEN_VERSION */
194*00b67f09SDavid van Moolenbroek 
195*00b67f09SDavid van Moolenbroek /*
196*00b67f09SDavid van Moolenbroek  * dlz_lookup is required for all DLZ external drivers
197*00b67f09SDavid van Moolenbroek  */
198*00b67f09SDavid van Moolenbroek #if DLZ_DLOPEN_VERSION == 1
199*00b67f09SDavid van Moolenbroek isc_result_t
200*00b67f09SDavid van Moolenbroek dlz_lookup(const char *zone, const char *name, void *dbdata,
201*00b67f09SDavid van Moolenbroek 	   dns_sdlzlookup_t *lookup);
202*00b67f09SDavid van Moolenbroek #else /* DLZ_DLOPEN_VERSION > 1 */
203*00b67f09SDavid van Moolenbroek isc_result_t
204*00b67f09SDavid van Moolenbroek dlz_lookup(const char *zone, const char *name, void *dbdata,
205*00b67f09SDavid van Moolenbroek 	   dns_sdlzlookup_t *lookup,
206*00b67f09SDavid van Moolenbroek 	   dns_clientinfomethods_t *methods,
207*00b67f09SDavid van Moolenbroek 	   dns_clientinfo_t *clientinfo);
208*00b67f09SDavid van Moolenbroek #endif /* DLZ_DLOPEN_VERSION */
209*00b67f09SDavid van Moolenbroek 
210*00b67f09SDavid van Moolenbroek /*
211*00b67f09SDavid van Moolenbroek  * dlz_authority() is optional if dlz_lookup() supplies
212*00b67f09SDavid van Moolenbroek  * authority information (i.e., SOA, NS) for the dns record
213*00b67f09SDavid van Moolenbroek  */
214*00b67f09SDavid van Moolenbroek isc_result_t
215*00b67f09SDavid van Moolenbroek dlz_authority(const char *zone, void *dbdata, dns_sdlzlookup_t *lookup);
216*00b67f09SDavid van Moolenbroek 
217*00b67f09SDavid van Moolenbroek /*
218*00b67f09SDavid van Moolenbroek  * dlz_allowzonexfr() is optional, and should be supplied if you want to
219*00b67f09SDavid van Moolenbroek  * support zone transfers
220*00b67f09SDavid van Moolenbroek  */
221*00b67f09SDavid van Moolenbroek isc_result_t
222*00b67f09SDavid van Moolenbroek dlz_allowzonexfr(void *dbdata, const char *name, const char *client);
223*00b67f09SDavid van Moolenbroek 
224*00b67f09SDavid van Moolenbroek /*
225*00b67f09SDavid van Moolenbroek  * dlz_allnodes() is optional, but must be supplied if supply a
226*00b67f09SDavid van Moolenbroek  * dlz_allowzonexfr() function
227*00b67f09SDavid van Moolenbroek  */
228*00b67f09SDavid van Moolenbroek isc_result_t
229*00b67f09SDavid van Moolenbroek dlz_allnodes(const char *zone, void *dbdata, dns_sdlzallnodes_t *allnodes);
230*00b67f09SDavid van Moolenbroek 
231*00b67f09SDavid van Moolenbroek /*
232*00b67f09SDavid van Moolenbroek  * dlz_newversion() is optional. It should be supplied if you want to
233*00b67f09SDavid van Moolenbroek  * support dynamic updates.
234*00b67f09SDavid van Moolenbroek  */
235*00b67f09SDavid van Moolenbroek isc_result_t
236*00b67f09SDavid van Moolenbroek dlz_newversion(const char *zone, void *dbdata, void **versionp);
237*00b67f09SDavid van Moolenbroek 
238*00b67f09SDavid van Moolenbroek /*
239*00b67f09SDavid van Moolenbroek  * dlz_closeversion() is optional, but must be supplied if you supply a
240*00b67f09SDavid van Moolenbroek  * dlz_newversion() function
241*00b67f09SDavid van Moolenbroek  */
242*00b67f09SDavid van Moolenbroek void
243*00b67f09SDavid van Moolenbroek dlz_closeversion(const char *zone, isc_boolean_t commit, void *dbdata,
244*00b67f09SDavid van Moolenbroek 		 void **versionp);
245*00b67f09SDavid van Moolenbroek 
246*00b67f09SDavid van Moolenbroek /*
247*00b67f09SDavid van Moolenbroek  * dlz_configure() is optional, but must be supplied if you want to support
248*00b67f09SDavid van Moolenbroek  * dynamic updates
249*00b67f09SDavid van Moolenbroek  */
250*00b67f09SDavid van Moolenbroek #if DLZ_DLOPEN_VERSION < 3
251*00b67f09SDavid van Moolenbroek isc_result_t
252*00b67f09SDavid van Moolenbroek dlz_configure(dns_view_t *view, void *dbdata);
253*00b67f09SDavid van Moolenbroek #else /* DLZ_DLOPEN_VERSION >= 3 */
254*00b67f09SDavid van Moolenbroek isc_result_t
255*00b67f09SDavid van Moolenbroek dlz_configure(dns_view_t *view, dns_dlzdb_t *dlzdb, void *dbdata);
256*00b67f09SDavid van Moolenbroek #endif /* DLZ_DLOPEN_VERSION */
257*00b67f09SDavid van Moolenbroek 
258*00b67f09SDavid van Moolenbroek /*
259*00b67f09SDavid van Moolenbroek  * dlz_ssumatch() is optional, but must be supplied if you want to support
260*00b67f09SDavid van Moolenbroek  * dynamic updates
261*00b67f09SDavid van Moolenbroek  */
262*00b67f09SDavid van Moolenbroek isc_boolean_t
263*00b67f09SDavid van Moolenbroek dlz_ssumatch(const char *signer, const char *name, const char *tcpaddr,
264*00b67f09SDavid van Moolenbroek 	     const char *type, const char *key, uint32_t keydatalen,
265*00b67f09SDavid van Moolenbroek 	     uint8_t *keydata, void *dbdata);
266*00b67f09SDavid van Moolenbroek 
267*00b67f09SDavid van Moolenbroek /*
268*00b67f09SDavid van Moolenbroek  * dlz_addrdataset() is optional, but must be supplied if you want to
269*00b67f09SDavid van Moolenbroek  * support dynamic updates
270*00b67f09SDavid van Moolenbroek  */
271*00b67f09SDavid van Moolenbroek isc_result_t
272*00b67f09SDavid van Moolenbroek dlz_addrdataset(const char *name, const char *rdatastr, void *dbdata,
273*00b67f09SDavid van Moolenbroek 		void *version);
274*00b67f09SDavid van Moolenbroek 
275*00b67f09SDavid van Moolenbroek /*
276*00b67f09SDavid van Moolenbroek  * dlz_subrdataset() is optional, but must be supplied if you want to
277*00b67f09SDavid van Moolenbroek  * support dynamic updates
278*00b67f09SDavid van Moolenbroek  */
279*00b67f09SDavid van Moolenbroek isc_result_t
280*00b67f09SDavid van Moolenbroek dlz_subrdataset(const char *name, const char *rdatastr, void *dbdata,
281*00b67f09SDavid van Moolenbroek 		void *version);
282*00b67f09SDavid van Moolenbroek 
283*00b67f09SDavid van Moolenbroek /*
284*00b67f09SDavid van Moolenbroek  * dlz_delrdataset() is optional, but must be supplied if you want to
285*00b67f09SDavid van Moolenbroek  * support dynamic updates
286*00b67f09SDavid van Moolenbroek  */
287*00b67f09SDavid van Moolenbroek isc_result_t
288*00b67f09SDavid van Moolenbroek dlz_delrdataset(const char *name, const char *type, void *dbdata,
289*00b67f09SDavid van Moolenbroek 		void *version);
290*00b67f09SDavid van Moolenbroek 
291*00b67f09SDavid van Moolenbroek #endif /* DLZ_MINIMAL_H */
292