sh: Remove SIGWINCH handler and just check for resize before every read.

The SIGWINCH handler triggers breakage in libedit which is hard to fix; see
PR bin/169773.

Also, window size changes while a program is in foreground (and it rather
than sh will receive SIGWINCH) will now be picked up automatically.

Downside: it is now certain that a resize is only processed after pressing
<Enter>. If libedit is fixed, sh will most likely have to be changed also.

PR:		bin/180146
This commit is contained in:
Jilles Tjoelker 2014-01-14 22:56:25 +00:00
parent fd11bdfba7
commit d78fdfde89
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=260654
3 changed files with 3 additions and 23 deletions

View File

@ -162,20 +162,16 @@ preadfd(void)
int nr;
parsenextc = parsefile->buf;
#ifndef NO_HISTORY
if (el != NULL && gotwinch) {
gotwinch = 0;
el_resize(el);
}
#endif
retry:
#ifndef NO_HISTORY
if (parsefile->fd == 0 && el) {
static const char *rl_cp;
static int el_len;
if (rl_cp == NULL)
if (rl_cp == NULL) {
el_resize(el);
rl_cp = el_gets(el, &el_len);
}
if (rl_cp == NULL)
nr = el_len == 0 ? 0 : -1;
else {

View File

@ -80,7 +80,6 @@ static char *volatile trap[NSIG]; /* trap handler commands */
static volatile sig_atomic_t gotsig[NSIG];
/* indicates specified signal received */
static int ignore_sigchld; /* Used while handling SIGCHLD traps. */
volatile sig_atomic_t gotwinch;
static int last_trapsig;
static int exiting; /* exitshell() has been called */
@ -292,12 +291,6 @@ setsignal(int signo)
if (rootshell && mflag)
action = S_IGN;
break;
#endif
#ifndef NO_HISTORY
case SIGWINCH:
if (rootshell && iflag)
action = S_CATCH;
break;
#endif
}
}
@ -400,11 +393,6 @@ onsig(int signo)
gotsig[signo] = 1;
pendingsig = signo;
}
#ifndef NO_HISTORY
if (signo == SIGWINCH)
gotwinch = 1;
#endif
}
@ -490,9 +478,6 @@ setinteractive(int on)
setsignal(SIGINT);
setsignal(SIGQUIT);
setsignal(SIGTERM);
#ifndef NO_HISTORY
setsignal(SIGWINCH);
#endif
is_interactive = on;
}

View File

@ -36,7 +36,6 @@
extern volatile sig_atomic_t pendingsig;
extern volatile sig_atomic_t pendingsig_waitcmd;
extern int in_dotrap;
extern volatile sig_atomic_t gotwinch;
void clear_traps(void);
int have_traps(void);