chiark / gitweb /
lib/configuration.c, lib/home.c: Introduce environment variables.
authorMark Wooding <mdw@distorted.org.uk>
Thu, 4 Jun 2020 19:22:02 +0000 (20:22 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 15 Jun 2020 12:02:44 +0000 (13:02 +0100)
The places where DisOrder looks for configuration can now be overridden
using environment variables.

  * `$DISORDER_CONFIG' is the master configuration file -- defaults to
    `PKGCONFDIR/config', where `PKGCONFDIR' is set at compile
    time (e.g., `/etc/disorder'.

  * `$DISORDER_PRIVCONFIG' is the private configuration file -- defaults
    to `$DISORDER_CONFIG.private'.

  * `$DISORDER_HOME' is the user's `profile directory' for DisOrder
    things -- defaults to `$HOME/.disorder' on Unix, or
    `%APPDATA%/DisOrder' (i.e., in the roaming profile directory) on
    Windows.

  * `$DISORDER_USERCONFIG' is the user's configuration file -- defaults
    to `$DISORDER_HOME/passwd'.

  * `$DISORDER_USERCONFIG_SYS' is the per-user system configuration file
    -- defaults to `$DISORDER_CONFIG.USERNAME'.

The primary motivation for all of this is to make it easier to run
clients -- particularly Disobedience and its `disorder-playrtp'
inferiors -- against multiple servers simultaneously.  Setting
configuration on the command line works rather badly for clients, since
that overrides the /system/ configuration, which the user can't edit
anyway -- the client programs still read `$HOME/passwd' unconditionally.
This is clearly a bug, but changing the behaviour now is a bad idea;
besides, changing `-c' (or introducing a new option) to override the
`passwd' file, doesn't actually help much unless Disobedience in turn
passes the necessary option on to `disorder-playrtp'.  Environment
variables solve all of these problems much more simply.

doc/disobedience.1.in
doc/disorder-dump.8.in
doc/disorder-playrtp.1.in
doc/disorder.1.in
doc/disorder_config.5.in
doc/disorderd.8.in
lib/configuration.c
lib/home.c

index 4462237d8eda3efdaca58dfa0ac3f8ce98f175bc..ea983f346050dc1b19c3e11a4badf01e502096a7 100644 (file)
@@ -31,6 +31,9 @@ be found at dochtmldir/index.html.
 .B \-\-config \fIPATH\fR, \fB\-c \fIPATH
 Set the configuration file.
 The default is
+given by the
+.B DISORDER_CONFIG
+environment variable, defaulting to
 .IR pkgconfdir/config .
 .TP
 .B \-\-debug\fR, \fB\-d
index d29562f94ad722011eeba46d341006011b75bfc3..aaf90ef86d2fb92af8edddfb8bd8ef792305a5fe 100644 (file)
@@ -58,6 +58,8 @@ In normal use such tracks are all aliases.
 .B \-\-config \fIPATH\fR, \fB\-c \fIPATH
 Set the configuration file.
 The default is
+.B DISORDER_CONFIG
+environment variable, defaulting to
 .IR /etc/disorder/config .
 .TP
 .B \-\-no\-setuid
index d453dcbf4e5c8bb99ea30d103a83a3865b1ac45a..24ad03f3fe6ce1bf14acc4124d88460420b4918d 100644 (file)
@@ -107,6 +107,9 @@ control.
 .B \-\-config \fIPATH\fR, \fB\-C \fIPATH
 Set the configuration file.
 The default is
+given by the
+.B DISORDER_CONFIG
+environment variable, defaulting to
 .IR pkgconfdir/config .
 .TP
 .B \-\-socket \fIPATH\fR, \fB\-s \fIPATH
index b61a825a5ff64fec5f5cae88836017fd34d11547..5899ab54fe45d74e1d2955e59f94d5ff53c71d62 100644 (file)
@@ -42,6 +42,9 @@ and \fBdisorder_config\fR (5) for documentation of the configuration file.
 .B \-\-config \fIPATH\fR, \fB\-c \fIPATH
 Set the configuration file.
 The default is
+given by the
+.B DISORDER_CONFIG
+environment variable, defaulting to
 .IR pkgconfdir/config .
 .TP
 .B \-\-debug\fR, \fB\-d
@@ -380,6 +383,30 @@ The README recommends using \fBjukebox\fR for this purpose but it could
 be different locally.
 .SH ENVIRONMENT
 .TP
+.B DISORDER_CONFIG
+Main configuration file to use instead of
+.IR pkgconfdir/config .
+Overridden by the
+.B \-c
+.RB ( \-\-config )
+command-line option.
+.TP
+.B DISORDER_HOME
+Per-user configuration and state directory to use instead of
+.BR $HOME/.disorder .
+.TP
+.B DISORDER_PRIVCONFIG
+Private configuration file to use instead of
+.IR pkgconfdir/config.private .
+.TP
+.B DISORDER_USERCONFIG
+Per-user configuration file to use instead of
+.BR $DISORDER_HOME/passwd .
+.TP
+.B DISORDER_USERCONFIG_SYS
+System-provided per-user configuration file to use instead of
+.BR $DISORDER_HOME/passwd .
+.TP
 .B HOME
 The user's home directory.
 .TP
index c4f3bd483315c1ff4416c3482f2ae7e8f24c27a6..4190d1688669ab0a1cbf29d711890120a9123ce3 100644 (file)
@@ -199,17 +199,38 @@ as it cannot start up without a valid config file.)
 Configuration files are read in the following order:
 .TP
 .I pkgconfdir/config
+Or
+.BR $DISORDER_CONFIG ,
+if that's set; overridden by
+.B \-c
+.RB ( \-\-config )
+command line option, except in
+.BR disrder-playrtp (1),
+which uses
+.BR \-C .
 .TP
 .I pkgconfdir/config.private
+Or
+.BR $DISORDER_PRIVCONFIG ,
+if that's set, else
+.BR $DISORDER_CONFIG.private .
 Should be readable only by the jukebox group.
 Not really useful any more and will be abolished in future.
 .TP
 .I ~\fRUSERNAME\fI/.disorder/passwd
+Or
+.BR $DISORDER_USERCONFIG ,
+if that's set; else
+.BR $DISORDER_HOME/passwd .
 Per-user client configuration.
 Optional but if it exists must be readable only by the relevant user.
 Would normally contain a \fBpassword\fR directive.
 .TP
 .I pkgconfdir/config.\fRUSERNAME
+(Or
+.BR $DISORDER_USERCONFIG_SYS ,
+if that's set; else
+.BR $DISORDER_CONFIG.\fIUSERNAME .)
 Per-user system-controlled client configuration.
 Optional but if it exists must be readable only by the relevant user.
 Would normally contain a \fBpassword\fR directive.
index 6325dd068002781f8a6659b85ffeeca371b40459..4673252af997f3636805d4647bbe8a508194761c 100644 (file)
@@ -29,6 +29,9 @@ concerning what is to be played.
 .B \-\-config \fIPATH\fR, \fB\-c \fIPATH
 Set the configuration file.
 The default is
+given by the
+.B DISORDER_CONFIG
+environment variable, defaulting to
 .IR pkgconfdir/config .
 See
 .BR disorder_config (5)
@@ -190,6 +193,14 @@ Lockfile.
 This prevents multiple instances of DisOrder running simultaneously.
 .SH ENVIRONMENT
 .TP
+.B DISORDER_CONFIG
+Configuration file to use instead of
+.IR pkgconfdir/config .
+.TP
+.B DISORDER_PRIVCONFIG
+Private configuration file to use instead of
+.IR pkgconfdir/config.private .
+.TP
 .B LC_ALL\fR, \fBLANG\fR, etc
 Current locale.
 See \fBlocale\fR(7).
index 17f9ec7b4ed137f4f3b60aed9de3dac574b51233..56a96964d9b422ebea6289a6e09437b7aba0273e 100644 (file)
@@ -1452,8 +1452,11 @@ char *config_get_file2(struct config *c, const char *name) {
 /** @brief Set the default configuration file */
 static void set_configfile(void) {
 #if !_WIN32
-  if(!configfile)
-    byte_xasprintf(&configfile, "%s/config", pkgconfdir);
+  if(!configfile) {
+    configfile = getenv("DISORDER_CONFIG");
+    if(!configfile)
+      byte_xasprintf(&configfile, "%s/config", pkgconfdir);
+  }
 #endif
 }
 
@@ -1671,6 +1674,8 @@ char *config_private(void) {
 
 /** @brief Return the path to user's personal configuration file */
 char *config_userconf(void) {
+  char *t;
+  if((t = getenv("DISORDER_USERCONFIG"))) return xstrdup(t);
   return profile_filename("passwd");
 }
 
@@ -1680,7 +1685,9 @@ char *config_usersysconf(const struct passwd *pw) {
   char *s;
 
   set_configfile();
-  if(!strchr(pw->pw_name, '/')) {
+  if((s = getenv("DISORDER_USERCONFIG_SYS")))
+    return xstrdup(s);
+  else if(!strchr(pw->pw_name, '/')) {
     byte_xasprintf(&s, "%s.%s", configfile, pw->pw_name);
     return s;
   } else
index 5426f761f0c1509df5b8704c8b6038db2f38f3b9..3b3166c545c65a24cf609e9a184166c4a5823f31 100644 (file)
@@ -56,25 +56,29 @@ const char *profile_directory(void) {
   char *t;
 
   if(profiledir) return profiledir;
+  if((t = getenv("DISORDER_HOME")))
+    profiledir = t;
+  else {
 #if _WIN32
-  wchar_t *wpath = 0;
-  char *appdata;
-  if(SHGetKnownFolderPath(&FOLDERID_RoamingAppData, 0, NULL, &wpath) != S_OK) {
-    disorder_error(0, "error calling SHGetKnownFolderPath");
-    return 0;
-  }
-  t = win_wtomb(wpath);
-  CoTaskMemFree(wpath);
-  byte_xasprintf(&profiledir, "%s\\DisOrder", appdata);
+    wchar_t *wpath = 0;
+    char *appdata;
+    if(SHGetKnownFolderPath(&FOLDERID_RoamingAppData, 0, NULL, &wpath) != S_OK) {
+      disorder_error(0, "error calling SHGetKnownFolderPath");
+      return 0;
+    }
+    t = win_wtomb(wpath);
+    CoTaskMemFree(wpath);
+    byte_xasprintf(&profiledir, "%s\\DisOrder", appdata);
 #else
-  struct passwd *pw;
-  if(!(t = getenv("HOME"))) {
-    if(!(pw = getpwuid(getuid())))
-      disorder_error(0, "user not found in password database");
-    t = pw->pw_dir;
-  }
-  byte_xasprintf(&profiledir, "%s/.disorder", t);
+    struct passwd *pw;
+    if(!(t = getenv("HOME"))) {
+      if(!(pw = getpwuid(getuid())))
+       disorder_error(0, "user not found in password database");
+      t = pw->pw_dir;
+    }
+    byte_xasprintf(&profiledir, "%s/.disorder", t);
 #endif
+  }
   return profiledir;
 }