Support for doing DNS at the proxy end. I've invented a new type of
[u/mdw/putty] / settings.c
index 71ae49e..ce21d2c 100644 (file)
@@ -150,6 +150,8 @@ void save_settings(char *section, int do_host, Config * cfg)
 
     /* proxy settings */
     write_setting_s(sesskey, "ProxyExcludeList", cfg->proxy_exclude_list);
+    write_setting_i(sesskey, "ProxyDNS", cfg->proxy_dns);
+    write_setting_i(sesskey, "ProxyLocalhost", cfg->even_proxy_localhost);
     write_setting_i(sesskey, "ProxyType", cfg->proxy_type);
     write_setting_s(sesskey, "ProxyHost", cfg->proxy_host);
     write_setting_i(sesskey, "ProxyPort", cfg->proxy_port);
@@ -349,7 +351,23 @@ void load_settings(char *section, int do_host, Config * cfg)
            break;
        }
 
-    gppi(sesskey, "CloseOnExit", COE_NORMAL, &cfg->close_on_exit);
+    /*
+     * CloseOnExit defaults to closing only on a clean exit - but
+     * unfortunately not on Unix (pterm). On Unix, the exit code of
+     * a shell is the last exit code of one of its child processes,
+     * even if it's an interactive shell - so some pterms will
+     * close and some will not for no particularly good reason. The
+     * mode is still useful for specialist purposes (running a
+     * single command in its own pterm), but I don't think it's a
+     * sane default, unfortunately.
+     */
+    gppi(sesskey, "CloseOnExit",
+#ifdef _WINDOWS
+         COE_NORMAL,
+#else
+         COE_ALWAYS,
+#endif
+         &cfg->close_on_exit);
     gppi(sesskey, "WarnOnClose", 1, &cfg->warn_on_close);
     {
        /* This is two values for backward compatibility with 0.50/0.51 */
@@ -367,6 +385,8 @@ void load_settings(char *section, int do_host, Config * cfg)
     /* proxy settings */
     gpps(sesskey, "ProxyExcludeList", "", cfg->proxy_exclude_list,
         sizeof(cfg->proxy_exclude_list));
+    gppi(sesskey, "ProxyDNS", PROXYDNS_AUTO, &i); cfg->proxy_dns = i;
+    gppi(sesskey, "ProxyLocalhost", 0, &cfg->even_proxy_localhost);
     gppi(sesskey, "ProxyType", PROXY_NONE, &i); cfg->proxy_type = i;
     gpps(sesskey, "ProxyHost", "proxy", cfg->proxy_host,
         sizeof(cfg->proxy_host));
@@ -468,6 +488,8 @@ void load_settings(char *section, int do_host, Config * cfg)
     gppi(sesskey, "TermHeight", 24, &cfg->height);
 #ifdef _WINDOWS
     gpps(sesskey, "Font", "Courier New", cfg->font, sizeof(cfg->font));
+#elif defined(macintosh)
+    gpps(sesskey, "Font", "Monaco", cfg->font, sizeof(cfg->font));
 #else
     gpps(sesskey, "Font", "fixed", cfg->font, sizeof(cfg->font));
 #endif
@@ -475,7 +497,11 @@ void load_settings(char *section, int do_host, Config * cfg)
 #ifdef _WINDOWS
     gppi(sesskey, "FontCharSet", ANSI_CHARSET, &cfg->fontcharset);
 #endif
+#ifdef macintosh
+    gppi(sesskey, "FontHeight", 9, &cfg->fontheight);
+#else
     gppi(sesskey, "FontHeight", 10, &cfg->fontheight);
+#endif
 #ifdef _WINDOWS
     if (cfg->fontheight < 0) {
        int oldh, newh;
@@ -610,7 +636,7 @@ void load_settings(char *section, int do_host, Config * cfg)
     gppi(sesskey, "LoginShell", 1, &cfg->login_shell);
     gppi(sesskey, "ScrollbarOnLeft", 0, &cfg->scrollbar_on_left);
     gpps(sesskey, "BoldFont", "", cfg->boldfont, sizeof(cfg->boldfont));
-    gppi(sesskey, "ShadowBoldOffset", -1, &cfg->shadowboldoffset);
+    gppi(sesskey, "ShadowBoldOffset", 1, &cfg->shadowboldoffset);
 
     close_settings_r(sesskey);
 }
@@ -643,10 +669,9 @@ static int sessioncmp(const void *av, const void *bv)
     return strcmp(a, b);              /* otherwise, compare normally */
 }
 
-void get_sesslist(int allocate)
+void get_sesslist(struct sesslist *list, int allocate)
 {
-    static char otherbuf[2048];
-    static char *buffer;
+    char otherbuf[2048];
     int buflen, bufsize, i;
     char *p, *ret;
     void *handle;
@@ -654,24 +679,24 @@ void get_sesslist(int allocate)
     if (allocate) {
 
        buflen = bufsize = 0;
-       buffer = NULL;
-       if ((handle = enum_settings_start())) {
+       list->buffer = NULL;
+       if ((handle = enum_settings_start()) != NULL) {
            do {
                ret = enum_settings_next(handle, otherbuf, sizeof(otherbuf));
                if (ret) {
                    int len = strlen(otherbuf) + 1;
                    if (bufsize < buflen + len) {
                        bufsize = buflen + len + 2048;
-                       buffer = srealloc(buffer, bufsize);
+                       list->buffer = srealloc(list->buffer, bufsize);
                    }
-                   strcpy(buffer + buflen, otherbuf);
-                   buflen += strlen(buffer + buflen) + 1;
+                   strcpy(list->buffer + buflen, otherbuf);
+                   buflen += strlen(list->buffer + buflen) + 1;
                }
            } while (ret);
            enum_settings_finish(handle);
        }
-       buffer = srealloc(buffer, buflen + 1);
-       buffer[buflen] = '\0';
+       list->buffer = srealloc(list->buffer, buflen + 1);
+       list->buffer[buflen] = '\0';
 
        /*
         * Now set up the list of sessions. Note that "Default
@@ -679,31 +704,31 @@ void get_sesslist(int allocate)
         * doesn't really.
         */
 
-       p = buffer;
-       nsessions = 1;                 /* "Default Settings" counts as one */
+       p = list->buffer;
+       list->nsessions = 1;           /* "Default Settings" counts as one */
        while (*p) {
            if (strcmp(p, "Default Settings"))
-               nsessions++;
+               list->nsessions++;
            while (*p)
                p++;
            p++;
        }
 
-       sessions = smalloc((nsessions + 1) * sizeof(char *));
-       sessions[0] = "Default Settings";
-       p = buffer;
+       list->sessions = smalloc((list->nsessions + 1) * sizeof(char *));
+       list->sessions[0] = "Default Settings";
+       p = list->buffer;
        i = 1;
        while (*p) {
            if (strcmp(p, "Default Settings"))
-               sessions[i++] = p;
+               list->sessions[i++] = p;
            while (*p)
                p++;
            p++;
        }
 
-       qsort(sessions, i, sizeof(char *), sessioncmp);
+       qsort(list->sessions, i, sizeof(char *), sessioncmp);
     } else {
-       sfree(buffer);
-       sfree(sessions);
+       sfree(list->buffer);
+       sfree(list->sessions);
     }
 }