summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--Src/init.c20
-rw-r--r--Src/jobs.c5
3 files changed, 24 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index cc66e7b1b..93efdb2c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2003-09-22 Peter Stephenson <pws@csr.com>
+ * 19105: Src/init.c, Src/jobs.c: Set shout to stderr if we
+ are interactive but have no terminal. Prevents crash in
+ history and potentially elsewhere.
+
* 19112: Completion/Unix/Command/_perforce: several improvements
and bug fixes.
diff --git a/Src/init.c b/Src/init.c
index 5c395afe2..51cbe0d3a 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -379,7 +379,13 @@ init_io(void)
#endif
if (shout) {
- fclose(shout);
+ /*
+ * Check if shout was set to stderr, if so don't close it.
+ * We do this if we are interactive but don't have a
+ * terminal.
+ */
+ if (shout != stderr)
+ fclose(shout);
shout = 0;
}
if (SHTTY != -1) {
@@ -448,9 +454,9 @@ init_io(void)
/* We will only use zle if shell is interactive, *
* SHTTY != -1, and shout != 0 */
- if (interact && SHTTY != -1) {
+ if (interact) {
init_shout();
- if(!shout)
+ if(!SHTTY || !shout)
opts[USEZLE] = 0;
} else
opts[USEZLE] = 0;
@@ -475,6 +481,14 @@ mod_export void
init_shout(void)
{
static char shoutbuf[BUFSIZ];
+
+ if (SHTTY == -1)
+ {
+ /* Since we're interative, it's nice to have somewhere to write. */
+ shout = stderr;
+ return;
+ }
+
#if defined(JOB_CONTROL) && defined(TIOCSETD) && defined(NTTYDISC)
int ldisc = NTTYDISC;
diff --git a/Src/jobs.c b/Src/jobs.c
index c94f694ee..f7c24ab3f 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -322,8 +322,9 @@ update_job(Job jn)
}
}
- if (shout && !ttyfrozen && !jn->stty_in_env && !zleactive &&
- job == thisjob && !somestopped && !(jn->stat & STAT_NOSTTY))
+ if (shout && shout != stderr && !ttyfrozen && !jn->stty_in_env &&
+ !zleactive && job == thisjob && !somestopped &&
+ !(jn->stat & STAT_NOSTTY))
gettyinfo(&shttyinfo);
if (isset(MONITOR)) {