Fixes various problems such as inetd not reloading correctly.
Fix provided by Michael van Elst in [lib/14454] - thanks!
Should also fix [bin/12651] and [bin/13657]
Re-write t_agetstr() so that it does not use realloc so userland
programs don't break. We now use an internal buffer to keep track
of the memory we allocate. This changes the api of t_agetstr() to
take 2 fewer arguments, but there are not many programs that use it.
Please note that this does not change binary compatibility with the
previous t_agetstr() since the usage was:
char *area, *p;
*area = NULL;
t_agetstr(ti, "ic", &area, &p);
...
free(area);
Since we don't touch the arguments and free(NULL) is a no-op, nothing
breaks.
Since we don't break binary compatibility there is no reason to bump
the library's major number, but since we change t_agetstr() I'll bump
the minor number for good measure.
until the problem gets addressed properly. The following fix
is a stopgap measure to stop the leaking :-(
I fixed the t_getstr() memory leak problem, but that instantly
revealed a problem in t_agetstr() which is an extremely broken
interface. It realloc's memory, potentially moving the area where
it returned pointers into in previous calls. This function needs
to be removed and or changed. I added a horrible work-around for
now, but I will revisit the problem shortly. In the meantime nobody
should be using the t_agetstr() API, and I'll be fixing the rest
of the programs and or the API when I figure out the best solution...
This is t_agetstr() is used by:
games/hack/hack.termcap.c
games/larn/io.c
games/tetris/screen.c
lib/libterm/termcap.c
lib/libterm/termcap.h
libexec/getty/main.c
usr.bin/top/screen.c
usr.bin/ul/ul.c
defined, as <bsd.own.mk> always sets it; also, compare only against "yes"
(not "no") for a yes/no check, as there are two negative states ("no" and
"never").
* Don't return if wait()ing for the child is interrupted.
* Fix a race condition for the parent's SIG{INT,QUIT} disposition.
* While we're here, convert from using signal(3) to sigaction(2).
struct ieee_double, rather than a pointer cast. This seems to enable
GCC 2.95.3 to get the instruction dependencies right (the old one fell
foul of ANSI aliasing rules), and it also generates more sensible code in
general.
If this is the correct solution, it should be applied to the other ports.
If it's not, someone should come up with one that _is_ correct.