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