+ char *env, *tmp, *ret;
+
+ /*
+ * Allow override of the PuTTY configuration location, and of
+ * specific subparts of it, by means of environment variables.
+ */
+ if (index == INDEX_DIR) {
+ struct passwd *pwd;
+
+ env = getenv("PUTTYDIR");
+ if (env)
+ return dupstr(env);
+ env = getenv("HOME");
+ if (env)
+ return dupprintf("%s/.putty", env);
+ pwd = getpwuid(getuid());
+ if (pwd && pwd->pw_dir)
+ return dupprintf("%s/.putty", pwd->pw_dir);
+ return dupstr("/.putty");
+ }
+ if (index == INDEX_SESSIONDIR) {
+ env = getenv("PUTTYSESSIONS");
+ if (env)
+ return dupstr(env);
+ tmp = make_filename(INDEX_DIR, NULL);
+ ret = dupprintf("%s/sessions", tmp);
+ sfree(tmp);
+ return ret;
+ }
+ if (index == INDEX_SESSION) {
+ char *munged = mungestr(subname);
+ tmp = make_filename(INDEX_SESSIONDIR, NULL);
+ ret = dupprintf("%s/%s", tmp, munged);
+ sfree(tmp);
+ sfree(munged);
+ return ret;
+ }
+ if (index == INDEX_HOSTKEYS) {
+ env = getenv("PUTTYSSHHOSTKEYS");
+ if (env)
+ return dupstr(env);
+ tmp = make_filename(INDEX_DIR, NULL);
+ ret = dupprintf("%s/sshhostkeys", tmp);
+ sfree(tmp);
+ return ret;
+ }
+ if (index == INDEX_HOSTKEYS_TMP) {
+ tmp = make_filename(INDEX_HOSTKEYS, NULL);
+ ret = dupprintf("%s.tmp", tmp);
+ sfree(tmp);
+ return ret;
+ }
+ if (index == INDEX_RANDSEED) {
+ env = getenv("PUTTYRANDOMSEED");
+ if (env)
+ return dupstr(env);
+ tmp = make_filename(INDEX_DIR, NULL);
+ ret = dupprintf("%s/randomseed", tmp);
+ sfree(tmp);
+ return ret;
+ }
+ tmp = make_filename(INDEX_DIR, NULL);
+ ret = dupprintf("%s/ERROR", tmp);
+ sfree(tmp);
+ return ret;