}
if (plugin_list != NULL) {
- ns_hook_data_t hookdata = { .source = NS_HOOKSOURCE_VIEW };
+ ns_hook_data_t hookdata = {
+ .pluginregister_ctx = { .source = NS_HOOKSOURCE_VIEW }
+ };
INSIST(view->hooktable == NULL);
ns_hooktable_create(view->mctx, &hookdata.hooktable);
}
if (tpluginlist != NULL || zpluginlist != NULL) {
- ns_hook_data_t hookdata = { .source = NS_HOOKSOURCE_ZONE };
+ ns_hook_data_t hookdata = {
+ .pluginregister_ctx = { .source = NS_HOOKSOURCE_ZONE,
+ .origin = dns_zone_getorigin(
+ zone) }
+ };
isc_mem_t *zmctx = dns_zone_getmctx(zone);
ns_hooktable_create(zmctx, &hookdata.hooktable);
isc_result_t
plugin_register(const char *parameters, const void *cfg, const char *cfg_file,
unsigned long cfg_line, isc_mem_t *mctx, void *aclctx,
- ns_hooktable_t *hooktable, ns_hooksource_t source,
+ ns_hooktable_t *hooktable, const ns_pluginregister_ctx_t *ctx,
void **instp) {
filter_instance_t *inst = NULL;
isc_result_t result = ISC_R_SUCCESS;
- UNUSED(source);
+ UNUSED(ctx);
isc_log_write(NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_HOOKS, ISC_LOG_INFO,
"registering 'filter-a' "
isc_result_t
plugin_check(const char *parameters, const void *cfg, const char *cfg_file,
unsigned long cfg_line, isc_mem_t *mctx, void *aclctx,
- ns_hooksource_t source ISC_ATTR_UNUSED) {
+ const ns_pluginregister_ctx_t *ctx ISC_ATTR_UNUSED) {
isc_result_t result = ISC_R_SUCCESS;
cfg_parser_t *parser = NULL;
cfg_obj_t *param_obj = NULL;
isc_result_t
plugin_register(const char *parameters, const void *cfg, const char *cfg_file,
unsigned long cfg_line, isc_mem_t *mctx, void *aclctx,
- ns_hooktable_t *hooktable, ns_hooksource_t source,
+ ns_hooktable_t *hooktable, const ns_pluginregister_ctx_t *ctx,
void **instp) {
filter_instance_t *inst = NULL;
isc_result_t result = ISC_R_SUCCESS;
- UNUSED(source);
+ UNUSED(ctx);
isc_log_write(NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_HOOKS, ISC_LOG_INFO,
"registering 'filter-aaaa' "
isc_result_t
plugin_check(const char *parameters, const void *cfg, const char *cfg_file,
unsigned long cfg_line, isc_mem_t *mctx, void *aclctx,
- ns_hooksource_t source ISC_ATTR_UNUSED) {
+ const ns_pluginregister_ctx_t *ctx ISC_ATTR_UNUSED) {
isc_result_t result = ISC_R_SUCCESS;
cfg_parser_t *parser = NULL;
cfg_obj_t *param_obj = NULL;
isc_result_t
plugin_register(const char *parameters, const void *cfg, const char *cfg_file,
unsigned long cfg_line, isc_mem_t *mctx, void *aclctx,
- ns_hooktable_t *hooktable, ns_hooksource_t source,
+ ns_hooktable_t *hooktable, const ns_pluginregister_ctx_t *ctx,
void **instp) {
async_instance_t *inst = NULL;
- UNUSED(source);
UNUSED(parameters);
UNUSED(cfg);
UNUSED(aclctx);
+ UNUSED(ctx);
isc_log_write(NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_HOOKS, ISC_LOG_INFO,
"registering 'test-async' module from %s:%lu", cfg_file,
isc_result_t
plugin_check(const char *parameters, const void *cfg, const char *cfg_file,
unsigned long cfg_line, isc_mem_t *mctx, void *aclctx,
- ns_hooksource_t source) {
+ const ns_pluginregister_ctx_t *ctx) {
UNUSED(parameters);
UNUSED(cfg);
UNUSED(cfg_file);
UNUSED(cfg_line);
UNUSED(mctx);
UNUSED(aclctx);
- UNUSED(source);
+ UNUSED(ctx);
return ISC_R_SUCCESS;
}
isc_result_t
plugin_register(const char *parameters, const void *cfg, const char *cfgfile,
unsigned long cfgline, isc_mem_t *mctx, void *aclctx,
- ns_hooktable_t *hooktable, ns_hooksource_t source,
+ ns_hooktable_t *hooktable, const ns_pluginregister_ctx_t *ctx,
void **instp) {
isc_result_t result;
cfg_parser_t *parser = NULL;
ns_hook_t hook;
syncplugin_t *inst = NULL;
char *sourcestr = NULL;
+ dns_name_t example2com;
+ dns_name_t example3com;
+ dns_name_t example4com;
UNUSED(cfg);
UNUSED(aclctx);
- UNUSED(source);
+ UNUSED(ctx);
inst = isc_mem_get(mctx, sizeof(*inst));
*inst = (syncplugin_t){ .mctx = mctx };
sourcestr = obj->value.string.base;
if (strcmp(sourcestr, "zone") == 0) {
- if (source != NS_HOOKSOURCE_ZONE) {
+ if (ctx->source != NS_HOOKSOURCE_ZONE) {
result = ISC_R_FAILURE;
goto cleanup;
}
+ if (ctx->origin == NULL) {
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
+ dns_name_init(&example2com);
+ dns_name_init(&example3com);
+ dns_name_init(&example4com);
+
+ result = dns_name_fromstring(&example2com, "example2.com.",
+ NULL, 0, isc_g_mctx);
+ result = dns_name_fromstring(&example3com, "example3.com.",
+ NULL, 0, isc_g_mctx);
+ result = dns_name_fromstring(&example4com, "example4.com.",
+ NULL, 0, isc_g_mctx);
+
+ if (!dns_name_equal(ctx->origin, &example2com) &&
+ !dns_name_equal(ctx->origin, &example3com) &&
+ !dns_name_equal(ctx->origin, &example4com))
+ {
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+
} else if (strcmp(sourcestr, "view") == 0) {
- if (source != NS_HOOKSOURCE_VIEW) {
+ if (ctx->source != NS_HOOKSOURCE_VIEW) {
+ result = ISC_R_FAILURE;
+ goto cleanup;
+ }
+ if (ctx->origin != NULL) {
result = ISC_R_FAILURE;
goto cleanup;
}
ns_hook_add(hooktable, mctx, NS_QUERY_NXDOMAIN_BEGIN, &hook);
cleanup:
+ if (DNS_NAME_VALID(&example2com)) {
+ dns_name_free(&example2com, isc_g_mctx);
+ }
+
+ if (DNS_NAME_VALID(&example3com)) {
+ dns_name_free(&example3com, isc_g_mctx);
+ }
+
+ if (DNS_NAME_VALID(&example4com)) {
+ dns_name_free(&example4com, isc_g_mctx);
+ }
+
if (syncplugincfg != NULL) {
cfg_obj_destroy(parser, &syncplugincfg);
}
isc_result_t
plugin_check(const char *parameters, const void *cfg, const char *cfgfile,
unsigned long cfgline, isc_mem_t *mctx, void *aclctx,
- ns_hooksource_t source) {
+ const ns_pluginregister_ctx_t *ctx) {
UNUSED(parameters);
UNUSED(cfg);
UNUSED(cfgfile);
UNUSED(cfgline);
UNUSED(mctx);
UNUSED(aclctx);
- UNUSED(source);
+ UNUSED(ctx);
return ISC_R_SUCCESS;
}
cfg_aclconfctx_t *aclctx;
ns_hooksource_t source;
isc_result_t *check_result;
+ const ns_pluginregister_ctx_t *ctx;
};
/*%
result = ns_plugin_check(full_path, parameters, config,
cfg_obj_file(obj), cfg_obj_line(obj),
- data->mctx, data->aclctx, data->source);
+ data->mctx, data->aclctx, data->ctx);
if (result != ISC_R_SUCCESS) {
cfg_obj_log(obj, ISC_LOG_ERROR, "%s: plugin check failed: %s",
full_path, isc_result_totext(result));
static isc_result_t
check_plugins(const cfg_obj_t *plugins, const cfg_obj_t *config,
- cfg_aclconfctx_t *aclctx, ns_hooksource_t source,
+ cfg_aclconfctx_t *aclctx, const dns_name_t *zname,
isc_mem_t *mctx) {
isc_result_t result = ISC_R_SUCCESS;
+ ns_pluginregister_ctx_t ctx = {
+ .source = (zname == NULL) ? NS_HOOKSOURCE_VIEW
+ : NS_HOOKSOURCE_ZONE,
+ .origin = zname,
+ };
struct check_one_plugin_data check_one_plugin_data = {
.mctx = mctx,
.aclctx = aclctx,
- .source = source,
+ .source = ctx.source,
.check_result = &result,
+ .ctx = &ctx,
};
(void)cfg_pluginlist_foreach(config, plugins, aclctx, check_one_plugin,
const cfg_obj_t *plugins = NULL;
(void)cfg_map_get(zoptions, "plugin", &plugins);
- tresult = check_plugins(plugins, config, aclctx,
- NS_HOOKSOURCE_ZONE, mctx);
+ tresult = check_plugins(plugins, config, aclctx, zname, mctx);
if (tresult != ISC_R_SUCCESS) {
result = tresult;
}
(void)cfg_map_get(config, "plugin", &plugins);
}
- tresult = check_plugins(plugins, config, aclctx,
- NS_HOOKSOURCE_VIEW, mctx);
+ tresult = check_plugins(plugins, config, aclctx, NULL, mctx);
if (tresult != ISC_R_SUCCESS) {
result = tresult;
}
isc_log_write(NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_HOOKS, ISC_LOG_INFO,
"registering plugin '%s'", modpath);
- INSIST(hookdata->source != NS_HOOKSOURCE_UNDEFINED);
+ INSIST(hookdata->pluginregister_ctx.source != NS_HOOKSOURCE_UNDEFINED);
CHECK(plugin->check_func(parameters, cfg, cfg_file, cfg_line, mctx,
- aclctx, hookdata->source));
+ aclctx, &hookdata->pluginregister_ctx));
CHECK(plugin->register_func(parameters, cfg, cfg_file, cfg_line, mctx,
aclctx, hookdata->hooktable,
- hookdata->source, &plugin->inst));
+ &hookdata->pluginregister_ctx,
+ &plugin->inst));
ISC_LIST_APPEND(*hookdata->plugins, plugin, link);
isc_result_t
ns_plugin_check(const char *modpath, const char *parameters, const void *cfg,
const char *cfg_file, unsigned long cfg_line, isc_mem_t *mctx,
- void *aclctx, ns_hooksource_t source) {
+ void *aclctx, const ns_pluginregister_ctx_t *ctx) {
isc_result_t result;
ns_plugin_t *plugin = NULL;
CHECK(load_plugin(mctx, modpath, &plugin));
result = plugin->check_func(parameters, cfg, cfg_file, cfg_line, mctx,
- aclctx, source);
+ aclctx, ctx);
cleanup:
if (plugin != NULL) {
* instance, bad cookie handling), it would be skipped.
*
* The `plugin_register` function (defined by each plugin and called
- * when the plugin is loaded) has a `ns_hooksource_t source` parameter.
- * It indicates whether the plugin has been loaded at the zone level
+ * when the plugin is loaded) has a `ns_pluginregister_ctx_t ctx` parameter.
+ * This provides to the plugin registering function various contextual
+ * informations about the plugin. For instance, the `ns_hooksource_t source`
+ * property indicates whether the plugin has been loaded at the zone level
* (`NS_HOOKSOURCE_ZONE`) or at the view level (`NS_HOOKSOURCE_VIEW`).
* While this can be ignored if it doesn't matter where the plugin is
* loaded, it can also be checked to enforce that the plugin is loaded
- * only at the zone or view level.
+ * only at the zone or view level. Another property is `dns_name_t *origin`
+ * which indicates the zone name to the plugin if it is loaded at the zone level
+ * (this property is NULL otherwise). Note that `ns_pluginregister_ctx_t`
+ * parameter is defined in a parent stack frame, thus, it is valid only during
+ * `plugin_register` execution.
*/
/*!
NS_HOOKSOURCE_ZONE
} ns_hooksource_t;
-typedef struct ns_hook_data {
- ns_hooktable_t *hooktable;
- ns_plugins_t *plugins;
+typedef struct ns_pluginregister_ctx {
+ /* is this a zone or a view plugin */
ns_hooksource_t source;
+
+ /* origin of the zone if this is a zone plugin, NULL otherwise */
+ const dns_name_t *origin;
+} ns_pluginregister_ctx_t;
+
+typedef struct ns_hook_data {
+ ns_hooktable_t *hooktable;
+ ns_plugins_t *plugins;
+ ns_pluginregister_ctx_t pluginregister_ctx;
} ns_hook_data_t;
/*
typedef isc_result_t
ns_plugin_register_t(const char *parameters, const void *cfg, const char *file,
unsigned long line, isc_mem_t *mctx, void *aclctx,
- ns_hooktable_t *hooktable, ns_hooksource_t source,
- void **instp);
+ ns_hooktable_t *hooktable,
+ const ns_pluginregister_ctx_t *ctx, void **instp);
/*%<
* Called when registering a new plugin.
*
typedef isc_result_t
ns_plugin_check_t(const char *parameters, const void *cfg, const char *file,
unsigned long line, isc_mem_t *mctx, void *aclctx,
- ns_hooksource_t source);
+ const ns_pluginregister_ctx_t *ctx);
/*%<
* Check the validity of 'parameters'.
*/
isc_result_t
ns_plugin_check(const char *modpath, const char *parameters, const void *cfg,
const char *cfg_file, unsigned long cfg_line, isc_mem_t *mctx,
- void *aclctx, ns_hooksource_t source);
+ void *aclctx, const ns_pluginregister_ctx_t *ctx);
/*%<
* Open the plugin module at 'modpath' and check the validity of
* 'parameters', logging any errors or warnings found, then