tcsh/tcsh-6.17.02-history.dif
2011-02-07 12:46:12 +00:00

154 lines
4.0 KiB
Plaintext

--- sh.c
+++ sh.c 2007-10-15 10:03:11.000000000 +0000
@@ -1811,7 +1811,7 @@ static Char *jobargv[2] = {STRjobs, 0}
* and finally go through the normal error mechanism, which
* gets a chance to make the shell go away.
*/
-int just_signaled; /* bugfix by Michael Bloom (mg@ttidca.TTI.COM) */
+int just_signaled = 0; /* bugfix by Michael Bloom (mg@ttidca.TTI.COM) */
void
pintr(void)
--- sh.err.c
+++ sh.err.c 2009-03-25 10:35:17.000000000 +0000
@@ -51,6 +51,7 @@ char *seterr = NULL; /* Holds last err
#define ERR_NAME 0x10000000
#define ERR_SILENT 0x20000000
#define ERR_OLD 0x40000000
+#define ERR_INTERRUPT 0x80000000
#define ERR_SYNTAX 0
#define ERR_NOTALLOWED 1
@@ -608,7 +609,8 @@ stderror(unsigned int id, ...)
* will go to 1/2 else to FSHOUT/FSHDIAG. See flush in sh.print.c.
*/
flush();/*FIXRESET*/
- haderr = 1; /* Now to diagnostic output */
+ if (!(flags & ERR_INTERRUPT))
+ haderr = 1; /* Now to diagnostic output */
if (flags & ERR_NAME)
xprintf("%s: ", bname);/*FIXRESET*/
if ((flags & ERR_OLD)) {
@@ -649,5 +651,6 @@ stderror(unsigned int id, ...)
if (tpgrp > 0)
(void) tcsetpgrp(FSHTTY, tpgrp);
#endif
- reset(); /* Unwind */
+ if (!(flags & ERR_INTERRUPT))
+ reset(); /* Unwind */
}
--- sh.h
+++ sh.h 2007-10-11 22:00:00.000000000 +0000
@@ -565,6 +565,7 @@ EXTERN int neednote IZERO; /* Need to
EXTERN int noexec IZERO; /* Don't execute, just syntax check */
EXTERN int pjobs IZERO; /* want to print jobs if interrupted */
EXTERN int setintr IZERO; /* Set interrupts on/off -> Wait intr... */
+EXTERN int handle_intr IZERO;/* Set interrupts on/off -> Wait intr... */
EXTERN int havhash IZERO; /* path hashing is available */
EXTERN int editing IZERO; /* doing filename expansion and line editing */
EXTERN int noediting IZERO; /* initial $term defaulted to noedit */
--- sh.hist.c
+++ sh.hist.c 2007-10-11 22:00:00.000000000 +0000
@@ -1279,9 +1279,9 @@ rechist(Char *fname, int ref)
setv(STRverbose, verb, VAR_READWRITE);
}
fp = xcreat(short2str(fname), 0600);
+ cleanup_until(fname);
if (fp == -1) {
didfds = oldidfds;
- cleanup_until(fname);
return;
}
ftmp = SHOUT;
@@ -1291,7 +1291,6 @@ rechist(Char *fname, int ref)
xclose(fp);
SHOUT = ftmp;
didfds = oldidfds;
- cleanup_until(fname);
}
--- sh.print.c
+++ sh.print.c 2007-10-15 10:09:16.000000000 +0000
@@ -222,7 +222,8 @@ drainoline(void)
void
flush(void)
{
- int unit;
+ int unit, oldexitset = exitset;
+ unsigned int errid = ERR_SILENT;
static int interrupted = 0;
/* int lmode; */
@@ -231,10 +232,14 @@ flush(void)
return;
if (GettingInput && !Tty_raw_mode && linp < &linbuf[sizeof linbuf - 10])
return;
+ if (handle_intr) {
+ errid |= ERR_INTERRUPT;
+ exitset = 1;
+ }
if (interrupted) {
interrupted = 0;
linp = linbuf; /* avoid recursion as stderror calls flush */
- stderror(ERR_SILENT);
+ stderror(errid);
}
interrupted = 1;
if (haderr)
@@ -286,13 +291,14 @@ flush(void)
case EDQUOT:
#endif
/* Nothing to do, but die */
- xexit(1);
- break;
+ if (handle_intr == 0)
+ xexit(1);
default:
- stderror(ERR_SILENT);
+ stderror(errid);
break;
}
+ exitset = oldexitset;
linp = linbuf;
interrupted = 0;
}
--- tc.sig.c
+++ tc.sig.c 2007-10-11 22:00:00.000000000 +0000
@@ -60,25 +60,34 @@ int alrmcatch_disabled; /* = 0; */
int phup_disabled; /* = 0; */
int pchild_disabled; /* = 0; */
int pintr_disabled; /* = 0; */
+int handle_intr = 0;
void
handle_pending_signals(void)
{
if (!phup_disabled && phup_pending) {
phup_pending = 0;
+ handle_intr++;
phup();
+ handle_intr--;
}
if (!pintr_disabled && pintr_pending) {
pintr_pending = 0;
+ handle_intr++;
pintr();
+ handle_intr--;
}
if (!pchild_disabled && pchild_pending) {
pchild_pending = 0;
+ handle_intr++;
pchild();
+ handle_intr--;
}
if (!alrmcatch_disabled && alrmcatch_pending) {
alrmcatch_pending = 0;
+ handle_intr++;
alrmcatch();
+ handle_intr--;
}
}