mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix Ctrl+D after ksh receives SIGWINCH (#208)
src/cmd/ksh93/edit/edit.c: ed_read(): - The loop that handles SIGWINCH assumes sfpkrd will return and set errno to EINTR if ksh is sent SIGWINCH. This only occurs when select(2) is used to wait for input, so tell sfpkrd to use select if possible. This is only done if the last argument given to sfpkrd is '2', which should avoid regressions. src/lib/libast/sfio/sfpkrd.c: sfpkrd(): - Always use select if the last argument is 2. This allows sfpkrd() to intercept SIGWINCH when necessary. Fixes: https://github.com/ksh93/ksh/issues/202
This commit is contained in:
parent
9f2389ed93
commit
c1986c4e1a
3 changed files with 17 additions and 8 deletions
|
@ -833,15 +833,14 @@ static void ed_nputchar(register Edit_t *ep, int n, int c)
|
|||
|
||||
/*
|
||||
* Do read, restart on interrupt unless SH_SIGSET or SH_SIGTRAP is set
|
||||
* Use sfpkrd() to poll() or select() to wait for input if possible
|
||||
* Use select(2) (via sfpkrd()) to wait for input if possible
|
||||
*
|
||||
* The return value is the number of bytes read, or < 0 for EOF.
|
||||
*
|
||||
* Unfortunately, systems that get interrupted from slow reads update
|
||||
* this access time for the terminal (in violation of POSIX).
|
||||
* The fixtime() macro resets the time to the time at entry in
|
||||
* this case. This is not necessary for systems that can handle
|
||||
* sfpkrd() correctly (i.e., those that support poll() or select()).
|
||||
* this case. This is not necessary for systems that have select().
|
||||
*/
|
||||
int ed_read(void *context, int fd, char *buff, int size, int reedit)
|
||||
{
|
||||
|
@ -851,11 +850,12 @@ int ed_read(void *context, int fd, char *buff, int size, int reedit)
|
|||
Shell_t *shp = ep->sh;
|
||||
int mode = -1;
|
||||
int (*waitevent)(int,long,int) = shp->gd->waitevent;
|
||||
/* sfpkrd must use select(2) to intercept SIGWINCH for ed_read */
|
||||
if(ep->e_raw==ALTMODE)
|
||||
mode = 1;
|
||||
mode = 2;
|
||||
if(size < 0)
|
||||
{
|
||||
mode = 1;
|
||||
mode = 2;
|
||||
size = -size;
|
||||
}
|
||||
sh_onstate(SH_TTYWAIT);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue