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; | 	struct pipe *toplevel_list; | ||||||
| ////	smallint ctrl_z_flag; | ////	smallint ctrl_z_flag; | ||||||
| #endif | #endif | ||||||
|  | 	smallint flag_SIGINT; | ||||||
| #if ENABLE_HUSH_LOOPS | #if ENABLE_HUSH_LOOPS | ||||||
| 	smallint flag_break_continue; | 	smallint flag_break_continue; | ||||||
| #endif | #endif | ||||||
| @@ -881,15 +882,16 @@ static void check_and_run_traps(void) | |||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 		/* not a trap: special action */ | 		/* not a trap: special action */ | ||||||
| #if 0 //TODO |  | ||||||
| 		switch (sig) { | 		switch (sig) { | ||||||
| 		case SIGHUP: ... | 		case SIGINT: | ||||||
| 			break; | 			G.flag_SIGINT = 1; | ||||||
| 		case SIGINT: ... |  | ||||||
| 			break; | 			break; | ||||||
|  | //TODO | ||||||
|  | //		case SIGHUP: ... | ||||||
|  | //			break; | ||||||
| 		default: /* SIGTERM, SIGQUIT, SIGTTIN, SIGTTOU, SIGTSTP */ | 		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 | 	/* Enable command line editing only while a command line | ||||||
| 	 * is actually being read */ | 	 * is actually being read */ | ||||||
| 	do { | 	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); | 		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); | 	i->eof_flag = (r < 0); | ||||||
| 	if (i->eof_flag) { /* EOF/error detected */ | 	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[0] = EOF; /* yes, it will be truncated, it's ok */ | ||||||
| 		G.user_input_buf[1] = '\0'; | 		G.user_input_buf[1] = '\0'; | ||||||
| 	} | 	} | ||||||
| #else | #else | ||||||
|  | 	do { | ||||||
|  | 		G.flag_SIGINT = 0; | ||||||
| 		fputs(prompt_str, stdout); | 		fputs(prompt_str, stdout); | ||||||
| 		fflush(stdout); | 		fflush(stdout); | ||||||
| 		G.user_input_buf[0] = r = fgetc(i->file); | 		G.user_input_buf[0] = r = fgetc(i->file); | ||||||
| 		/*G.user_input_buf[1] = '\0'; - already is and never changed */ | 		/*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); | 	i->eof_flag = (r == EOF); | ||||||
| #endif | #endif | ||||||
| 	i->p = G.user_input_buf; | 	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. */ | 	/* Go through list of pipes, (maybe) executing them. */ | ||||||
| 	for (; pi; pi = USE_HUSH_LOOPS(rword == RES_DONE ? loop_top : ) pi->next) { | 	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_KEYWORDS(rword = pi->res_word;) | ||||||
| 		IF_HAS_NO_KEYWORDS(rword = RES_NONE;) | 		IF_HAS_NO_KEYWORDS(rword = RES_NONE;) | ||||||
| 		debug_printf_exec(": rword=%d cond_code=%d skip_more=%d\n", | 		debug_printf_exec(": rword=%d cond_code=%d skip_more=%d\n", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user