From b4f3ffc27e017f71ed338d14ca6953f4d36213dc Mon Sep 17 00:00:00 2001 From: "Andrew J. Hesford" Date: Tue, 16 Apr 2024 07:11:18 -0400 Subject: [PATCH] session: sort directory entries in environment.d --- docs/labwc-config.5.scd | 9 ++++----- src/config/session.c | 27 ++++++++++++++++----------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index e6960882..e3c6fcf7 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -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 "environment" will be parsed first, followed by any file matching the glob "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 -should be set within the same file. Unless the --merge-config option is -specified, labwc will consider a particular XDG Base Directory to have provided -an environment file if that directory contains either the "environment" -file or at least one "environment.d/\*.env" file. +alphabetical order. Unless the --merge-config option is specified, labwc will +consider a particular XDG Base Directory to have provided an environment file if +that directory contains either the "environment" file or at least one +"environment.d/\*.env" file. 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 diff --git a/src/config/session.c b/src/config/session.c index ee56b548..f2d573f7 100644 --- a/src/config/session.c +++ b/src/config/session.c @@ -86,11 +86,6 @@ strdup_env_path_validate(const char *prefix, struct dirent *dirent) { 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); if (!full_path) { return NULL; @@ -106,16 +101,25 @@ strdup_env_path_validate(const char *prefix, struct dirent *dirent) 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 read_environment_dir(const char *path_prefix) { bool success = false; char *path = strdup_printf("%s.d", path_prefix); + struct dirent **dirlist = NULL; + errno = 0; - DIR *envdir = opendir(path); + int num_entries = scandir(path, &dirlist, env_file_filter, alphasort); - if (!envdir) { + if (num_entries < 0) { if (errno != ENOENT) { const char *err_msg = strerror(errno); wlr_log(WLR_INFO, @@ -126,9 +130,10 @@ read_environment_dir(const char *path_prefix) goto env_dir_cleanup; } - struct dirent *dirent; - while ((dirent = readdir(envdir)) != NULL) { - char *env_file_path = strdup_env_path_validate(path, dirent); + for (int i = 0; i < num_entries; i++) { + char *env_file_path = strdup_env_path_validate(path, dirlist[i]); + free(dirlist[i]); + if (!env_file_path) { continue; } @@ -140,7 +145,7 @@ read_environment_dir(const char *path_prefix) free(env_file_path); } - closedir(envdir); + free(dirlist); env_dir_cleanup: free(path); -- 2.52.0