X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxstore.c;h=15801785cbd93106d611a64aaf2a38aea77ba9d4;hb=8d48caa849907d6737fbdaee5fc49907beb899c2;hp=f2efc71baac38d2f540952e36c821a79e1512f7a;hpb=407fd7b9ab2cb92d365569f7a62b10311874606b;p=PuTTY.git diff --git a/unix/uxstore.c b/unix/uxstore.c index f2efc71b..15801785 100644 --- a/unix/uxstore.c +++ b/unix/uxstore.c @@ -98,17 +98,78 @@ static char *make_filename(int index, const char *subname) */ if (index == INDEX_DIR) { struct passwd *pwd; + char *xdg_dir, *old_dir, *old_dir2, *old_dir3, *home, *pwd_home; env = getenv("PUTTYDIR"); if (env) return dupstr(env); - env = getenv("HOME"); - if (env) - return dupprintf("%s/.putty", env); + + home = getenv("HOME"); pwd = getpwuid(getuid()); - if (pwd && pwd->pw_dir) - return dupprintf("%s/.putty", pwd->pw_dir); - return dupstr("/.putty"); + if (pwd && pwd->pw_dir) { + pwd_home = pwd->pw_dir; + } else { + pwd_home = NULL; + } + + xdg_dir = NULL; + env = getenv("XDG_CONFIG_HOME"); + if (env && *env) { + xdg_dir = dupprintf("%s/putty", env); + } + if (!xdg_dir) { + if (home) { + tmp = home; + } else if (pwd_home) { + tmp = pwd_home; + } else { + tmp = ""; + } + xdg_dir = dupprintf("%s/.config/putty", tmp); + } + if (xdg_dir && access(xdg_dir, F_OK) == 0) { + return xdg_dir; + } + + old_dir = old_dir2 = old_dir3 = NULL; + if (home) { + old_dir = dupprintf("%s/.putty", home); + } + if (pwd_home) { + old_dir2 = dupprintf("%s/.putty", pwd_home); + } + old_dir3 = dupstr("/.putty"); + + if (old_dir && access(old_dir, F_OK) == 0) { + ret = old_dir; + goto out; + } + if (old_dir2 && access(old_dir2, F_OK) == 0) { + ret = old_dir2; + goto out; + } + if (access(old_dir3, F_OK) == 0) { + ret = old_dir3; + goto out; + } +#ifdef XDG_DEFAULT + if (xdg_dir) { + ret = xdg_dir; + goto out; + } +#endif + ret = old_dir ? old_dir : (old_dir2 ? old_dir2 : old_dir3); + + out: + if (ret != old_dir) + sfree(old_dir); + if (ret != old_dir2) + sfree(old_dir2); + if (ret != old_dir3) + sfree(old_dir3); + if (ret != xdg_dir) + sfree(xdg_dir); + return ret; } if (index == INDEX_SESSIONDIR) { env = getenv("PUTTYSESSIONS"); @@ -159,7 +220,7 @@ static char *make_filename(int index, const char *subname) void *open_settings_w(const char *sessionname, char **errmsg) { - char *filename; + char *filename, *err; FILE *fp; *errmsg = NULL; @@ -169,18 +230,18 @@ void *open_settings_w(const char *sessionname, char **errmsg) * subdir actually exist. */ filename = make_filename(INDEX_DIR, NULL); - if (mkdir(filename, 0700) < 0 && errno != EEXIST) { - *errmsg = dupprintf("Unable to save session: mkdir(\"%s\") " - "returned '%s'", filename, strerror(errno)); + if ((err = make_dir_path(filename, 0700)) != NULL) { + *errmsg = dupprintf("Unable to save session: %s", err); + sfree(err); sfree(filename); return NULL; } sfree(filename); filename = make_filename(INDEX_SESSIONDIR, NULL); - if (mkdir(filename, 0700) < 0 && errno != EEXIST) { - *errmsg = dupprintf("Unable to save session: mkdir(\"%s\") " - "returned '%s'", filename, strerror(errno)); + if ((err = make_dir_path(filename, 0700)) != NULL) { + *errmsg = dupprintf("Unable to save session: %s", err); + sfree(err); sfree(filename); return NULL; } @@ -589,6 +650,16 @@ int verify_host_key(const char *hostname, int port, return ret; } +int have_ssh_host_key(const char *hostname, int port, + const char *keytype) +{ + /* + * If we have a host key, verify_host_key will return 0 or 2. + * If we don't have one, it'll return 1. + */ + return verify_host_key(hostname, port, keytype, "") != 1; +} + void store_host_key(const char *hostname, int port, const char *keytype, const char *key) { @@ -603,13 +674,12 @@ void store_host_key(const char *hostname, int port, tmpfilename = make_filename(INDEX_HOSTKEYS_TMP, NULL); wfp = fopen(tmpfilename, "w"); if (!wfp && errno == ENOENT) { - char *dir; + char *dir, *errmsg; dir = make_filename(INDEX_DIR, NULL); - if (mkdir(dir, 0700) < 0) { - char *msg = dupprintf("Unable to store host key: mkdir(\"%s\") " - "returned '%s'", dir, strerror(errno)); - nonfatal(msg); + if ((errmsg = make_dir_path(dir, 0700)) != NULL) { + nonfatal("Unable to store host key: %s", errmsg); + sfree(errmsg); sfree(dir); sfree(tmpfilename); return; @@ -619,9 +689,8 @@ void store_host_key(const char *hostname, int port, wfp = fopen(tmpfilename, "w"); } if (!wfp) { - char *msg = dupprintf("Unable to store host key: open(\"%s\") " - "returned '%s'", tmpfilename, strerror(errno)); - nonfatal(msg); + nonfatal("Unable to store host key: open(\"%s\") " + "returned '%s'", tmpfilename, strerror(errno)); sfree(tmpfilename); return; } @@ -651,7 +720,11 @@ void store_host_key(const char *hostname, int port, fclose(wfp); - rename(tmpfilename, filename); + if (rename(tmpfilename, filename) < 0) { + nonfatal("Unable to store host key: rename(\"%s\",\"%s\")" + " returned '%s'", tmpfilename, filename, + strerror(errno)); + } sfree(tmpfilename); sfree(filename); @@ -689,31 +762,28 @@ void write_random_seed(void *data, int len) fd = open(fname, O_CREAT | O_WRONLY, 0600); if (fd < 0) { if (errno != ENOENT) { - char *msg = dupprintf("Unable to write random seed: open(\"%s\") " - "returned '%s'", fname, strerror(errno)); - nonfatal(msg); - sfree(msg); + nonfatal("Unable to write random seed: open(\"%s\") " + "returned '%s'", fname, strerror(errno)); + sfree(fname); return; } - char *dir; + char *dir, *errmsg; dir = make_filename(INDEX_DIR, NULL); - if (mkdir(dir, 0700) < 0) { - char *msg = dupprintf("Unable to write random seed: mkdir(\"%s\") " - "returned '%s'", dir, strerror(errno)); - nonfatal(msg); - sfree(msg); + if ((errmsg = make_dir_path(dir, 0700)) != NULL) { + nonfatal("Unable to write random seed: %s", errmsg); + sfree(errmsg); + sfree(fname); sfree(dir); return; } sfree(dir); fd = open(fname, O_CREAT | O_WRONLY, 0600); - if (errno != ENOENT) { - char *msg = dupprintf("Unable to write random seed: open(\"%s\") " - "returned '%s'", fname, strerror(errno)); - nonfatal(msg); - sfree(msg); + if (fd < 0) { + nonfatal("Unable to write random seed: open(\"%s\") " + "returned '%s'", fname, strerror(errno)); + sfree(fname); return; } } @@ -721,10 +791,8 @@ void write_random_seed(void *data, int len) while (len > 0) { int ret = write(fd, data, len); if (ret < 0) { - char *msg = dupprintf("Unable to write random seed: write " - "returned '%s'", strerror(errno)); - nonfatal(msg); - sfree(msg); + nonfatal("Unable to write random seed: write " + "returned '%s'", strerror(errno)); break; } len -= ret;