From 690df57f008cd9621efd6155350c475b0134e3be Mon Sep 17 00:00:00 2001 From: Danielle McLean Date: Mon, 11 Jul 2022 17:45:18 +1000 Subject: [PATCH] Set compromise XDG_RUNTIME_DIR if necessary It's not ideal to set XDG_RUNTIME_DIR in your shell environment, rather than from your session manager (or systemd, or whatever), since then you can't reliably provide the same lifetime guarantees that XDG_RUNTIME_DIR is supposed to have? But this is still preferable to not having an XDG_RUNTIME_DIR at all, so I'm gonna go with it. --- zshenv | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/zshenv b/zshenv index a156484..fa2dd21 100644 --- a/zshenv +++ b/zshenv @@ -6,6 +6,26 @@ export XDG_CONFIG_HOME XDG_CACHE_HOME XDG_DATA_HOME XDG_STATE_HOME +# The other four XDG directories are very easy, but XDG_RUNTIME_DIR is +# complicated. It kinda needs to be managed by a systemwide supervisor, like +# systemd, in order to meet all of the XDG Base Directory specification's +# requirements? In particular, the directory is supposed to come into being +# when you log in, live as long as you have any active sessions, and be +# destroyed when you log out - none of this can easily be done from the shell +# environment alone, especially on an operating system like macOS where your +# graphical session wasn't spawned from a shell using something like .xinitrc. +# +# We're going to assume XDG_RUNTIME_DIR will have already be set by a +# systemwide supervisor if it can possibly have been. If it hasn't - say, +# because we're on macOS - we'll compromise by using TMPDIR. Since TMPDIR has +# a different lifetime than XDG_RUNTIME_DIR is supposed to, this is an +# imperfect solution, but it's the best we can do. +if [[ ! -d $XDG_RUNTIME_DIR ]] && [[ -d $TMPDIR ]]; then + export XDG_RUNTIME_DIR=${TMPDIR}xdg-$UID + mkdir -p $XDG_RUNTIME_DIR + chmod 0700 $XDG_RUNTIME_DIR +fi + # The real zsh config lives in XDG_CONFIG_HOME! ;) : ${ZDOTDIR:=$XDG_CONFIG_HOME/zsh} source $ZDOTDIR/zshenv