From 5a9eb1056517b6ee6efa526a3a6b5a21aa802648 Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 9 Jan 2003 18:06:29 +0000 Subject: [PATCH] I'm sick of all those #ifdefs in settings.c, and in any case plink and pterm need at least one default setting to be _different_ (pterm needs the default term type to be `xterm', while plink needs it to be taken from $TERM). So here's a completely new alternative mechanism for platform- and app-specific default settings. Ben will probably want to check the integrity of the Mac port, since I've fiddled with it without testing that it still compiles. git-svn-id: svn://svn.tartarus.org/sgt/putty@2513 cda61777-01e9-0310-a592-d414129be87e --- Recipe | 1 + mac/mac.c | 23 ++++++++++++++++++++- putty.h | 12 +++++++++++ settings.c | 53 ++++++++++++------------------------------------ unix/pterm.c | 17 ++++++++++++++++ unix/uxplink.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ windefs.c | 25 +++++++++++++++++++++++ 7 files changed, 154 insertions(+), 41 deletions(-) create mode 100644 windefs.c diff --git a/Recipe b/Recipe index 8d6ec6f1..3569fbeb 100644 --- a/Recipe +++ b/Recipe @@ -109,6 +109,7 @@ SFTP = sftp int64 logging # Miscellaneous objects appearing in all the network utilities (not # Pageant or PuTTYgen). WINMISC = misc version winstore settings tree234 winnet proxy cmdline + + windefs UXMISC = misc version uxstore settings tree234 uxnet proxy cmdline MACMISC = misc version macstore settings tree234 mtcpnet proxy diff --git a/mac/mac.c b/mac/mac.c index 21a2f010..a2c9b08f 100644 --- a/mac/mac.c +++ b/mac/mac.c @@ -1,4 +1,4 @@ -/* $Id: mac.c,v 1.20 2003/01/08 22:46:12 ben Exp $ */ +/* $Id: mac.c,v 1.21 2003/01/09 18:06:29 simon Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. @@ -694,6 +694,27 @@ void old_keyfile_warning(void) } +char *platform_default_s(char *name) +{ + if (!strcmp(name, "Font")) + return "Monaco"; + return NULL; +} + +int platform_default_i(char *name, int def) +{ + if (!strcmp(name, "FontHeight")) + return 9; + /* Non-raw cut and paste of line-drawing chars works badly on the + * current Unix stub implementation of the Unicode functions. + * So I'm going to temporarily set the default to raw mode so + * that the failure mode isn't quite so drastically horrid. + * When Unicode comes in, this can all be put right. */ + if (!strcmp(name, "RawCNP")) + return 1; + return def; +} + /* * Local Variables: * c-file-style: "simon" diff --git a/putty.h b/putty.h index 93fef20c..c4e6d987 100644 --- a/putty.h +++ b/putty.h @@ -482,6 +482,18 @@ void do_defaults(char *, Config *); void registry_cleanup(void); /* + * Functions used by settings.c to provide platform-specific + * default settings. + * + * (The integer one is expected to return `def' if it has no clear + * opinion of its own. This is because there's no integer value + * which I can reliably set aside to indicate `nil'. The string + * function is perfectly all right returning NULL, of course.) + */ +char *platform_default_s(char *name); +int platform_default_i(char *name, int def); + +/* * Exports from terminal.c. */ diff --git a/settings.c b/settings.c index 6f488d82..b36affc2 100644 --- a/settings.c +++ b/settings.c @@ -23,13 +23,22 @@ static const struct keyval ciphernames[] = { static void gpps(void *handle, char *name, char *def, char *val, int len) { if (!read_setting_s(handle, name, val, len)) { - strncpy(val, def, len); + char *pdef; + + pdef = platform_default_s(name); + if (pdef) { + strncpy(val, pdef, len); + } else { + strncpy(val, def, len); + } + val[len - 1] = '\0'; } } static void gppi(void *handle, char *name, int def, int *i) { + def = platform_default_i(name, def); *i = read_setting_i(handle, name, def); } @@ -367,13 +376,7 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg) * 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, "CloseOnExit", COE_NORMAL, &cfg->close_on_exit); gppi(sesskey, "WarnOnClose", 1, &cfg->warn_on_close); { /* This is two values for backward compatibility with 0.50/0.51 */ @@ -492,22 +495,10 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg) gpps(sesskey, "WinTitle", "", cfg->wintitle, sizeof(cfg->wintitle)); gppi(sesskey, "TermWidth", 80, &cfg->width); 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 + gpps(sesskey, "Font", "XXX", cfg->font, sizeof(cfg->font)); gppi(sesskey, "FontIsBold", 0, &cfg->fontisbold); -#ifdef _WINDOWS - gppi(sesskey, "FontCharSet", ANSI_CHARSET, &cfg->fontcharset); -#endif -#ifdef macintosh - gppi(sesskey, "FontHeight", 9, &cfg->fontheight); -#else + gppi(sesskey, "FontCharSet", 0, &cfg->fontcharset); gppi(sesskey, "FontHeight", 10, &cfg->fontheight); -#endif #ifdef _WINDOWS if (cfg->fontheight < 0) { int oldh, newh; @@ -543,16 +534,7 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg) cfg->colours[i][2] = c2; } } -#ifndef _WINDOWS - /* Non-raw cut and paste of line-drawing chars works badly on the - * current Unix stub implementation of the Unicode functions. - * So I'm going to temporarily set the default to raw mode so - * that the failure mode isn't quite so drastically horrid. - * When Unicode comes in, this can all be put right. */ - gppi(sesskey, "RawCNP", 1, &cfg->rawcnp); -#else gppi(sesskey, "RawCNP", 0, &cfg->rawcnp); -#endif gppi(sesskey, "PasteRTF", 0, &cfg->rtf_paste); gppi(sesskey, "MouseIsXterm", 0, &cfg->mouse_is_xterm); gppi(sesskey, "RectSelect", 0, &cfg->rect_select); @@ -598,17 +580,8 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg) gppi(sesskey, "BCE", 1, &cfg->bce); gppi(sesskey, "BlinkText", 0, &cfg->blinktext); gppi(sesskey, "X11Forward", 0, &cfg->x11_forward); -#ifdef _WINDOWS gpps(sesskey, "X11Display", "localhost:0", cfg->x11_display, sizeof(cfg->x11_display)); -#else - { - /* On Unix, the default X display should simply be $DISPLAY. */ - char *disp = getenv("DISPLAY"); - gpps(sesskey, "X11Display", disp, cfg->x11_display, - sizeof(cfg->x11_display)); - } -#endif gppi(sesskey, "LocalPortAcceptAll", 0, &cfg->lport_acceptall); gppi(sesskey, "RemotePortAcceptAll", 0, &cfg->rport_acceptall); diff --git a/unix/pterm.c b/unix/pterm.c index b7e2b934..dbcb5455 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -83,6 +83,23 @@ char *x_get_default(char *key) return XGetDefault(GDK_DISPLAY(), app_name, key); } +/* + * Default settings that are specific to pterm. + */ +char *platform_default_s(char *name) +{ + if (!strcmp(name, "Font")) + return "fixed"; /* COE_NORMAL works badly in an xterm */ + return NULL; +} + +int platform_default_i(char *name, int def) +{ + if (!strcmp(name, "CloseOnExit")) + return COE_ALWAYS; /* COE_NORMAL works badly in an xterm */ + return def; +} + void ldisc_update(void *frontend, int echo, int edit) { /* diff --git a/unix/uxplink.c b/unix/uxplink.c index 99ace88a..a005ce6d 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include /* More helpful version of the FD_SET macro, to also handle maxfd. */ #define FD_SET_MAX(fd, max, set) do { \ @@ -69,6 +71,68 @@ struct termios orig_termios; static Backend *back; static void *backhandle; +/* + * Default settings that are specific to pterm. + */ +char *platform_default_s(char *name) +{ + if (!strcmp(name, "X11Display")) + return getenv("DISPLAY"); + if (!strcmp(name, "TermType")) + return getenv("TERM"); + if (!strcmp(name, "UserName")) { + /* + * Remote login username will default to the local username. + */ + struct passwd *p; + uid_t uid = getuid(); + char *user, *ret = NULL; + + /* + * First, find who we think we are using getlogin. If this + * agrees with our uid, we'll go along with it. This should + * allow sharing of uids between several login names whilst + * coping correctly with people who have su'ed. + */ + user = getlogin(); + setpwent(); + if (user) + p = getpwnam(user); + else + p = NULL; + if (p && p->pw_uid == uid) { + /* + * The result of getlogin() really does correspond to + * our uid. Fine. + */ + ret = user; + } else { + /* + * If that didn't work, for whatever reason, we'll do + * the simpler version: look up our uid in the password + * file and map it straight to a name. + */ + p = getpwuid(uid); + ret = p->pw_name; + } + endpwent(); + + return ret; + } + return NULL; +} + +int platform_default_i(char *name, int def) +{ + if (!strcmp(name, "TermWidth") || + !strcmp(name, "TermHeight")) { + struct winsize size; + if (ioctl(0, TIOCGWINSZ, (void *)&size) >= 0) + return (!strcmp(name, "TermWidth") ? size.ws_col : size.ws_row); + } + return def; +} + char *x_get_default(char *key) { return NULL; /* this is a stub */ diff --git a/windefs.c b/windefs.c new file mode 100644 index 00000000..88e9fe61 --- /dev/null +++ b/windefs.c @@ -0,0 +1,25 @@ +/* + * windefs.c: default settings that are specific to Windows. + */ + +#include +#include + +#include "winstuff.h" +#include "puttymem.h" + +#include "putty.h" + +char *platform_default_s(char *name) +{ + if (!strcmp(name, "Font")) + return "Courier New"; + return NULL; +} + +int platform_default_i(char *name, int def) +{ + if (!strcmp(name, "FontCharSet")) + return ANSI_CHARSET; + return def; +} -- 2.11.0