diff options
| author | columbarius <co1umbarius@protonmail.com> | 2021-03-25 17:22:26 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-25 17:22:26 +0100 | 
| commit | 1d62d6bfa09860d7a59640dcb20d5273a55401c4 (patch) | |
| tree | 30864567e057119ee5402cbabb656184b3869e0d /sway/config.c | |
| parent | 346f5a9d14e260405598fc530fb260c894db397f (diff) | |
| download | sway-1d62d6bfa09860d7a59640dcb20d5273a55401c4.tar.xz | |
config: allow whitespaces in config path
Diffstat (limited to 'sway/config.c')
| -rw-r--r-- | sway/config.c | 69 | 
1 files changed, 47 insertions, 22 deletions
| diff --git a/sway/config.c b/sway/config.c index 6e665434..76b9ec08 100644 --- a/sway/config.c +++ b/sway/config.c @@ -338,35 +338,60 @@ static bool file_exists(const char *path) {  	return path && access(path, R_OK) != -1;  } +static char *config_path(const char *prefix, const char *config_folder) { +	if (!prefix || !prefix[0] || !config_folder || !config_folder[0]) { +		return NULL; +	} + +	const char *filename = "config"; + +	size_t size = 3 + strlen(prefix) + strlen(config_folder) + strlen(filename); +	char *path = calloc(size, sizeof(char)); +	snprintf(path, size, "%s/%s/%s", prefix, config_folder, filename); +	return path; +} +  static char *get_config_path(void) { -	static const char *config_paths[] = { -		"$HOME/.sway/config", -		"$XDG_CONFIG_HOME/sway/config", -		"$HOME/.i3/config", -		"$XDG_CONFIG_HOME/i3/config", -		SYSCONFDIR "/sway/config", -		SYSCONFDIR "/i3/config", +	char *path = NULL; +	const char *home = getenv("HOME"); +	size_t size_fallback = 1 + strlen(home) + strlen("/.config"); +	char *config_home_fallback = calloc(size_fallback, sizeof(char)); +	snprintf(config_home_fallback, size_fallback, "%s/.config", home); + +	const char *config_home = getenv("XDG_CONFIG_HOME"); +	if (config_home == NULL || config_home[0] == '\0') { +		config_home = config_home_fallback; +	} + +	struct config_path { +		const char *prefix; +		const char *config_folder;  	}; -	char *config_home = getenv("XDG_CONFIG_HOME"); -	if (!config_home || !*config_home) { -		config_paths[1] = "$HOME/.config/sway/config"; -		config_paths[3] = "$HOME/.config/i3/config"; -	} +	struct config_path config_paths[] = { +		{ .prefix = home, .config_folder = ".sway"}, +		{ .prefix = config_home, .config_folder = "sway"}, +		{ .prefix = home, .config_folder = ".i3"}, +		{ .prefix = config_home, .config_folder = "i3"}, +		{ .prefix = SYSCONFDIR, .config_folder = "sway"}, +		{ .prefix = SYSCONFDIR, .config_folder = "i3"} +	}; -	for (size_t i = 0; i < sizeof(config_paths) / sizeof(char *); ++i) { -		wordexp_t p; -		if (wordexp(config_paths[i], &p, WRDE_UNDEF) == 0) { -			char *path = strdup(p.we_wordv[0]); -			wordfree(&p); -			if (file_exists(path)) { -				return path; -			} -			free(path); +	size_t num_config_paths = sizeof(config_paths)/sizeof(config_paths[0]); +	for (size_t i = 0; i < num_config_paths; i++) { +		path = config_path(config_paths[i].prefix, config_paths[i].config_folder); +		if (!path) { +			continue;  		} +		if (file_exists(path)) { +			break; +		} +		free(path); +		path = NULL;  	} -	return NULL; +	free(config_home_fallback); +	return path;  }  static bool load_config(const char *path, struct sway_config *config, | 
