hush: rework "wait %jobspec" to work in non-interactive shells too
Also add tests. wait5.tests so far fails (but works for ash and dash). function old new delta builtin_wait 305 283 -22 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		
							
								
								
									
										1
									
								
								shell/ash_test/ash-misc/wait4.right
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								shell/ash_test/ash-misc/wait4.right
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| Three:3 | ||||
							
								
								
									
										2
									
								
								shell/ash_test/ash-misc/wait4.tests
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								shell/ash_test/ash-misc/wait4.tests
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| sleep 1 | (sleep 1;exit 3) & wait %1 | ||||
| echo Three:$? | ||||
							
								
								
									
										2
									
								
								shell/ash_test/ash-misc/wait5.right
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								shell/ash_test/ash-misc/wait5.right
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| Zero:0 | ||||
| Three:3 | ||||
							
								
								
									
										5
									
								
								shell/ash_test/ash-misc/wait5.tests
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										5
									
								
								shell/ash_test/ash-misc/wait5.tests
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| sleep 0 | (sleep 0;exit 3) & | ||||
| sleep 1 | ||||
| echo Zero:$? | ||||
| wait %1 | ||||
| echo Three:$? | ||||
							
								
								
									
										21
									
								
								shell/hush.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								shell/hush.c
									
									
									
									
									
								
							| @@ -9586,7 +9586,6 @@ static int FAST_FUNC builtin_wait(char **argv) | ||||
| { | ||||
| 	int ret; | ||||
| 	int status; | ||||
| 	struct pipe *wait_pipe = NULL; | ||||
|  | ||||
| 	argv = skip_dash_dash(argv); | ||||
| 	if (argv[0] == NULL) { | ||||
| @@ -9614,10 +9613,13 @@ static int FAST_FUNC builtin_wait(char **argv) | ||||
| 		if (errno || pid <= 0) { | ||||
| #if ENABLE_HUSH_JOB | ||||
| 			if (argv[0][0] == '%') { | ||||
| 				struct pipe *wait_pipe; | ||||
| 				wait_pipe = parse_jobspec(*argv); | ||||
| 				if (wait_pipe) { | ||||
| 					pid = - wait_pipe->pgrp; | ||||
| 					goto do_wait; | ||||
| 					ret = job_exited_or_stopped(wait_pipe); | ||||
| 					if (ret < 0) | ||||
| 						ret = wait_for_child_or_signal(wait_pipe, 0); | ||||
| 					continue; | ||||
| 				} | ||||
| 			} | ||||
| #endif | ||||
| @@ -9626,7 +9628,7 @@ static int FAST_FUNC builtin_wait(char **argv) | ||||
| 			ret = EXIT_FAILURE; | ||||
| 			continue; /* bash checks all argv[] */ | ||||
| 		} | ||||
|  IF_HUSH_JOB(do_wait:) | ||||
|  | ||||
| 		/* Do we have such child? */ | ||||
| 		ret = waitpid(pid, &status, WNOHANG); | ||||
| 		if (ret < 0) { | ||||
| @@ -9652,20 +9654,13 @@ static int FAST_FUNC builtin_wait(char **argv) | ||||
| 		} | ||||
| 		if (ret == 0) { | ||||
| 			/* Yes, and it still runs */ | ||||
| 			ret = wait_for_child_or_signal(wait_pipe, wait_pipe ? 0 : pid); | ||||
| 			ret = wait_for_child_or_signal(NULL, pid); | ||||
| 		} else { | ||||
| 			/* Yes, and it just exited */ | ||||
| 			process_wait_result(NULL, ret, status); | ||||
| 			process_wait_result(NULL, pid, status); | ||||
| 			ret = WEXITSTATUS(status); | ||||
| 			if (WIFSIGNALED(status)) | ||||
| 				ret = 128 + WTERMSIG(status); | ||||
| #if ENABLE_HUSH_JOB | ||||
| 			if (wait_pipe) { | ||||
| 				ret = job_exited_or_stopped(wait_pipe); | ||||
| 				if (ret < 0) | ||||
| 					goto do_wait; | ||||
| 			} | ||||
| #endif | ||||
| 		} | ||||
| 	} while (*++argv); | ||||
|  | ||||
|   | ||||
							
								
								
									
										1
									
								
								shell/hush_test/hush-misc/wait4.right
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								shell/hush_test/hush-misc/wait4.right
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| Three:3 | ||||
							
								
								
									
										2
									
								
								shell/hush_test/hush-misc/wait4.tests
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								shell/hush_test/hush-misc/wait4.tests
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| sleep 1 | (sleep 1;exit 3) & wait %1 | ||||
| echo Three:$? | ||||
							
								
								
									
										2
									
								
								shell/hush_test/hush-misc/wait5.right
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								shell/hush_test/hush-misc/wait5.right
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| Zero:0 | ||||
| Three:3 | ||||
							
								
								
									
										5
									
								
								shell/hush_test/hush-misc/wait5.tests
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										5
									
								
								shell/hush_test/hush-misc/wait5.tests
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| sleep 0 | (sleep 0;exit 3) & | ||||
| sleep 1 | ||||
| echo Zero:$? | ||||
| wait %1 | ||||
| echo Three:$? | ||||
		Reference in New Issue
	
	Block a user