+ char *home;
+ int len;
+ home = getenv("HOME");
+ if (!home)
+ home="/";
+ strncpy(filename, home, FILENAME_MAX);
+ len = strlen(filename);
+ if (index == INDEX_SESSION) {
+ char *munged = mungestr(subname);
+ char *fn = dupprintf("/.putty/sessions/%s", munged);
+ strncpy(filename + len, fn, FILENAME_MAX - len);
+ sfree(fn);
+ sfree(munged);
+ } else {
+ strncpy(filename + len,
+ index == INDEX_DIR ? "/.putty" :
+ index == INDEX_SESSIONDIR ? "/.putty/sessions" :
+ index == INDEX_HOSTKEYS ? "/.putty/sshhostkeys" :
+ index == INDEX_HOSTKEYS_TMP ? "/.putty/sshhostkeys.tmp" :
+ index == INDEX_RANDSEED ? "/.putty/randomseed" :
+ "/.putty/ERROR", FILENAME_MAX - len);
+ }
+ filename[FILENAME_MAX-1] = '\0';
+}
+
+void *open_settings_w(const char *sessionname, char **errmsg)
+{
+ char filename[FILENAME_MAX];
+ FILE *fp;
+
+ *errmsg = NULL;
+
+ /*
+ * Start by making sure the .putty directory and its sessions
+ * subdir actually exist. Ignore error returns from mkdir since
+ * they're perfectly likely to be `already exists', and any
+ * other error will trip us up later on so there's no real need
+ * to catch it now.
+ */
+ make_filename(filename, INDEX_DIR, sessionname);
+ mkdir(filename, 0700);
+ make_filename(filename, INDEX_SESSIONDIR, sessionname);
+ mkdir(filename, 0700);
+
+ make_filename(filename, INDEX_SESSION, sessionname);
+ fp = fopen(filename, "w");
+ if (!fp) {
+ *errmsg = dupprintf("Unable to create %s: %s",
+ filename, strerror(errno));
+ return NULL; /* can't open */
+ }
+ return fp;
+}
+
+void write_setting_s(void *handle, const char *key, const char *value)
+{
+ FILE *fp = (FILE *)handle;
+ fprintf(fp, "%s=%s\n", key, value);