Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 Jun 2010 22:27:32 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r208881 - head/bin/sh
Message-ID:  <201006062227.o56MRWZL072452@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Sun Jun  6 22:27:32 2010
New Revision: 208881
URL: http://svn.freebsd.org/changeset/base/208881

Log:
  sh: Pass through SIGINT from a child if interactive and job control
  is enabled.
  
  This already worked if without job control.
  
  In either case, this depends on it that a process that terminates due to
  SIGINT exits on it (so not with status 1, or worse, 0).
  
  Example:
    sleep 5; echo continued
  This does not print "continued" any more if sleep is aborted via ctrl+c.
  
  MFC after:	1 month

Modified:
  head/bin/sh/jobs.c

Modified: head/bin/sh/jobs.c
==============================================================================
--- head/bin/sh/jobs.c	Sun Jun  6 21:19:04 2010	(r208880)
+++ head/bin/sh/jobs.c	Sun Jun  6 22:27:32 2010	(r208881)
@@ -866,6 +866,7 @@ waitforjob(struct job *jp, int *origstat
 {
 #if JOBS
 	pid_t mypgrp = getpgrp();
+	int propagate_int = jp->jobctl && jp->foreground;
 #endif
 	int status;
 	int st;
@@ -903,6 +904,11 @@ waitforjob(struct job *jp, int *origstat
 		else
 			CLEAR_PENDING_INT;
 	}
+#if JOBS
+	else if (rootshell && iflag && propagate_int &&
+			WIFSIGNALED(status) && WTERMSIG(status) == SIGINT)
+		kill(getpid(), SIGINT);
+#endif
 	INTON;
 	return st;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006062227.o56MRWZL072452>