diff --git a/putty.h b/putty.h index f0b93a5f..c5a08b18 100644 --- a/putty.h +++ b/putty.h @@ -369,6 +369,9 @@ struct config_tag { } sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1, sshbug_hmac2, sshbug_derivekey2, sshbug_rsapad2, sshbug_dhgex2; + /* Options for pterm. Should split out into platform-dependent part. */ + int stamp_utmp; + int login_shell; }; /* diff --git a/settings.c b/settings.c index 46afb737..41127b89 100644 --- a/settings.c +++ b/settings.c @@ -309,6 +309,8 @@ void save_settings(char *section, int do_host, Config * cfg) write_setting_i(sesskey, "BugDeriveKey2", cfg->sshbug_derivekey2); write_setting_i(sesskey, "BugRSAPad2", cfg->sshbug_rsapad2); write_setting_i(sesskey, "BugDHGEx2", cfg->sshbug_dhgex2); + write_setting_i(sesskey, "StampUtmp", cfg->stamp_utmp); + write_setting_i(sesskey, "LoginShell", cfg->login_shell); close_settings_w(sesskey); } @@ -592,6 +594,8 @@ void load_settings(char *section, int do_host, Config * cfg) gppi(sesskey, "BugDeriveKey2", BUG_AUTO, &i); cfg->sshbug_derivekey2 = i; gppi(sesskey, "BugRSAPad2", BUG_AUTO, &i); cfg->sshbug_rsapad2 = i; gppi(sesskey, "BugDHGEx2", BUG_AUTO, &i); cfg->sshbug_dhgex2 = i; + gppi(sesskey, "StampUtmp", 1, &cfg->stamp_utmp); + gppi(sesskey, "LoginShell", 1, &cfg->login_shell); close_settings_r(sesskey); } diff --git a/unix/pterm.c b/unix/pterm.c index c5d742c0..769f728b 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -1283,7 +1283,6 @@ char *get_x_display(void) int main(int argc, char **argv) { extern int pty_master_fd; /* declared in pty.c */ - extern int pty_stamp_utmp; /* declared in pty.c */ extern char **pty_argv; /* declared in pty.c */ int err = 0; @@ -1331,7 +1330,10 @@ int main(int argc, char **argv) cfg.hide_mouseptr = 1; } if (!strcmp(p, "-ut-")) { - pty_stamp_utmp = 0; + cfg.stamp_utmp = 0; + } + if (!strcmp(p, "-ls-")) { + cfg.login_shell = 0; } if (!strcmp(p, "-nethack")) { cfg.nethack_keypad = 1; diff --git a/unix/pty.c b/unix/pty.c index a685146a..a3d2fc73 100644 --- a/unix/pty.c +++ b/unix/pty.c @@ -55,7 +55,6 @@ #endif int pty_master_fd; -int pty_stamp_utmp = 1; static int pty_stamped_utmp = 0; static int pty_child_pid; static sig_atomic_t pty_child_dead; @@ -82,7 +81,7 @@ static void setup_utmp(char *ttyname) char *location; FILE *wtmp; - if (!pty_stamp_utmp) + if (!cfg.stamp_utmp) return; pw = getpwuid(getuid()); @@ -130,7 +129,7 @@ static void cleanup_utmp(void) #ifndef OMIT_UTMP FILE *wtmp; - if (!pty_stamp_utmp || !pty_stamped_utmp) + if (!cfg.stamp_utmp || !pty_stamped_utmp) return; utmp_entry.ut_type = DEAD_PROCESS; @@ -341,8 +340,19 @@ static char *pty_init(char *host, int port, char **realhost, int nodelay) } if (pty_argv) execvp(pty_argv[0], pty_argv); - else - execl(getenv("SHELL"), getenv("SHELL"), NULL); + else { + char *shell = getenv("SHELL"); + char *shellname; + if (cfg.login_shell) { + char *p = strrchr(shell, '/'); + shellname = smalloc(2+strlen(shell)); + p = p ? p+1 : shell; + sprintf(shellname, "-%s", p); + } else + shellname = shell; + execl(getenv("SHELL"), shellname, NULL); + } + /* * If we're here, exec has gone badly foom. */