lmb@vicom.COM (Larry Blair) (12/31/88)
Due to its Sys V origins, elm doesn't properly deal with stop signals in
child tasks, such as the editor or external pager. Enclosed are patches
to fix those two cases. There is a third case, when checking for access
to the file to be read, that I didn't fix since I didn't want to change
the vfork to a fork.
It seems to me that there has got to a better way a temporarily assuming
the real uid and gid than forking a new task, but that's a subject for
unix.wizards.
*** syscall.c.old Fri Dec 30 14:38:31 1988
--- syscall.c Fri Dec 30 14:44:05 1988
***************
*** 106,111 ****
--- 106,114 ----
#else
int status;
#endif
+ #ifdef SIGTSTP
+ int (*oldstop)(), (*oldstart)();
+ #endif
register int (*istat)(), (*qstat)();
dprint(2, (debugfile,
***************
*** 112,117 ****
--- 115,124 ----
"System Call: %s\n\t%s\n", shell_type == SH? "/bin/sh" : shell,
string));
+ #ifdef SIGTSTP
+ oldstop = signal(SIGTSTP, SIG_DFL);
+ oldstart = signal(SIGCONT, SIG_DFL);
+ #endif
#ifdef NO_VM /* machine without virtual memory! */
if ((pid = fork()) == 0) {
#else
***************
*** 140,145 ****
--- 147,156 ----
if (status.w_retcode != 0) stat = status.w_retcode;
#else
if (w == -1) stat = status;
+ #endif
+ #ifdef SIGTSTP
+ signal(SIGTSTP, oldstop);
+ signal(SIGCONT, oldstart);
#endif
signal(SIGINT, istat);
*** showmsg.c.old Tue Dec 27 17:37:25 1988
--- showmsg.c Fri Dec 30 15:40:26 1988
***************
*** 519,524 ****
--- 519,530 ----
int status;
#endif
register int (*istat)(), (*qstat)();
+ #ifdef SIGTSTP
+ register int (*oldstop)(), (*oldstart)();
+
+ oldstop = signal(SIGTSTP, SIG_DFL);
+ oldstart = signal(SIGCONT, SIG_DFL);
+ #endif
#ifdef NO_VM /* machine without virtual memory! */
if ((pid = fork()) == 0) {
***************
*** 526,531 ****
--- 532,540 ----
# ifdef hp9000s500 /* done this way for portability */
if ((pid = fork()) == 0) {
# else
+ # ifdef SIGTSTP /* Stop won't work over active vfork! */
+ if ((pid = fork()) == 0) {
+ # else
if ((pid = vfork()) == 0) {
# endif
#endif
***************
*** 544,549 ****
--- 553,562 ----
signal(SIGINT, istat);
signal(SIGQUIT, qstat);
+ #ifdef SIGTSTP
+ signal(SIGTSTP, oldstop);
+ signal(SIGCONT, oldstart);
+ #endif
/** used to return status, but who cares? Just get BACK! **/
--
Larry Blair ames!vsi1!lmb lmb@vicom.com