1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Flag user cancellation of authentication as a clean exit, so that it

will close the window even in `close window only on clean exit'
mode. Also, while I'm here, arrange a suitable exit code for
"exit-signal".

[originally from svn r7121]
This commit is contained in:
Simon Tatham 2007-01-17 18:38:45 +00:00
parent f437af50f1
commit 6716b1513e

82
ssh.c
View File

@ -7,6 +7,7 @@
#include <stdarg.h>
#include <assert.h>
#include <limits.h>
#include <signal.h>
#include "putty.h"
#include "tree234.h"
@ -2701,6 +2702,9 @@ static int ssh_closing(Plug plug, const char *error_msg, int error_code,
error_msg = "Server closed network connection";
}
if (ssh->close_expected && ssh->clean_exit && ssh->exitcode < 0)
ssh->exitcode = 0;
if (need_notify)
notify_remote_exit(ssh->frontend);
@ -6365,11 +6369,13 @@ static void ssh2_msg_channel_request(Ssh ssh, struct Packet *pktin)
is_plausible = FALSE;
}
}
ssh->exitcode = 128; /* means `unknown signal' */
if (is_plausible) {
if (is_int) {
/* Old non-standard OpenSSH. */
int signum = ssh_pkt_getuint32(pktin);
fmt_sig = dupprintf(" %d", signum);
ssh->exitcode = 128 + signum;
} else {
/* As per the drafts. */
char *sig;
@ -6381,6 +6387,82 @@ static void ssh2_msg_channel_request(Ssh ssh, struct Packet *pktin)
fmt_sig = dupprintf(" \"%.*s\"",
siglen, sig);
}
/*
* Really hideous method of translating the
* signal description back into a locally
* meaningful number.
*/
if (0)
;
#ifdef SIGABRT
else if (siglen == lenof("ABRT")-1 &&
!memcmp(sig, "ABRT", siglen))
ssh->exitcode = 128 + SIGABRT;
#endif
#ifdef SIGALRM
else if (siglen == lenof("ALRM")-1 &&
!memcmp(sig, "ALRM", siglen))
ssh->exitcode = 128 + SIGALRM;
#endif
#ifdef SIGFPE
else if (siglen == lenof("FPE")-1 &&
!memcmp(sig, "FPE", siglen))
ssh->exitcode = 128 + SIGFPE;
#endif
#ifdef SIGHUP
else if (siglen == lenof("HUP")-1 &&
!memcmp(sig, "HUP", siglen))
ssh->exitcode = 128 + SIGHUP;
#endif
#ifdef SIGILL
else if (siglen == lenof("ILL")-1 &&
!memcmp(sig, "ILL", siglen))
ssh->exitcode = 128 + SIGILL;
#endif
#ifdef SIGINT
else if (siglen == lenof("INT")-1 &&
!memcmp(sig, "INT", siglen))
ssh->exitcode = 128 + SIGINT;
#endif
#ifdef SIGKILL
else if (siglen == lenof("KILL")-1 &&
!memcmp(sig, "KILL", siglen))
ssh->exitcode = 128 + SIGKILL;
#endif
#ifdef SIGPIPE
else if (siglen == lenof("PIPE")-1 &&
!memcmp(sig, "PIPE", siglen))
ssh->exitcode = 128 + SIGPIPE;
#endif
#ifdef SIGQUIT
else if (siglen == lenof("QUIT")-1 &&
!memcmp(sig, "QUIT", siglen))
ssh->exitcode = 128 + SIGQUIT;
#endif
#ifdef SIGSEGV
else if (siglen == lenof("SEGV")-1 &&
!memcmp(sig, "SEGV", siglen))
ssh->exitcode = 128 + SIGSEGV;
#endif
#ifdef SIGTERM
else if (siglen == lenof("TERM")-1 &&
!memcmp(sig, "TERM", siglen))
ssh->exitcode = 128 + SIGTERM;
#endif
#ifdef SIGUSR1
else if (siglen == lenof("USR1")-1 &&
!memcmp(sig, "USR1", siglen))
ssh->exitcode = 128 + SIGUSR1;
#endif
#ifdef SIGUSR2
else if (siglen == lenof("USR2")-1 &&
!memcmp(sig, "USR2", siglen))
ssh->exitcode = 128 + SIGUSR2;
#endif
else
ssh->exitcode = 128;
}
core = ssh2_pkt_getbool(pktin);
ssh_pkt_getstring(pktin, &msg, &msglen);