Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!mnetor!seismo!lll-crg!lll-lcc!pyramid!voder!jeff
From: jeff@voder.UUCP (Jeff Gilliam)
Newsgroups: comp.bugs.4bsd
Subject: non-interactive csh may mishandle children +FIX
Message-ID: <2825@voder.UUCP>
Date: Thu, 18-Dec-86 15:13:47 EST
Article-I.D.: voder.2825
Posted: Thu Dec 18 15:13:47 1986
Date-Received: Fri, 19-Dec-86 00:26:28 EST
Organization: National Semiconductor, Santa Clara
Lines: 62

Index: 	bin/csh/sh.proc.c 4.3BSD

Description:
	This report is a follow-up to an earlier report wherein I stated
	that csh could mishandle signals.  In fact, the real problem is
	that a non-interactive csh will awaken when a child process stops
	(e.g. because of SIGTTIN), then quickly realize it doesn't know
	what to do next and exit.
Repeat-By:
	Put the following shell script into the file 'snile' and make it
	mode 755.

		#! /bin/csh -f
		cat

	Then do the following:

		% snile
		^Z
		Stopped
		% bg
		[1]    snile &

		[1]  + Stopped (tty input)  snile
		% fg
		snile

		Stopped (tty input)
		% jobs
		% 

Fix:
	The problem is that csh waits for stopped children even when it
	is running non-interactive.  The following simple patch cures the
	problem.

RCS file: RCS/sh.proc.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -c -r1.1 -r1.2
*** /tmp/,RCSt1009068	Thu Dec 18 12:12:09 1986
--- /tmp/,RCSt2009068	Thu Dec 18 12:12:10 1986
***************
*** 37,43 ****
  	struct rusage ru;
  
  loop:
! 	pid = wait3(&w, (setintr ? WNOHANG|WUNTRACED:WNOHANG), &ru);
  	if (pid <= 0) {
  		if (errno == EINTR) {
  			errno = 0;
--- 37,43 ----
  	struct rusage ru;
  
  loop:
! 	pid = wait3(&w, ((setintr && intty) ? WNOHANG|WUNTRACED:WNOHANG), &ru);
  	if (pid <= 0) {
  		if (errno == EINTR) {
  			errno = 0;
-- 

Jeff Gilliam	{ucbvax,pyramid,nsc}!voder!jeff