help needed to fix contrib/ee crash/exit when receiving SIGWINCH

Eygene Ryabinkin rea-fbsd at codelabs.ru
Fri Oct 23 15:56:43 UTC 2009


Gentlemen, good day.

Fri, Oct 23, 2009 at 02:02:38PM +0200, Dag-Erling Sm??rgrav wrote:
> src/contrib/ee/ee.c in 8:
> 
>                 in = wgetch(text_win);
>                 if (in == -1)
>                         exit(0);  /* without this exit ee will go into an 
>                                      infinite loop if the network 
>                                      session detaches */
>
> >From the wgetch() man page:
> 
>        Programmers concerned about portability should be prepared  for
>        either of  two  cases: (a) signal receipt does not interrupt
>        getch; (b) signal receipt interrupts getch and causes it to
>        return ERR with errno set  to EINTR.   Under the ncurses
>        implementation, handled signals never inter???  rupt getch.

Hmm, we can transform this code to the following one:
-----
errno = 0;
do {
	in = wgetch(text_win);
} while (errno == EINTR);
if (in == -1)
	exit(0);
-----
This won't help with FreeBSD's ncurses, but may be other variants
will feel much better with such a event loop variant.

> The real issue, though, is that when a SIGWINCH is caught, wgetch()
> correctly returns KEY_RESIZE, but the next call to wgetch() returns -1.
> The next call after that is fine.  I suspect the error lies somewhere
> inside kgetch() in contrib/ncurses/ncurses/base/lib_getch.c.

The problem should be healed with the attached patch.  And you're
partly right: this is kgetch() that is returning ERR for the second
wgetch(), but kgetch() shouldn't be blamed for this -- _nc_wgetch()
should.  At least in my opinion ;)

Any views on this?
-- 
Eygene
 _                ___       _.--.   #
 \`.|\..----...-'`   `-._.-'_.-'`   #  Remember that it is hard
 /  ' `         ,       __.--'      #  to read the on-line manual
 )/' _/     \   `-_,   /            #  while single-stepping the kernel.
 `-'" `"\_  ,_.-;_.-\_ ',  fsc/as   #
     _.-'_./   {_.'   ; /           #    -- FreeBSD Developers handbook
    {_.-``-'         {_/            #
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ncurses-properly-handle-SIGWINCH.diff
Type: text/x-diff
Size: 1394 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20091023/3720a4a7/ncurses-properly-handle-SIGWINCH.bin


More information about the freebsd-hackers mailing list