Make load_include_configs void. Fix some cases where WD would not be restored.

This commit is contained in:
Connor E 2019-02-24 04:39:08 +00:00 committed by Drew DeVault
parent 3924039bc0
commit 401df9cff4
3 changed files with 17 additions and 29 deletions

View file

@ -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. * 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); struct swaynag_instance *swaynag);
/** /**

View file

@ -7,11 +7,8 @@ struct cmd_results *cmd_include(int argc, char **argv) {
return error; return error;
} }
if (!load_include_configs(argv[0], config, // We don't care if the included config(s) fails to load.
&config->swaynag_config_errors)) { 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]);
}
return cmd_results_new(CMD_SUCCESS, NULL); return cmd_results_new(CMD_SUCCESS, NULL);
} }

View file

@ -549,43 +549,34 @@ static bool load_include_config(const char *path, const char *parent_dir,
return true; 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) { struct swaynag_instance *swaynag) {
char *wd = getcwd(NULL, 0); char *wd = getcwd(NULL, 0);
char *parent_path = strdup(config->current_config_path); char *parent_path = strdup(config->current_config_path);
const char *parent_dir = dirname(parent_path); const char *parent_dir = dirname(parent_path);
if (chdir(parent_dir) < 0) { if (chdir(parent_dir) < 0) {
free(parent_path); sway_log(SWAY_ERROR, "failed to change working directory");
free(wd); goto cleanup;
return false;
} }
wordexp_t p; wordexp_t p;
if (wordexp(path, &p, 0) == 0) {
if (wordexp(path, &p, 0) != 0) { char **w = p.we_wordv;
free(parent_path); size_t i;
free(wd); for (i = 0; i < p.we_wordc; ++i) {
return false; load_include_config(w[i], parent_dir, config, swaynag);
}
wordfree(&p);
} }
char **w = p.we_wordv; // Attempt to restore working directory before returning.
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
if (chdir(wd) < 0) { if (chdir(wd) < 0) {
free(wd); sway_log(SWAY_ERROR, "failed to change working directory");
sway_log(SWAY_ERROR, "failed to restore working directory");
return false;
} }
cleanup:
free(parent_path);
free(wd); free(wd);
return true;
} }
void run_deferred_commands(void) { void run_deferred_commands(void) {