poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] poke: Prefer ${XDG_CONFIG_HOME:-$HOME/.config} to XDG_CONFIG_DIR


From: Arsen Arsenović
Subject: [PATCH] poke: Prefer ${XDG_CONFIG_HOME:-$HOME/.config} to XDG_CONFIG_DIRS
Date: Sat, 24 Sep 2022 19:12:46 +0200

Some DEs (namely, KDE) set the latter without setting $XDG_CONFIG_HOME,
because the XDG specification says:

    Specifications may reference this specification by specifying the
    location of a configuration file as
    $XDG_CONFIG_DIRS/subdir/filename. This implies that:

    ...
    - A user-specific version of the configuration file may be created
      in $XDG_CONFIG_HOME/subdir/filename, taking into account the
      default value for $XDG_CONFIG_HOME if $XDG_CONFIG_HOME is not set.
    ...

It is implied (and also followed by other programs) that the default
value of XDG_CONFIG_HOME should be preferred to $XDG_CONFIG_DIRS, even
when the former is not set but the latter is. This also seems to be in
the spirit of the standard, which treats XDG_CONFIG_HOME as a writable
location (so, the program can modify it in accordance with the users
wishes), while treating XDG_CONFIG_DIRS as read only locations, normally
for default values or distro-provided overrides.

2022-09-24  Arsen Arsenović   <arsen@aarsen.me>

        * poke/poke.c: Prefer $XDG_CONFIG_HOME to $XDG_CONFIG_DIRS, even
        when unset.
---
Hey there,

This is the fix for the minor bug I noticed today while in the BBB meeting.

An implementation note: I chose to strdup () the getenv () result, so that it
can be validly freed (normally, freeing a getenv result is at least UB) over
carrying a "should free" value. This is slightly simpler, avoids a GCC warning
about discarding const, and shouldn't have much of an impact, since it's early
in the startup procedure.

Thanks in advance!

 poke/poke.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/poke/poke.c b/poke/poke.c
index b3849664..7b258410 100644
--- a/poke/poke.c
+++ b/poke/poke.c
@@ -698,16 +698,31 @@ initialize_user (void)
      use all the : separated paths in that variable to find
      pokerc.conf.  Else, try to load /etc/xdg/poke/pokerc.conf.  */
   {
-    const char *xdg_config_home = getenv ("XDG_CONFIG_HOME");
+    char *xdg_config_home = getenv ("XDG_CONFIG_HOME");
     const char *xdg_config_dirs = getenv ("XDG_CONFIG_DIRS");
 
     if (xdg_config_home == NULL)
-      xdg_config_home = "";
+      {
+        /* If unset, the default value of $HOME/.config should be preferred to
+           the paths in $XDG_CONFIG_DIRS. From the standard:
+
+           A user-specific version of the configuration file may be created in
+           $XDG_CONFIG_HOME/subdir/filename, taking into account the default
+           value for $XDG_CONFIG_HOME if $XDG_CONFIG_HOME is not set. */
+        xdg_config_home = pk_str_concat (getenv("HOME"), "/.config", NULL);
+        pk_assert_alloc (xdg_config_home);
+      }
+    else
+      {
+        /* strdup() the user-provided value, to free it below. */
+        xdg_config_home = strdup(xdg_config_home);
+        pk_assert_alloc (xdg_config_home);
+      }
 
     if (xdg_config_dirs == NULL)
       xdg_config_dirs = "/etc/xdg";
 
-    char *config_path = pk_str_concat (xdg_config_dirs, ":", xdg_config_home, 
NULL);
+    char *config_path = pk_str_concat (xdg_config_home, ":", xdg_config_dirs, 
NULL);
     pk_assert_alloc (config_path);
 
     char *dir = strtok (config_path, ":");
@@ -736,6 +751,7 @@ initialize_user (void)
     while ((dir = strtok (NULL, ":")) != NULL);
 
     free (config_path);
+    free (xdg_config_home);
   }
 }
 
-- 
2.37.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]