Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

better subshell patch



At Richard's suggestion, here is an improved version of the subshell
patch.  It adds an extra flag to entersubsh() indicating if the
subshell is a fake... i.e. we are still in the parent shell but are
preparing to exec an external programme.  In that case, the subsh
variable is not set and there will be a real `exit' call after a final
shell function in the parent shell (only).

As I noted in the comments, a `fake' subshell is not the same as a
`fake' exec: even a `real' exec means that we are not really in a
subshell so that entersubsh() gets the fake flag.  In the case where
we were having problems yesterday, an internal shell command running
as the last part of a subshell, the subsh flag doesn't get set in the
subshell itself for this reason (and indeed no exec of any kind takes
place; execcmd() doesn't actually test whether the `fake exec' is
actually going to happen, i.e. if it is executing an external command,
which in this case it isn't --- if it had been the problem wouldn't
have arisen); however it has already been set when the command
substitution subshell was originally forked and that is what is being
relied on for the test for _exit.  (Alles klar??)

I've also deleted what appear to be a couple of bogus `subsh = 1'
statements just before calls to entersubsh() in hunks 8 and 9.  I can
see no reference to subsh between these statements and where it gets
set anyway in entersubsh().

*** Src/exec.c.subsh	Tue Nov  7 04:43:04 1995
--- Src/exec.c	Wed Nov  8 10:05:22 1995
***************
*** 734,740 ****
  		    }
  		    else {
  			close(synch[0]);
! 			entersubsh(Z_ASYNC, 0);
  			setpgrp(0L, mypgrp = jobtab[list_pipe_job].gleader);
  			close(synch[1]);
  			kill(getpid(), SIGSTOP);
--- 734,740 ----
  		    }
  		    else {
  			close(synch[0]);
! 			entersubsh(Z_ASYNC, 0, 0);
  			setpgrp(0L, mypgrp = jobtab[list_pipe_job].gleader);
  			close(synch[1]);
  			kill(getpid(), SIGSTOP);
***************
*** 816,822 ****
  	    } else {
  		close(pipes[0]);
  		close(synch[0]);
! 		entersubsh(how, 1);
  		close(synch[1]);
  		execcmd(pline->left, input, pipes[1], how, 0);
  		_exit(lastval);
--- 816,822 ----
  	    } else {
  		close(pipes[0]);
  		close(synch[0]);
! 		entersubsh(how, 1, 0);
  		close(synch[1]);
  		execcmd(pline->left, input, pipes[1], how, 0);
  		_exit(lastval);
***************
*** 1315,1321 ****
  
  	/* pid == 0 */
  	close(synch[0]);
! 	entersubsh(how, 1);
  	close(synch[1]);
  	forked = 1;
  	if (sigtrapped[SIGINT] == 2)
--- 1315,1321 ----
  
  	/* pid == 0 */
  	close(synch[0]);
! 	entersubsh(how, 1, 0);
  	close(synch[1]);
  	forked = 1;
  	if (sigtrapped[SIGINT] == 2)
***************
*** 1322,1329 ****
  	    holdintr();
  
      } else if ((cmd->flags & (CFLAG_EXEC|CFLAG_FAKE_EXEC)) && !nullexec) {
! 	/* this is an `exec' (real or fake) that contains a command */
! 	entersubsh(how, 1);
      } else {
  	/* Job is running in current shell. */
  	jobtab[thisjob].stat |= STAT_CURSH;
--- 1322,1332 ----
  	    holdintr();
  
      } else if ((cmd->flags & (CFLAG_EXEC|CFLAG_FAKE_EXEC)) && !nullexec) {
! 	/* this is an `exec' (real or fake) that contains a command:  *
! 	 * note that any form of exec means that the subshell is fake *
!          * (but we may be in a subshell already).                     *
! 	 */
! 	entersubsh(how, 1, 1);
      } else {
  	/* Job is running in current shell. */
  	jobtab[thisjob].stat |= STAT_CURSH;
***************
*** 1514,1520 ****
  		/* only save the history file on a real exec */
  		if ((cmd->flags & CFLAG_EXEC) && unset(NORCS) && interact)
  		    savehistfile(getsparam("HISTFILE"), 1, isset(APPENDHISTORY) ? 3 : 0);
! 		exit(lastval);
  	    }
  
  	    if (!forked && !assign)
--- 1517,1526 ----
  		/* only save the history file on a real exec */
  		if ((cmd->flags & CFLAG_EXEC) && unset(NORCS) && interact)
  		    savehistfile(getsparam("HISTFILE"), 1, isset(APPENDHISTORY) ? 3 : 0);
! 		if (subsh)
! 		    _exit(lastval);
! 		else
! 		    exit(lastval);
  	    }
  
  	    if (!forked && !assign)
***************
*** 1634,1640 ****
  
  /**/
  void
! entersubsh(int how, int cl)
  {
      if (sigtrapped[SIGEXIT])
  	unsettrap(SIGEXIT);
--- 1640,1646 ----
  
  /**/
  void
! entersubsh(int how, int cl, int fake)
  {
      if (sigtrapped[SIGEXIT])
  	unsettrap(SIGEXIT);
***************
*** 1675,1681 ****
  	} else
  	    setpgrp(0L, jobtab[thisjob].gleader);
      }
!     subsh = 1;
      if (SHTTY != -1) {
  	close(SHTTY);
  	SHTTY = -1;
--- 1681,1688 ----
  	} else
  	    setpgrp(0L, jobtab[thisjob].gleader);
      }
!     if (!fake)
! 	subsh = 1;
      if (SHTTY != -1) {
  	close(SHTTY);
  	SHTTY = -1;
***************
*** 1929,1938 ****
  	return NULL;
      }
      child_unblock();
-     subsh = 1;
      close(pipes[0]);
      redup(pipes[1], 1);
!     entersubsh(Z_SYNC, 1);
      signal_ignore(SIGTSTP);
      execlist(list, 1);
      close(1);
--- 1936,1944 ----
  	return NULL;
      }
      child_unblock();
      close(pipes[0]);
      redup(pipes[1], 1);
!     entersubsh(Z_SYNC, 1, 0);
      signal_ignore(SIGTSTP);
      execlist(list, 1);
      close(1);
***************
*** 2028,2036 ****
  	}
  	return nam;
      }
-     subsh = 1;
      close(1);
!     entersubsh(Z_SYNC, 1);
      signal_ignore(SIGTSTP);
      (void)creat(nam, 0600);
      execlist(list, 1);
--- 2034,2041 ----
  	}
  	return nam;
      }
      close(1);
!     entersubsh(Z_SYNC, 1, 0);
      signal_ignore(SIGTSTP);
      (void)creat(nam, 0600);
      execlist(list, 1);
***************
*** 2096,2102 ****
  	popheap();
  	return pnam;
      }
!     entersubsh(Z_ASYNC, 1);
      closem();
      fd = open(pnam, O_WRONLY);
      if (fd == -1) {
--- 2101,2107 ----
  	popheap();
  	return pnam;
      }
!     entersubsh(Z_ASYNC, 1, 0);
      closem();
      fd = open(pnam, O_WRONLY);
      if (fd == -1) {
***************
*** 2148,2154 ****
  	popheap();
  	return pnam;
      }
!     entersubsh(Z_ASYNC, 1);
      closem();
      fd = open(pnam, O_RDONLY);
      redup(fd, 0);
--- 2153,2159 ----
  	popheap();
  	return pnam;
      }
!     entersubsh(Z_ASYNC, 1, 0);
      closem();
      fd = open(pnam, O_RDONLY);
      redup(fd, 0);
***************
*** 2182,2188 ****
      }
      close(pipes[0]);
      closem();
!     entersubsh(Z_ASYNC, 1);
      redup(pipes[1], 1);
      execlist(list, 1);
      _exit(lastval);
--- 2187,2193 ----
      }
      close(pipes[0]);
      closem();
!     entersubsh(Z_ASYNC, 1, 0);
      redup(pipes[1], 1);
      execlist(list, 1);
      _exit(lastval);
***************
*** 2213,2219 ****
  	return pipes[1];
      }
      close(pipes[1]);
!     entersubsh(Z_ASYNC, 1);
      redup(pipes[0], 0);
      closem();
      execlist(list, 1);
--- 2218,2224 ----
  	return pipes[1];
      }
      close(pipes[1]);
!     entersubsh(Z_ASYNC, 1, 0);
      redup(pipes[0], 0);
      closem();
      execlist(list, 1);

-- 
Peter Stephenson <pws@xxxxxx>       Tel: +49 33762 77366
WWW:  http://www.ifh.de/~pws/       Fax: +49 33762 77330
Deutches Electronen-Synchrotron --- Institut fuer Hochenergiephysik Zeuthen
DESY-IfH, 15735 Zeuthen, Germany.



Messages sorted by: Reverse Date, Date, Thread, Author