session: sort directory entries in environment.d

This commit is contained in:
Andrew J. Hesford 2024-04-16 07:11:18 -04:00 committed by Consolatis
parent 8096df19ba
commit b4f3ffc27e
2 changed files with 21 additions and 17 deletions

View file

@ -43,11 +43,10 @@ specify keyboard layout settings and cursor size/theme here; see environment
variable section below for details. Within an XDG Base Directory, a file named variable section below for details. Within an XDG Base Directory, a file named
"environment" will be parsed first, followed by any file matching the glob "environment" will be parsed first, followed by any file matching the glob
"environment.d/\*.env". Files within the environment.d directory are parsed in "environment.d/\*.env". Files within the environment.d directory are parsed in
an arbitrary order; any variables that must be set in a particular sequence alphabetical order. Unless the --merge-config option is specified, labwc will
should be set within the same file. Unless the --merge-config option is consider a particular XDG Base Directory to have provided an environment file if
specified, labwc will consider a particular XDG Base Directory to have provided that directory contains either the "environment" file or at least one
an environment file if that directory contains either the "environment" "environment.d/\*.env" file.
file or at least one "environment.d/\*.env" file.
Note: environment files are treated differently by Openbox, which will simply Note: environment files are treated differently by Openbox, which will simply
source the file as a valid shell script before running the window manager. Files source the file as a valid shell script before running the window manager. Files

View file

@ -86,11 +86,6 @@ strdup_env_path_validate(const char *prefix, struct dirent *dirent)
{ {
assert(prefix); assert(prefix);
/* Valid environment files always end in '.env' */
if (!str_endswith(dirent->d_name, ".env")) {
return NULL;
}
char *full_path = strdup_printf("%s/%s", prefix, dirent->d_name); char *full_path = strdup_printf("%s/%s", prefix, dirent->d_name);
if (!full_path) { if (!full_path) {
return NULL; return NULL;
@ -106,16 +101,25 @@ strdup_env_path_validate(const char *prefix, struct dirent *dirent)
return NULL; return NULL;
} }
static int
env_file_filter(const struct dirent *dirent)
{
/* Valid environment files always end in '.env' */
return str_endswith(dirent->d_name, ".env");
}
static bool static bool
read_environment_dir(const char *path_prefix) read_environment_dir(const char *path_prefix)
{ {
bool success = false; bool success = false;
char *path = strdup_printf("%s.d", path_prefix); char *path = strdup_printf("%s.d", path_prefix);
errno = 0; struct dirent **dirlist = NULL;
DIR *envdir = opendir(path);
if (!envdir) { errno = 0;
int num_entries = scandir(path, &dirlist, env_file_filter, alphasort);
if (num_entries < 0) {
if (errno != ENOENT) { if (errno != ENOENT) {
const char *err_msg = strerror(errno); const char *err_msg = strerror(errno);
wlr_log(WLR_INFO, wlr_log(WLR_INFO,
@ -126,9 +130,10 @@ read_environment_dir(const char *path_prefix)
goto env_dir_cleanup; goto env_dir_cleanup;
} }
struct dirent *dirent; for (int i = 0; i < num_entries; i++) {
while ((dirent = readdir(envdir)) != NULL) { char *env_file_path = strdup_env_path_validate(path, dirlist[i]);
char *env_file_path = strdup_env_path_validate(path, dirent); free(dirlist[i]);
if (!env_file_path) { if (!env_file_path) {
continue; continue;
} }
@ -140,7 +145,7 @@ read_environment_dir(const char *path_prefix)
free(env_file_path); free(env_file_path);
} }
closedir(envdir); free(dirlist);
env_dir_cleanup: env_dir_cleanup:
free(path); free(path);