aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2009-03-31 12:41:52 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2009-03-31 12:41:52 +0000
commit422cd7c81c25bdf5155d09aecfe5bd9d5c28a1f7 (patch)
tree5d8ba93759402e74608284619bdeb76683adfdcf
parentabedaac8423d72325ae05602bf1bdcde28ecd7fa (diff)
downloadbusybox-w32-422cd7c81c25bdf5155d09aecfe5bd9d5c28a1f7.tar.gz
busybox-w32-422cd7c81c25bdf5155d09aecfe5bd9d5c28a1f7.tar.bz2
busybox-w32-422cd7c81c25bdf5155d09aecfe5bd9d5c28a1f7.zip
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
-rw-r--r--shell/hush.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 01690d9bc..21fa95429 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -462,6 +462,7 @@ struct globals {
462 struct pipe *toplevel_list; 462 struct pipe *toplevel_list;
463//// smallint ctrl_z_flag; 463//// smallint ctrl_z_flag;
464#endif 464#endif
465 smallint flag_SIGINT;
465#if ENABLE_HUSH_LOOPS 466#if ENABLE_HUSH_LOOPS
466 smallint flag_break_continue; 467 smallint flag_break_continue;
467#endif 468#endif
@@ -881,15 +882,16 @@ static void check_and_run_traps(void)
881 continue; 882 continue;
882 } 883 }
883 /* not a trap: special action */ 884 /* not a trap: special action */
884#if 0 //TODO
885 switch (sig) { 885 switch (sig) {
886 case SIGHUP: ... 886 case SIGINT:
887 break; 887 G.flag_SIGINT = 1;
888 case SIGINT: ...
889 break; 888 break;
889//TODO
890// case SIGHUP: ...
891// break;
890 default: /* SIGTERM, SIGQUIT, SIGTTIN, SIGTTOU, SIGTSTP */ 892 default: /* SIGTERM, SIGQUIT, SIGTTIN, SIGTTOU, SIGTSTP */
893 break;
891 } 894 }
892#endif
893 } 895 }
894} 896}
895 897
@@ -1195,18 +1197,27 @@ static void get_user_input(struct in_str *i)
1195 /* Enable command line editing only while a command line 1197 /* Enable command line editing only while a command line
1196 * is actually being read */ 1198 * is actually being read */
1197 do { 1199 do {
1200 G.flag_SIGINT = 0;
1201 /* buglet: SIGINT will not make new prompt to appear _at once_,
1202 * only after <Enter>. (^C will work) */
1198 r = read_line_input(prompt_str, G.user_input_buf, BUFSIZ-1, G.line_input_state); 1203 r = read_line_input(prompt_str, G.user_input_buf, BUFSIZ-1, G.line_input_state);
1199 } while (r == 0); /* repeat if Ctrl-C */ 1204 /* catch *SIGINT* etc (^C is handled by read_line_input) */
1205 check_and_run_traps();
1206 } while (r == 0 || G.flag_SIGINT); /* repeat if ^C or SIGINT */
1200 i->eof_flag = (r < 0); 1207 i->eof_flag = (r < 0);
1201 if (i->eof_flag) { /* EOF/error detected */ 1208 if (i->eof_flag) { /* EOF/error detected */
1202 G.user_input_buf[0] = EOF; /* yes, it will be truncated, it's ok */ 1209 G.user_input_buf[0] = EOF; /* yes, it will be truncated, it's ok */
1203 G.user_input_buf[1] = '\0'; 1210 G.user_input_buf[1] = '\0';
1204 } 1211 }
1205#else 1212#else
1206 fputs(prompt_str, stdout); 1213 do {
1207 fflush(stdout); 1214 G.flag_SIGINT = 0;
1208 G.user_input_buf[0] = r = fgetc(i->file); 1215 fputs(prompt_str, stdout);
1209 /*G.user_input_buf[1] = '\0'; - already is and never changed */ 1216 fflush(stdout);
1217 G.user_input_buf[0] = r = fgetc(i->file);
1218 /*G.user_input_buf[1] = '\0'; - already is and never changed */
1219//do we need check_and_run_traps()? (maybe only if stdin)
1220 } while (G.flag_SIGINT);
1210 i->eof_flag = (r == EOF); 1221 i->eof_flag = (r == EOF);
1211#endif 1222#endif
1212 i->p = G.user_input_buf; 1223 i->p = G.user_input_buf;
@@ -2845,6 +2856,9 @@ static int run_list(struct pipe *pi)
2845 2856
2846 /* Go through list of pipes, (maybe) executing them. */ 2857 /* Go through list of pipes, (maybe) executing them. */
2847 for (; pi; pi = USE_HUSH_LOOPS(rword == RES_DONE ? loop_top : ) pi->next) { 2858 for (; pi; pi = USE_HUSH_LOOPS(rword == RES_DONE ? loop_top : ) pi->next) {
2859 if (G.flag_SIGINT)
2860 break;
2861
2848 IF_HAS_KEYWORDS(rword = pi->res_word;) 2862 IF_HAS_KEYWORDS(rword = pi->res_word;)
2849 IF_HAS_NO_KEYWORDS(rword = RES_NONE;) 2863 IF_HAS_NO_KEYWORDS(rword = RES_NONE;)
2850 debug_printf_exec(": rword=%d cond_code=%d skip_more=%d\n", 2864 debug_printf_exec(": rword=%d cond_code=%d skip_more=%d\n",