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
{
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;
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,
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;
}
free(env_file_path);
}
- closedir(envdir);
+ free(dirlist);
env_dir_cleanup:
free(path);