hush: remove old disabled ^Z handling
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 15 Apr 2009 23:29:00 +0000 (23:29 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 15 Apr 2009 23:29:00 +0000 (23:29 -0000)
shell/hush.c

index 1753be0d142d407db8146332962130dfe2afbbb5..16f304d81ad9163cde9c3333ba3cc6504b49f422 100644 (file)
@@ -56,7 +56,6 @@
  *      figure out what to do with backslash-newline
  *      continuation lines, both explicit and implicit - done?
  *      SIGHUP handling
- *      ^Z handling (and explain it in comments for mere humans)
  *      separate job control from interactiveness
  *      (testcase: booting with init=/bin/hush does not show prompt (2009-04))
  *
@@ -432,7 +431,6 @@ struct globals {
        int last_jobid;
        struct pipe *job_list;
        struct pipe *toplevel_list;
-////   smallint ctrl_z_flag;
 #endif
        smallint flag_SIGINT;
 #if ENABLE_HUSH_LOOPS
@@ -474,12 +472,6 @@ struct globals {
        int debug_indent;
 #endif
        char user_input_buf[ENABLE_FEATURE_EDITING ? BUFSIZ : 2];
-#if ENABLE_FEATURE_SH_STANDALONE
-       struct nofork_save_area nofork_save;
-#endif
-#if ENABLE_HUSH_JOB
-       sigjmp_buf toplevel_jb;
-#endif
 };
 #define G (*ptr_to_globals)
 /* Not #defining name to G.name - this quickly gets unwieldy
@@ -977,13 +969,14 @@ static void free_strings(char **strings)
  * SIGHUP (interactive):
  *    send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit
  * SIGTTIN, SIGTTOU, SIGTSTP (if job control is on): ignore
- *    (note that ^Z is handled not by trapping SIGTSTP, but by seeing
- *    that all pipe members are stopped) (right?)
+ *    Note that ^Z is handled not by trapping SIGTSTP, but by seeing
+ *    that all pipe members are stopped. Try this in bash:
+ *    while :; do :; done - ^Z does not background it
+ *    (while :; do :; done) - ^Z backgrounds it
  * SIGINT (interactive): wait for last pipe, ignore the rest
  *    of the command line, show prompt. NB: ^C does not send SIGINT
  *    to interactive shell while shell is waiting for a pipe,
  *    since shell is bg'ed (is not in foreground process group).
- *    (check/expand this)
  *    Example 1: this waits 5 sec, but does not execute ls:
  *    "echo $$; sleep 5; ls -l" + "kill -INT <pid>"
  *    Example 2: this does not wait and does not execute ls:
@@ -3411,12 +3404,11 @@ static int run_pipe(struct pipe *pi)
                if (i >= 0 && APPLET_IS_NOFORK(i)) {
                        rcode = setup_redirects(command, squirrel);
                        if (rcode == 0) {
-                               save_nofork_data(&G.nofork_save);
                                new_env = expand_assignments(argv, command->assignment_cnt);
                                old_env = putenv_all_and_save_old(new_env);
                                debug_printf_exec(": run_nofork_applet '%s' '%s'...\n",
                                        argv_expanded[0], argv_expanded[1]);
-                               rcode = run_nofork_applet_prime(&G.nofork_save, i, argv_expanded);
+                               rcode = run_nofork_applet(i, argv_expanded);
                        }
                        goto clean_up_and_ret;
                }
@@ -3643,7 +3635,7 @@ static int run_list(struct pipe *pi)
        smallint last_rword; /* ditto */
 #endif
 
-       debug_printf_exec("run_list start lvl %d\n", G.run_list_level + 1);
+       debug_printf_exec("run_list start lvl %d\n", G.run_list_level);
        debug_enter();
 
 #if ENABLE_HUSH_LOOPS
@@ -3677,51 +3669,9 @@ static int run_list(struct pipe *pi)
         * in order to return, no direct "return" statements please.
         * This helps to ensure that no memory is leaked. */
 
-////TODO: ctrl-Z handling needs re-thinking and re-testing
-
 #if ENABLE_HUSH_JOB
-       /* Example of nested list: "while true; do { sleep 1 | exit 2; } done".
-        * We are saving state before entering outermost list ("while...done")
-        * so that ctrl-Z will correctly background _entire_ outermost list,
-        * not just a part of it (like "sleep 1 | exit 2") */
-       if (++G.run_list_level == 1 && G_interactive_fd) {
-               if (sigsetjmp(G.toplevel_jb, 1)) {
-                       /* ctrl-Z forked and we are parent; or ctrl-C.
-                        * Sighandler has longjmped us here */
-                       signal(SIGINT, SIG_IGN);
-                       signal(SIGTSTP, SIG_IGN);
-                       /* Restore level (we can be coming from deep inside
-                        * nested levels) */
-                       G.run_list_level = 1;
-#if ENABLE_FEATURE_SH_STANDALONE
-                       if (G.nofork_save.saved) { /* if save area is valid */
-                               debug_printf_jobs("exiting nofork early\n");
-                               restore_nofork_data(&G.nofork_save);
-                       }
-#endif
-////                   if (G.ctrl_z_flag) {
-////                           /* ctrl-Z has forked and stored pid of the child in pi->pid.
-////                            * Remember this child as background job */
-////                           insert_bg_job(pi);
-////                   } else {
-                               /* ctrl-C. We just stop doing whatever we were doing */
-                               bb_putchar('\n');
-////                   }
-                       USE_HUSH_LOOPS(loop_top = NULL;)
-                       USE_HUSH_LOOPS(G.depth_of_loop = 0;)
-                       rcode = 0;
-                       goto ret;
-               }
-////           /* ctrl-Z handler will store pid etc in pi */
-////           G.toplevel_list = pi;
-////           G.ctrl_z_flag = 0;
-#if ENABLE_FEATURE_SH_STANDALONE
-               G.nofork_save.saved = 0; /* in case we will run a nofork later */
+       G.run_list_level++;
 #endif
-////           signal_SA_RESTART_empty_mask(SIGTSTP, handler_ctrl_z);
-////           signal(SIGINT, handler_ctrl_c);
-       }
-#endif /* JOB */
 
 #if HAS_KEYWORDS
        rword = RES_NONE;
@@ -3967,18 +3917,7 @@ static int run_list(struct pipe *pi)
        } /* for (pi) */
 
 #if ENABLE_HUSH_JOB
-////   if (G.ctrl_z_flag) {
-////           /* ctrl-Z forked somewhere in the past, we are the child,
-////            * and now we completed running the list. Exit. */
-//////TODO: _exit?
-////           exit(rcode);
-////   }
- ret:
        G.run_list_level--;
-////   if (!G.run_list_level && G_interactive_fd) {
-////           signal(SIGTSTP, SIG_IGN);
-////           signal(SIGINT, SIG_IGN);
-////   }
 #endif
 #if ENABLE_HUSH_LOOPS
        if (loop_top)