/usr/include/gdnsd/plugapi.h is in gdnsd-dev 1.11.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | /* Copyright © 2012 Brandon L Black <blblack@gmail.com>
*
* This file is part of gdnsd.
*
* gdnsd is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gdnsd is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gdnsd. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef GDNSD_PLUGAPI_H
#define GDNSD_PLUGAPI_H
// for uint8_t
#include <inttypes.h>
// For struct ev_loop
#include <ev.h>
// For vscf_data_t
#include <gdnsd/vscf.h>
// For anysin_t
#include <gdnsd/net.h>
// For mon_list_t
#include <gdnsd/mon.h>
/***
* Plugin API version, bumped on any change that's not backwards-compat.
* This is hardcoded as a the return value of plugin_foo_get_api_version()
* in gdnsd/plugin.h, and also compiled into the gdnsd code. The two
* values are compared at plugin load time to ensure that plugin code
* which doesn't match the API of the gdnsd binary is not allowed.
* (Of course, in many cases the plugin never even makes it that far,
* because libgdnsd is missing symbols it wants to link against that
* were dropped in the new API. This is just to protect other cases).
***/
#define GDNSD_PLUGIN_API_VERSION 12
/*** Data Types ***/
// read-only for plugins
typedef struct {
anysin_t dns_source;
anysin_t edns_client;
unsigned edns_client_mask; // if zero, edns_client is invalid (was not sent), do not parse it.
} client_info_t;
// Result structure for dynamic address resolution plugins
typedef struct {
uint32_t ttl; // from zonefile, can modify
unsigned edns_scope_mask; // inits to zero.
// If your plugin ignores (or ignored in this case) all of client_info_t, leave it zero
// If your plugin uses client_info_t.dns_source but ignores (or doesn't use for this
// request) .edns_source, you must set edns_scope_mask = client_info_t.edns_client_mask
// If your plugin actually uses client_info_t.edns_client, set as appropriate...
unsigned count_v4;
unsigned count_v6;
uint32_t addrs_v4[64];
uint8_t addrs_v6[64 * 16];
} dynaddr_result_t;
// Result structure for dynamic cname resolution plugins
typedef struct {
uint32_t ttl;
unsigned edns_scope_mask;
// dname pointer is already set, it points at the storage
// you should copy your result to. Do *not* overwrite
// this with a new pointer (the const should make that
// fail anyways).
uint8_t* const dname;
} dyncname_result_t;
// Push an anysin_t onto a dynaddr_result_t. Handles both families, asserts
// overall count limits.
F_NONNULL
void gdnsd_dynaddr_add_result_anysin(dynaddr_result_t* result, const anysin_t* asin);
/**** Typedefs for plugin callbacks ****/
typedef unsigned (*gdnsd_apiv_cb_t)(void);
typedef mon_list_t* (*gdnsd_load_config_cb_t)(const vscf_data_t* pc);
typedef int (*gdnsd_map_resource_dyna_cb_t)(const char* resname);
typedef int (*gdnsd_map_resource_dync_cb_t)(const char* resname, const uint8_t* origin);
typedef void (*gdnsd_full_config_cb_t)(unsigned num_threads);
typedef void (*gdnsd_pre_privdrop_cb_t)(void);
typedef void (*gdnsd_post_daemonize_cb_t)(void);
typedef void (*gdnsd_pre_run_cb_t)(struct ev_loop* loop);
typedef void (*gdnsd_iothread_init_cb_t)(unsigned threadnum);
typedef bool (*gdnsd_resolve_dynaddr_cb_t)(unsigned threadnum, unsigned resnum, const client_info_t* cinfo, dynaddr_result_t* result);
typedef void (*gdnsd_resolve_dyncname_cb_t)(unsigned threadnum, unsigned resnum, const uint8_t* origin, const client_info_t* cinfo, dyncname_result_t* result);
typedef void (*gdnsd_exit_cb_t)(void);
/**** New callbacks for monitoring plugins ****/
typedef void (*gdnsd_add_svctype_cb_t)(const char* name, const vscf_data_t* svc_cfg, const unsigned interval, const unsigned timeout);
typedef void (*gdnsd_add_monitor_cb_t)(const char* svc_name, mon_smgr_t* smgr);
typedef void (*gdnsd_init_monitors_cb_t)(struct ev_loop* mon_loop);
typedef void (*gdnsd_start_monitors_cb_t)(struct ev_loop* mon_loop);
// This is the data type for a plugin itself, holding function
// pointers for all of the possibly documented callbacks
typedef struct {
const char* name;
gdnsd_load_config_cb_t load_config;
gdnsd_full_config_cb_t full_config;
gdnsd_map_resource_dyna_cb_t map_resource_dyna;
gdnsd_map_resource_dync_cb_t map_resource_dync;
gdnsd_post_daemonize_cb_t post_daemonize;
gdnsd_pre_privdrop_cb_t pre_privdrop;
gdnsd_pre_run_cb_t pre_run;
gdnsd_iothread_init_cb_t iothread_init;
gdnsd_resolve_dynaddr_cb_t resolve_dynaddr;
gdnsd_resolve_dyncname_cb_t resolve_dyncname;
gdnsd_exit_cb_t exit;
gdnsd_add_svctype_cb_t add_svctype;
gdnsd_add_monitor_cb_t add_monitor;
gdnsd_init_monitors_cb_t init_monitors;
gdnsd_start_monitors_cb_t start_monitors;
} plugin_t;
// Find a(nother) plugin by name. Not valid at load_config() time,
// use during full_config() ideally, or later if you must.
F_NONNULL F_PURE
const plugin_t* gdnsd_plugin_find(const char* plugin_name);
#endif // GDNSD_PLUGINAPI_H
|