# include <langinfo.h>
#endif
-#if HAVE_SHLOBJ_H
-# include <Shlobj.h>
-#endif
#include <signal.h>
#include "rights.h"
#include "log.h"
#include "split.h"
#include "syscalls.h"
+#include "home.h"
#include "table.h"
#include "inputline.h"
#include "charset.h"
*/
char *configfile;
+/** @brief Path to user's config file
+ *
+ * set_configfile() sets the default if it is null.
+ */
+char *userconfigfile;
+
/** @brief Read user configuration
*
* If clear, the user-specific configuration is not read.
/** @brief Set the default configuration file */
static void set_configfile(void) {
+ char *t;
+
#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
+ if(!userconfigfile && config_per_user) {
+ if((t = getenv("DISORDER_USERCONFIG"))) userconfigfile = xstrdup(t);
+ else if(!(userconfigfile = profile_filename("passwd")))
+ disorder_fatal(0, "failed to find user profile directory");
+ }
}
/** @brief Free a configuration object
xfree(privconf);
#endif
/* if we have a password file, read it */
- if((privconf = config_userconf())
- && access(privconf, F_OK) == 0
- && config_include(c, privconf))
+ if(access(userconfigfile, F_OK) == 0
+ && config_include(c, userconfigfile))
return -1;
- xfree(privconf);
}
/* install default namepart and transform settings */
config_postdefaults(c, server);
#else
char *s;
+ if((s = getenv("DISORDER_PRIVCONFIG"))) return xstrdup(s);
set_configfile();
byte_xasprintf(&s, "%s.private", configfile);
return s;
#endif
}
-/** @brief Return the path to user's personal configuration file */
-char *config_userconf(void) {
- char *s;
-#if _WIN32
- wchar_t *wpath = 0;
- char *appdata;
- if(SHGetKnownFolderPath(&FOLDERID_RoamingAppData, 0, NULL, &wpath) != S_OK)
- disorder_fatal(0, "error calling SHGetKnownFolderPath");
- appdata = win_wtomb(wpath);
- CoTaskMemFree(wpath);
- byte_xasprintf(&s, "%s\\DisOrder\\passwd", appdata);
-#else
- struct passwd *pw;
- if(!(pw = getpwuid(getuid())))
- disorder_fatal(0, "cannot determine our username");
- byte_xasprintf(&s, "%s/.disorder/passwd", pw->pw_dir);
-#endif
- return s;
-}
-
#if !_WIN32
/** @brief Return the path to user-specific system configuration */
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