mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	patch 8.0.0839: cannot kill a job in a terminal with CTRL-C
Problem: Cannot kill a job in a terminal with CTRL-C. Solution: Set the controlling tty and send SIGINT. (closes #1910)
This commit is contained in:
		| @@ -4194,6 +4194,26 @@ open_pty(int *pty_master_fd, int *pty_slave_fd) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Send SIGINT to a child process if "c" is an interrupt character. | ||||
|  */ | ||||
|     void | ||||
| may_send_sigint(int c UNUSED, pid_t pid UNUSED, pid_t wpid UNUSED) | ||||
| { | ||||
| # ifdef SIGINT | ||||
|     if (c == Ctrl_C || c == intr_char) | ||||
|     { | ||||
| #  ifdef HAVE_SETSID | ||||
| 	kill(-pid, SIGINT); | ||||
| #  else | ||||
| 	kill(0, SIGINT); | ||||
| #  endif | ||||
| 	if (wpid > 0) | ||||
| 	    kill(wpid, SIGINT); | ||||
|     } | ||||
| # endif | ||||
| } | ||||
|  | ||||
|     int | ||||
| mch_call_shell( | ||||
|     char_u	*cmd, | ||||
| @@ -4765,23 +4785,12 @@ mch_call_shell( | ||||
| 			 */ | ||||
| 			if (len == 1 && (pty_master_fd < 0 || cmd != NULL)) | ||||
| 			{ | ||||
| # ifdef SIGINT | ||||
| 			    /* | ||||
| 			     * Send SIGINT to the child's group or all | ||||
| 			     * processes in our group. | ||||
| 			     */ | ||||
| 			    if (ta_buf[ta_len] == Ctrl_C | ||||
| 					       || ta_buf[ta_len] == intr_char) | ||||
| 			    { | ||||
| #  ifdef HAVE_SETSID | ||||
| 				kill(-pid, SIGINT); | ||||
| #  else | ||||
| 				kill(0, SIGINT); | ||||
| #  endif | ||||
| 				if (wpid > 0) | ||||
| 				    kill(wpid, SIGINT); | ||||
| 			    } | ||||
| # endif | ||||
| 			    may_send_sigint(ta_buf[ta_len], pid, wpid); | ||||
|  | ||||
| 			    if (pty_master_fd < 0 && toshell_fd >= 0 | ||||
| 					       && ta_buf[ta_len] == Ctrl_D) | ||||
| 			    { | ||||
| @@ -5360,15 +5369,26 @@ mch_job_start(char **argv, job_T *job, jobopt_T *options) | ||||
| 	if (null_fd >= 0) | ||||
| 	    close(null_fd); | ||||
|  | ||||
| 	if (pty_slave_fd >= 0) | ||||
| 	{ | ||||
| 	    /* push stream discipline modules */ | ||||
| 	    SetupSlavePTY(pty_slave_fd); | ||||
| #  ifdef TIOCSCTTY | ||||
| 	    /* Try to become controlling tty (probably doesn't work, | ||||
| 	     * unless run by root) */ | ||||
| 	    ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL); | ||||
| #  endif | ||||
| 	} | ||||
|  | ||||
| 	/* See above for type of argv. */ | ||||
| 	execvp(argv[0], argv); | ||||
|  | ||||
| 	if (stderr_works) | ||||
| 	    perror("executing job failed"); | ||||
| #ifdef EXITFREE | ||||
| # ifdef EXITFREE | ||||
| 	/* calling free_all_mem() here causes problems. Ignore valgrind | ||||
| 	 * reporting possibly leaked memory. */ | ||||
| #endif | ||||
| # endif | ||||
| 	_exit(EXEC_FAILED);	    /* exec failed, return failure code */ | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -57,6 +57,7 @@ int mch_report_winsize(int fd, int rows, int cols); | ||||
| void mch_set_shellsize(void); | ||||
| void mch_new_shellsize(void); | ||||
| int mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc); | ||||
| void may_send_sigint(int c, pid_t pid, pid_t wpid); | ||||
| int mch_call_shell(char_u *cmd, int options); | ||||
| void mch_job_start(char **argv, job_T *job, jobopt_T *options); | ||||
| char *mch_job_status(job_T *job); | ||||
|   | ||||
| @@ -39,8 +39,6 @@ | ||||
|  * - don't allow exiting Vim when a terminal is still running a job | ||||
|  * - in bash mouse clicks are inserting characters. | ||||
|  * - mouse scroll: when over other window, scroll that window. | ||||
|  * - typing CTRL-C is not sent to the terminal.  need to setup controlling tty? | ||||
|  *	#1910 | ||||
|  * - For the scrollback buffer store lines in the buffer, only attributes in | ||||
|  *   tl_scrollback. | ||||
|  * - When the job ends: | ||||
| @@ -962,6 +960,17 @@ terminal_loop(void) | ||||
| 	    /* job finished while waiting for a character */ | ||||
| 	    break; | ||||
|  | ||||
| #ifdef UNIX | ||||
| 	may_send_sigint(c, curbuf->b_term->tl_job->jv_pid, 0); | ||||
| #endif | ||||
| #ifdef WIN3264 | ||||
| 	if (c == Ctrl_C) | ||||
| 	    /* We don't know if the job can handle CTRL-C itself or not, this | ||||
| 	     * may kill the shell instead of killing the command running in the | ||||
| 	     * shell. */ | ||||
| 	    mch_stop_job(curbuf->b_term->tl_job, "quit") | ||||
| #endif | ||||
|  | ||||
| 	if (c == (termkey == 0 ? Ctrl_W : termkey)) | ||||
| 	{ | ||||
| 	    int	    prev_c = c; | ||||
|   | ||||
| @@ -769,6 +769,8 @@ static char *(features[]) = | ||||
|  | ||||
| static int included_patches[] = | ||||
| {   /* Add new patch number below this line */ | ||||
| /**/ | ||||
|     839, | ||||
| /**/ | ||||
|     838, | ||||
| /**/ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user