diff --git a/main/loader.c b/main/loader.c index da508f3dee741b185f00886248b45bd967b0a541..159014e7215b8f02905a0fa3ac6b5bb5956a1805 100644 --- a/main/loader.c +++ b/main/loader.c @@ -1394,7 +1394,7 @@ static enum ast_module_load_result start_resource(struct ast_module *mod) } AST_VECTOR_FREE(&missing); - return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_DECLINE; } if (!ast_fully_booted) { @@ -1580,6 +1580,7 @@ static int start_resource_list(struct module_vector *resources, int *mod_count) struct ast_module *mod = AST_VECTOR_REMOVE(resources, 0, 1); enum ast_module_load_result lres; +retry_load: lres = start_resource_attempt(mod, mod_count); if (lres == AST_MODULE_LOAD_SUCCESS) { /* No missing dependencies, successful. */ @@ -1598,13 +1599,18 @@ static int start_resource_list(struct module_vector *resources, int *mod_count) res = module_deps_missing_recursive(mod, &missingdeps); if (res) { - break; + AST_VECTOR_RESET(&missingdeps, AST_VECTOR_ELEM_CLEANUP_NOOP); + ast_log(LOG_ERROR, "Failed to resolve dependencies for %s\n", ast_module_name(mod)); + mod->flags.declined = 1; + + continue; } if (!AST_VECTOR_SIZE(&missingdeps)) { - ast_log(LOG_WARNING, "%s isn't missing any dependencies but still didn't start\n", - ast_module_name(mod)); - /* Dependencies were met but the module failed to start. */ + ast_log(LOG_WARNING, "%s load function returned an invalid result. " + "This is a bug in the module.\n", ast_module_name(mod)); + /* Dependencies were met but the module failed to start and the result + * code was not AST_MODULE_LOAD_FAILURE or AST_MODULE_LOAD_DECLINE. */ res = -1; break; } @@ -1637,17 +1643,17 @@ static int start_resource_list(struct module_vector *resources, int *mod_count) } if (AST_VECTOR_SIZE(&missingdeps)) { - ast_log(LOG_ERROR, "Failed to load %s due to unfilled dependencies.\n", + ast_log(LOG_WARNING, "Failed to load %s due to unfilled dependencies.\n", ast_module_name(mod)); - res = -1; - break; - } + mod->flags.declined = 1; + AST_VECTOR_RESET(&missingdeps, AST_VECTOR_ELEM_CLEANUP_NOOP); - res = start_resource_attempt(mod, mod_count); - if (res) { - ast_log(LOG_ERROR, "Failed to load %s: %d\n", ast_module_name(mod), res); - break; + continue; } + + /* If we're here it means that we started with missingdeps and they're all loaded + * now. It's impossible to reach this point a second time for the same module. */ + goto retry_load; } AST_VECTOR_FREE(&missingdeps);