]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/engine: priority prefix ‘<‘ for modules
authorMarek Vavruša <marek.vavrusa@nic.cz>
Sat, 1 Aug 2015 16:06:32 +0000 (18:06 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Sat, 1 Aug 2015 16:06:32 +0000 (18:06 +0200)
if the configured modules name is prefixed with ‘<‘ it takes precedence before all others,
e.g. modules = { ‘hints’, ‘<block’ }
means that the ‘hints’ module will be executed in-order (last), and ‘block’ module layer will be called as first in query processing

daemon/engine.c

index e91aef6eb0c5eafbdaf73f141164451f50589609..db0c5c39eb10ada83e0d0ecedc5cfef8ebc288fe 100644 (file)
@@ -434,7 +434,12 @@ int engine_register(struct engine *engine, const char *name)
        if (engine == NULL || name == NULL) {
                return kr_error(EINVAL);
        }
-
+       /* Check priority modules */
+       bool is_priority = false;
+       if (name[0] == '<') {
+               is_priority = true;
+               name += 1;
+       }
        /* Make sure module is unloaded */
        (void) engine_unregister(engine, name);
        /* Attempt to load binary module */
@@ -452,11 +457,16 @@ int engine_register(struct engine *engine, const char *name)
                free(module);
                return ret;
        }
-
        if (array_push(engine->modules, module) < 0) {
                engine_unload(engine, module);
                return kr_error(ENOMEM);
        }
+       /* Push to front if priority module */
+       if (is_priority) {
+               struct kr_module **arr = engine->modules.at;
+               memmove(&arr[1], &arr[0], sizeof(*arr) * (engine->modules.len - 1));
+               arr[0] = module;
+       }
 
        /* Register properties */
        if (module->props) {