diff --git a/include/sway/config.h b/include/sway/config.h index 54cdcc90..ab494e78 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -513,7 +513,7 @@ bool load_main_config(const char *path, bool is_active, bool validating); /** * Loads an included config. Can only be used after load_main_config. */ -bool load_include_configs(const char *path, struct sway_config *config, +void load_include_configs(const char *path, struct sway_config *config, struct swaynag_instance *swaynag); /** diff --git a/sway/commands/include.c b/sway/commands/include.c index d1809856..d4c14c35 100644 --- a/sway/commands/include.c +++ b/sway/commands/include.c @@ -7,11 +7,8 @@ struct cmd_results *cmd_include(int argc, char **argv) { return error; } - if (!load_include_configs(argv[0], config, - &config->swaynag_config_errors)) { - return cmd_results_new(CMD_INVALID, - "Failed to include sub configuration file: %s", argv[0]); - } + // We don't care if the included config(s) fails to load. + load_include_configs(argv[0], config, &config->swaynag_config_errors); return cmd_results_new(CMD_SUCCESS, NULL); } diff --git a/sway/config.c b/sway/config.c index 206ca95c..4cd21bbc 100644 --- a/sway/config.c +++ b/sway/config.c @@ -549,43 +549,34 @@ static bool load_include_config(const char *path, const char *parent_dir, return true; } -bool load_include_configs(const char *path, struct sway_config *config, +void load_include_configs(const char *path, struct sway_config *config, struct swaynag_instance *swaynag) { char *wd = getcwd(NULL, 0); char *parent_path = strdup(config->current_config_path); const char *parent_dir = dirname(parent_path); if (chdir(parent_dir) < 0) { - free(parent_path); - free(wd); - return false; + sway_log(SWAY_ERROR, "failed to change working directory"); + goto cleanup; } wordexp_t p; - - if (wordexp(path, &p, 0) != 0) { - free(parent_path); - free(wd); - return false; + if (wordexp(path, &p, 0) == 0) { + char **w = p.we_wordv; + size_t i; + for (i = 0; i < p.we_wordc; ++i) { + load_include_config(w[i], parent_dir, config, swaynag); + } + wordfree(&p); } - char **w = p.we_wordv; - size_t i; - for (i = 0; i < p.we_wordc; ++i) { - load_include_config(w[i], parent_dir, config, swaynag); - } - free(parent_path); - wordfree(&p); - - // restore wd + // Attempt to restore working directory before returning. if (chdir(wd) < 0) { - free(wd); - sway_log(SWAY_ERROR, "failed to restore working directory"); - return false; + sway_log(SWAY_ERROR, "failed to change working directory"); } - +cleanup: + free(parent_path); free(wd); - return true; } void run_deferred_commands(void) {