hush: make ^C work again, ^Z probably isn't working
function old new delta file_get 219 254 +35 check_and_run_traps 122 133 +11 run_list 2001 2010 +9 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/0 up/down: 55/0) Total: 55 bytes
This commit is contained in:
		
							
								
								
									
										26
									
								
								shell/hush.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								shell/hush.c
									
									
									
									
									
								
							| @@ -462,6 +462,7 @@ struct globals { | ||||
| 	struct pipe *toplevel_list; | ||||
| ////	smallint ctrl_z_flag; | ||||
| #endif | ||||
| 	smallint flag_SIGINT; | ||||
| #if ENABLE_HUSH_LOOPS | ||||
| 	smallint flag_break_continue; | ||||
| #endif | ||||
| @@ -881,15 +882,16 @@ static void check_and_run_traps(void) | ||||
| 			continue; | ||||
| 		} | ||||
| 		/* not a trap: special action */ | ||||
| #if 0 //TODO | ||||
| 		switch (sig) { | ||||
| 		case SIGHUP: ... | ||||
| 			break; | ||||
| 		case SIGINT: ... | ||||
| 		case SIGINT: | ||||
| 			G.flag_SIGINT = 1; | ||||
| 			break; | ||||
| //TODO | ||||
| //		case SIGHUP: ... | ||||
| //			break; | ||||
| 		default: /* SIGTERM, SIGQUIT, SIGTTIN, SIGTTOU, SIGTSTP */ | ||||
| 			break; | ||||
| 		} | ||||
| #endif | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -1195,18 +1197,27 @@ static void get_user_input(struct in_str *i) | ||||
| 	/* Enable command line editing only while a command line | ||||
| 	 * is actually being read */ | ||||
| 	do { | ||||
| 		G.flag_SIGINT = 0; | ||||
| 		/* buglet: SIGINT will not make new prompt to appear _at once_, | ||||
| 		 * only after <Enter>. (^C will work) */ | ||||
| 		r = read_line_input(prompt_str, G.user_input_buf, BUFSIZ-1, G.line_input_state); | ||||
| 	} while (r == 0); /* repeat if Ctrl-C */ | ||||
| 		/* catch *SIGINT* etc (^C is handled by read_line_input) */ | ||||
| 		check_and_run_traps(); | ||||
| 	} while (r == 0 || G.flag_SIGINT); /* repeat if ^C or SIGINT */ | ||||
| 	i->eof_flag = (r < 0); | ||||
| 	if (i->eof_flag) { /* EOF/error detected */ | ||||
| 		G.user_input_buf[0] = EOF; /* yes, it will be truncated, it's ok */ | ||||
| 		G.user_input_buf[1] = '\0'; | ||||
| 	} | ||||
| #else | ||||
| 	do { | ||||
| 		G.flag_SIGINT = 0; | ||||
| 		fputs(prompt_str, stdout); | ||||
| 		fflush(stdout); | ||||
| 		G.user_input_buf[0] = r = fgetc(i->file); | ||||
| 		/*G.user_input_buf[1] = '\0'; - already is and never changed */ | ||||
| //do we need check_and_run_traps()? (maybe only if stdin) | ||||
| 	} while (G.flag_SIGINT); | ||||
| 	i->eof_flag = (r == EOF); | ||||
| #endif | ||||
| 	i->p = G.user_input_buf; | ||||
| @@ -2845,6 +2856,9 @@ static int run_list(struct pipe *pi) | ||||
|  | ||||
| 	/* Go through list of pipes, (maybe) executing them. */ | ||||
| 	for (; pi; pi = USE_HUSH_LOOPS(rword == RES_DONE ? loop_top : ) pi->next) { | ||||
| 		if (G.flag_SIGINT) | ||||
| 			break; | ||||
|  | ||||
| 		IF_HAS_KEYWORDS(rword = pi->res_word;) | ||||
| 		IF_HAS_NO_KEYWORDS(rword = RES_NONE;) | ||||
| 		debug_printf_exec(": rword=%d cond_code=%d skip_more=%d\n", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user