154 lines
4.0 KiB
Plaintext
154 lines
4.0 KiB
Plaintext
--- sh.c
|
|
+++ sh.c 2007-10-15 12:03:11.216084278 +0200
|
|
@@ -1770,7 +1770,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 2007-10-15 11:53:17.760845847 +0200
|
|
@@ -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
|
|
@@ -600,7 +601,8 @@ stderror(unsigned int id, ...)
|
|
* 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_SILENT)) {
|
|
if (flags & ERR_NAME)
|
|
@@ -643,5 +645,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-12 00:00:00.000000000 +0200
|
|
@@ -548,6 +548,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-12 00:00:00.000000000 +0200
|
|
@@ -425,9 +425,9 @@ rechist(Char *fname, int ref)
|
|
if (shist->vec[1] && eq(shist->vec[1], STRmerge))
|
|
loadhist(fname, 1);
|
|
fp = xcreat(short2str(fname), 0600);
|
|
+ cleanup_until(fname);
|
|
if (fp == -1) {
|
|
didfds = oldidfds;
|
|
- cleanup_until(fname);
|
|
return;
|
|
}
|
|
ftmp = SHOUT;
|
|
@@ -437,7 +437,6 @@ rechist(Char *fname, int ref)
|
|
xclose(fp);
|
|
SHOUT = ftmp;
|
|
didfds = oldidfds;
|
|
- cleanup_until(fname);
|
|
}
|
|
|
|
|
|
--- sh.print.c
|
|
+++ sh.print.c 2007-10-15 12:09:15.994329114 +0200
|
|
@@ -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-12 00:00:00.000000000 +0200
|
|
@@ -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--;
|
|
}
|
|
}
|
|
|