This commit adds the following hush busybox upstream commits:
93ae7464e6e4 ("hush: restore SIGHUP handling, this time explain why we do what 
we do")
1fdb33bd07e5 ("hush: restore tty pgrp on SIGHUP")
6101b6d3eaa0 ("hush: remove special handling of SIGHUP")
93e0898c663a ("shell: fix SIGWINCH and SIGCHLD (in hush) interrupting line 
input, closes 15256")
969e00816835 ("hush: code shrink")
27be0e8cfeb6 ("shell: fix compile failures in some configs")
7d1c7d833785 ("ash,hush: use HOME for tab completion and prompts")
21afddefd258 ("hush: fix "error: invalid preprocessing directive ##"")
e53c7dbafc78 ("hush: fix set -n to act immediately, not just after run_list()
")
574b9c446da1 ("hush: fix var_LINENO3.tests failure")
49bcf9f40cff ("hush: speed up ${x//\*/|} too")
53b2fdcdba4c ("*: add NOINLINEs where code noticeably shrinks")
7c3e96d4b3d4 ("shell: use more compact SHELL_ASH / HUSH config defines. no code 
changes")
62f1eed1e191 ("hush: in a comment, document what -i might be doing")
aaf3d5ba74c5 ("shell: tweak --help")
db5546ca1018 ("libbb: code shrink: introduce and use [_]exit_SUCCESS()")
931c55f9e2b4 ("libbb: invert the meaning of SETUP_ENV_NO_CHDIR -> 
SETUP_ENV_CHDIR")
12566e7f9b5e ("ash,hush: fix handling of SIGINT while waiting for interactive 
input")
987be932ed3c ("*: slap on a few ALIGN_PTR where appropriate")

Signed-off-by: Francis Laniel <francis.lan...@amarulasolutions.com>
---
 common/cli_hush_2021.c     |   2 +-
 common/cli_hush_upstream.c | 224 +++++++++++++++++++++++++++----------
 2 files changed, 164 insertions(+), 62 deletions(-)

diff --git a/common/cli_hush_2021.c b/common/cli_hush_2021.c
index 0a207d147b..4c46176cb2 100644
--- a/common/cli_hush_2021.c
+++ b/common/cli_hush_2021.c
@@ -26,7 +26,7 @@
 /*
  * BusyBox Version: UPDATE THIS WHEN PULLING NEW UPSTREAM REVISION!
  */
-#define BB_VER                 "1.34.0.git37460f5daff9"
+#define BB_VER                 "1.35.0.git7d1c7d833785"
 
 /*
  * Define hush features by the names used upstream.
diff --git a/common/cli_hush_upstream.c b/common/cli_hush_upstream.c
index 23392939e1..93796e87c5 100644
--- a/common/cli_hush_upstream.c
+++ b/common/cli_hush_upstream.c
@@ -339,7 +339,7 @@
  * therefore we don't show them either.
  */
 //usage:#define hush_trivial_usage
-//usage:       "[-enxl] [-c 'SCRIPT' [ARG0 ARGS] | FILE [ARGS] | -s [ARGS]]"
+//usage:       "[-enxl] [-c 'SCRIPT' [ARG0 ARGS] | FILE ARGS | -s ARGS]"
 //usage:#define hush_full_usage "\n\n"
 //usage:       "Unix shell interpreter"
 
@@ -374,7 +374,7 @@
 # define F_DUPFD_CLOEXEC F_DUPFD
 #endif
 
-#if ENABLE_FEATURE_SH_EMBEDDED_SCRIPTS && !(ENABLE_ASH || ENABLE_SH_IS_ASH || 
ENABLE_BASH_IS_ASH)
+#if ENABLE_FEATURE_SH_EMBEDDED_SCRIPTS && !ENABLE_SHELL_ASH
 # include "embedded_scripts.h"
 #else
 # define NUM_SCRIPTS 0
@@ -574,7 +574,7 @@ enum {
 #define NULL_O_STRING { NULL }
 
 #ifndef debug_printf_parse
-static const char *const assignment_flag[] = {
+static const char *const assignment_flag[] ALIGN_PTR = {
        "MAYBE_ASSIGNMENT",
        "DEFINITELY_ASSIGNMENT",
        "NOT_ASSIGNMENT",
@@ -958,6 +958,7 @@ struct globals {
 #if ENABLE_HUSH_INTERACTIVE
        smallint promptmode; /* 0: PS1, 1: PS2 */
 #endif
+       /* set by signal handler if SIGINT is received _and_ its trap is not 
set */
        smallint flag_SIGINT;
 #ifndef __U_BOOT__
 #if ENABLE_HUSH_LOOPS
@@ -1918,7 +1919,13 @@ static void restore_G_args(save_arg_t *sv, char **argv)
  * SIGQUIT: ignore
  * SIGTERM (interactive): ignore
  * SIGHUP (interactive):
- *    send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit
+ *    Send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit.
+ *    Kernel would do this for us ("orphaned process group" handling
+ *    according to POSIX) if we are a session leader and thus our death
+ *    frees the controlling tty, but to be bash-compatible, we also do it
+ *    for every interactive shell's death by SIGHUP.
+ *    (Also, we need to restore tty pgrp, otherwise e.g. Midnight Commander
+ *    backgrounds when hush started from it gets killed by SIGHUP).
  * 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. Try this in bash:
@@ -2034,6 +2041,14 @@ enum {
 static void record_pending_signo(int sig)
 {
        sigaddset(&G.pending_set, sig);
+#if ENABLE_FEATURE_EDITING
+       if (sig != SIGCHLD
+        || (G_traps && G_traps[SIGCHLD] && G_traps[SIGCHLD][0])
+        /* ^^^ if SIGCHLD, interrupt line reading only if it has a trap */
+       ) {
+               bb_got_signal = sig; /* for read_line_input: "we got a signal" 
*/
+       }
+#endif
 #if ENABLE_HUSH_FAST
        if (sig == SIGCHLD) {
                G.count_SIGCHLD++;
@@ -2265,20 +2280,27 @@ static int check_and_run_traps(void)
                        break;
 #if ENABLE_HUSH_JOB
                case SIGHUP: {
-//TODO: why are we doing this? ash and dash don't do this,
-//they have no handler for SIGHUP at all,
-//they rely on kernel to send SIGHUP+SIGCONT to orphaned process groups
-                       struct pipe *job;
-                       debug_printf_exec("%s: sig:%d default SIGHUP 
handler\n", __func__, sig);
-                       /* bash is observed to signal whole process groups,
-                        * not individual processes */
-                       for (job = G.job_list; job; job = job->next) {
-                               if (job->pgrp <= 0)
-                                       continue;
-                               debug_printf_exec("HUPing pgrp %d\n", 
job->pgrp);
-                               if (kill(- job->pgrp, SIGHUP) == 0)
-                                       kill(- job->pgrp, SIGCONT);
+                       /* if (G_interactive_fd) - no need to check, the handler
+                        * is only installed if we *are* interactive */
+                       {
+                               /* bash compat: "Before exiting, an interactive
+                                * shell resends the SIGHUP to all jobs, running
+                                * or stopped.  Stopped jobs are sent SIGCONT
+                                * to ensure that they receive the SIGHUP."
+                                */
+                               struct pipe *job;
+                               debug_printf_exec("%s: sig:%d default SIGHUP 
handler\n", __func__, sig);
+                               /* bash is observed to signal whole process 
groups,
+                                * not individual processes */
+                               for (job = G.job_list; job; job = job->next) {
+                                       if (job->pgrp <= 0)
+                                               continue;
+                                       debug_printf_exec("HUPing pgrp %d\n", 
job->pgrp);
+                                       if (kill(- job->pgrp, SIGHUP) == 0)
+                                               kill(- job->pgrp, SIGCONT);
+                               }
                        }
+                       /* this restores tty pgrp, then kills us with SIGHUP */
                        sigexit(SIGHUP);
                }
 #endif
@@ -2581,10 +2603,15 @@ int set_local_var_2021(char *str, int flags)
 }
 
 #ifndef __U_BOOT__
+static int set_local_var0(char *str)
+{
+       return set_local_var(str, 0);
+}
+
 static void FAST_FUNC set_local_var_from_halves(const char *name, const char 
*val)
 {
        char *var = xasprintf("%s=%s", name, val);
-       set_local_var(var, /*flag:*/ 0);
+       set_local_var0(var);
 }
 
 /* Used at startup and after each cd */
@@ -2788,30 +2815,54 @@ static void get_user_input(struct in_str *i)
        for (;;) {
                reinit_unicode_for_hush();
                G.flag_SIGINT = 0;
-               /* buglet: SIGINT will not make new prompt to appear _at once_,
-                * only after <Enter>. (^C works immediately) */
-               r = read_line_input(G.line_input_state, prompt_str,
+
+               bb_got_signal = 0;
+               if (!sigisemptyset(&G.pending_set)) {
+                       /* Whoops, already got a signal, do not call 
read_line_input */
+                       bb_got_signal = r = -1;
+               } else {
+                       /* For shell, LI_INTERRUPTIBLE is set:
+                        * read_line_input will abort on either
+                        * getting EINTR in poll() and bb_got_signal became != 
0,
+                        * or if it sees bb_got_signal != 0
+                        * (IOW: if signal arrives before poll() is reached).
+                        * Interactive testcases:
+                        * (while kill -INT $$; do sleep 1; done) &
+                        * #^^^ prints ^C, prints prompt, repeats
+                        * trap 'echo I' int; (while kill -INT $$; do sleep 1; 
done) &
+                        * #^^^ prints ^C, prints "I", prints prompt, repeats
+                        * trap 'echo T' term; (while kill $$; do sleep 1; 
done) &
+                        * #^^^ prints "T", prints prompt, repeats
+                        * #(bash 5.0.17 exits after first "T", looks like a 
bug)
+                        */
+                       r = read_line_input(G.line_input_state, prompt_str,
                                G.user_input_buf, 
CONFIG_FEATURE_EDITING_MAX_LEN-1
-               );
-               /* read_line_input intercepts ^C, "convert" it to SIGINT */
-               if (r == 0) {
-                       raise(SIGINT);
+                       );
+                       /* read_line_input intercepts ^C, "convert" it to 
SIGINT */
+                       if (r == 0)
+                               raise(SIGINT);
+               }
+               /* bash prints ^C (before running a trap, if any)
+                * both on keyboard ^C and on real SIGINT (non-kbd generated).
+                */
+               if (sigismember(&G.pending_set, SIGINT)) {
+                       write(STDOUT_FILENO, "^C\n", 3);
+                       G.last_exitcode = 128 | SIGINT;
                }
                check_and_run_traps();
-               if (r != 0 && !G.flag_SIGINT)
+               if (r == 0) /* keyboard ^C? */
+                       continue; /* go back, read another input line */
+               if (r > 0) /* normal input? (no ^C, no ^D, no signals) */
                        break;
-               /* ^C or SIGINT: repeat */
-               /* bash prints ^C even on real SIGINT (non-kbd generated) */
-               write(STDOUT_FILENO, "^C\n", 3);
-               G.last_exitcode = 128 | SIGINT;
-       }
-       if (r < 0) {
-               /* EOF/error detected */
-               /* ^D on interactive input goes to next line before exiting: */
-               write(STDOUT_FILENO, "\n", 1);
-               i->p = NULL;
-               i->peek_buf[0] = r = EOF;
-               return r;
+               if (!bb_got_signal) {
+                       /* r < 0: ^D/EOF/error detected (but not signal) */
+                       /* ^D on interactive input goes to next line before 
exiting: */
+                       write(STDOUT_FILENO, "\n", 1);
+                       i->p = NULL;
+                       i->peek_buf[0] = r = EOF;
+                       return r;
+               }
+               /* it was a signal: go back, read another input line */
        }
        i->p = G.user_input_buf;
        return (unsigned char)*i->p++;
@@ -2991,6 +3042,12 @@ static int i_getch(struct in_str *i)
                if (ch != '\0') {
                        i->p++;
                        i->last_char = ch;
+#if ENABLE_HUSH_LINENO_VAR
+                       if (ch == '\n') {
+                               G.parse_lineno++;
+                               debug_printf_parse("G.parse_lineno++ = %u\n", 
G.parse_lineno);
+                       }
+#endif
                        return ch;
                }
                return EOF;
@@ -3638,7 +3695,7 @@ static int glob_brace(char *pattern, o_string *o, int n)
         * NEXT points past the terminator of the first element, and REST
         * points past the final }.  We will accumulate result names from
         * recursive runs for each brace alternative in the buffer using
-        * GLOB_APPEND.  */
+        * GLOB_APPEND. */
 
        p = begin + 1;
        while (1) {
@@ -3954,7 +4011,7 @@ static void free_pipe_list(struct pipe *pi)
 #ifndef debug_print_tree
 static void debug_print_tree(struct pipe *pi, int lvl)
 {
-       static const char *const PIPE[] = {
+       static const char *const PIPE[] ALIGN_PTR = {
                [PIPE_SEQ] = "SEQ",
                [PIPE_AND] = "AND",
                [PIPE_OR ] = "OR" ,
@@ -3989,7 +4046,7 @@ static void debug_print_tree(struct pipe *pi, int lvl)
                [RES_XXXX ] = "XXXX" ,
                [RES_SNTX ] = "SNTX" ,
        };
-       static const char *const CMDTYPE[] = {
+       static const char *const CMDTYPE[] ALIGN_PTR = {
                "{}",
                "()",
                "[noglob]",
@@ -5354,7 +5411,7 @@ static int parse_dollar_squote(o_string *as_string, 
o_string *dest, struct in_st
 # undef as_string
 }
 #else
-# #define parse_dollar_squote(as_string, dest, input) 0
+# define parse_dollar_squote(as_string, dest, input) 0
 #endif /* BASH_DOLLAR_SQUOTE */
 #endif /* !__U_BOOT__ */
 
@@ -6721,7 +6778,7 @@ static char *encode_then_expand_vararg(const char *str, 
int handle_squotes, int
 
 /* Expanding ARG in ${var+ARG}, ${var-ARG}
  */
-static int encode_then_append_var_plusminus(o_string *output, int n,
+static NOINLINE int encode_then_append_var_plusminus(o_string *output, int n,
                char *str, int dquoted)
 {
        struct in_str input;
@@ -6886,16 +6943,21 @@ static arith_t expand_and_evaluate_arith(const char 
*arg, const char **errmsg_p)
 /* ${var/[/]pattern[/repl]} helpers */
 static char *strstr_pattern(char *val, const char *pattern, int *size)
 {
-       int sz = strcspn(pattern, "*?[\\");
-       if (pattern[sz] == '\0') {
+       int first_escaped = (pattern[0] == '\\' && pattern[1]);
+       /* "first_escaped" trick allows to treat e.g. "\*no_glob_chars"
+        * as literal too (as it is semi-common, and easy to accomodate
+        * by just using str + 1).
+        */
+       int sz = strcspn(pattern + first_escaped * 2, "*?[\\");
+       if ((pattern + first_escaped * 2)[sz] == '\0') {
                /* Optimization for trivial patterns.
                 * Testcase for very slow replace (performs about 22k replaces):
                 * x=::::::::::::::::::::::
                 * 
x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;x=$x$x;echo ${#x}
                 * echo "${x//:/|}"
                 */
-               *size = sz;
-               return strstr(val, pattern);
+               *size = sz + first_escaped;
+               return strstr(val, pattern + first_escaped);
        }
 
        while (1) {
@@ -7371,7 +7433,7 @@ static NOINLINE int expand_one_var(o_string *output, int 
n,
                                                        val = NULL;
                                                } else {
                                                        char *new_var = 
xasprintf("%s=%s", var, val);
-                                                       set_local_var(new_var, 
/*flag:*/ 0);
+                                                       set_local_var0(new_var);
                                                }
                                        }
                                }
@@ -8026,7 +8088,11 @@ static int parse_and_run_string(const char *s)
 #endif /* __U_BOOT__ */
 {
        struct in_str input;
+#ifndef __U_BOOT__
+       IF_HUSH_LINENO_VAR(unsigned sv = G.parse_lineno;)
+#else /* __U_BOOT__ */
        //IF_HUSH_LINENO_VAR(unsigned sv = G.parse_lineno;)
+#endif /* __U_BOOT__ */
 
        setup_string_in_str(&input, s);
 #ifndef __U_BOOT__
@@ -8034,7 +8100,11 @@ static int parse_and_run_string(const char *s)
 #else /* __U_BOOT__ */
        return parse_and_run_stream(&input, '\0');
 #endif /* __U_BOOT__ */
-       //IF_HUSH_LINENO_VAR(G.parse_lineno = sv;)
+#ifndef __U_BOOT__
+       IF_HUSH_LINENO_VAR(unsigned sv = G.parse_lineno;)
+#else /* __U_BOOT__ */
+       //IF_HUSH_LINENO_VAR(unsigned sv = G.parse_lineno;)
+#endif /* __U_BOOT__ */
 }
 
 #ifdef __U_BOOT__
@@ -8142,7 +8212,7 @@ static int generate_stream_from_string(const char *s, 
pid_t *pid_p)
                if (is_prefixed_with(s, "trap")
                 && skip_whitespace(s + 4)[0] == '\0'
                ) {
-                       static const char *const argv[] = { NULL, NULL };
+                       static const char *const argv[] ALIGN_PTR = { NULL, 
NULL };
                        builtin_trap((char**)argv);
                        fflush_all(); /* important */
                        _exit(0);
@@ -8671,7 +8741,7 @@ static const struct built_in_command *find_builtin(const 
char *name)
        return find_builtin_helper(name, bltins2, 
&bltins2[ARRAY_SIZE(bltins2)]);
 }
 
-#if ENABLE_HUSH_JOB && EDITING_HAS_get_exe_name
+#if ENABLE_HUSH_JOB && ENABLE_FEATURE_TAB_COMPLETION
 static const char * FAST_FUNC get_builtin_name(int i)
 {
        if (/*i >= 0 && */ i < ARRAY_SIZE(bltins1)) {
@@ -9107,7 +9177,7 @@ static NOINLINE void pseudo_exec_argv(nommu_save_t 
*nommu_save,
                 * expand_assignments(): think about ... | var=`sleep 1` | ...
                 */
                free_strings(new_env);
-               _exit(EXIT_SUCCESS);
+               _exit_SUCCESS();
        }
 
        sv_shadowed = G.shadowed_vars_pp;
@@ -9288,7 +9358,7 @@ static void pseudo_exec(nommu_save_t *nommu_save,
 
        /* Case when we are here: ... | >file */
        debug_printf_exec("pseudo_exec'ed null command\n");
-       _exit(EXIT_SUCCESS);
+       _exit_SUCCESS();
 }
 
 #if ENABLE_HUSH_JOB
@@ -9895,7 +9965,7 @@ static NOINLINE int run_pipe(struct pipe *pi)
 #endif
                                debug_printf_env("set shell var:'%s'->'%s'\n", 
*argv, p);
 #ifndef __U_BOOT__
-                               if (set_local_var(p, /*flag:*/ 0)) {
+                               if (set_local_var0(p)) {
 #else /* __U_BOOT__ */
                                if (set_local_var_2021(p, /*flag:*/ 0)) {
 #endif
@@ -10421,7 +10491,7 @@ static int run_list(struct pipe *pi)
                                static const char encoded_dollar_at[] ALIGN1 = {
                                        SPECIAL_VAR_SYMBOL, '@' | 0x80, 
SPECIAL_VAR_SYMBOL, '\0'
                                }; /* encoded representation of "$@" */
-                               static const char *const 
encoded_dollar_at_argv[] = {
+                               static const char *const 
encoded_dollar_at_argv[] ALIGN_PTR = {
                                        encoded_dollar_at, NULL
                                }; /* argv list with one element: "$@" */
                                char **vals;
@@ -10452,7 +10522,7 @@ static int run_list(struct pipe *pi)
                        /* Insert next value from for_lcur */
                        /* note: *for_lcur already has quotes removed, $var 
expanded, etc */
 #ifndef __U_BOOT__
-                       set_local_var(xasprintf("%s=%s", pi->cmds[0].argv[0], 
*for_lcur++), /*flag:*/ 0);
+                       set_local_var_from_halves(pi->cmds[0].argv[0], 
*for_lcur++);
 #else /* __U_BOOT__ */
                        /* We cannot use xasprintf, so we emulate it. */
                        char *full_var;
@@ -10548,8 +10618,11 @@ static int run_list(struct pipe *pi)
                G.flag_break_continue = 0;
 #endif
 #endif /* !__U_BOOT__ */
+#ifndef __U_BOOT__
+               rcode = r = G.o_opt[OPT_O_NOEXEC] ? 0 : run_pipe(pi);
+               /* NB: rcode is a smalluint, r is int */
+#else /* __U_BOOT__ */
                rcode = r = run_pipe(pi); /* NB: rcode is a smalluint, r is int 
*/
-#ifdef __U_BOOT__
                if (r <= EXIT_RET_CODE) {
                        int previous_rcode = G.last_exitcode;
                        /*
@@ -10839,7 +10912,10 @@ static int set_mode(int state, char mode, const char 
*o_opt)
        int idx;
        switch (mode) {
        case 'n':
-               G.o_opt[OPT_O_NOEXEC] = state;
+               /* set -n has no effect in interactive shell */
+               /* Try: while set -n; do echo $-; done */
+               if (!G_interactive_fd)
+                       G.o_opt[OPT_O_NOEXEC] = state;
                break;
        case 'x':
                IF_HUSH_MODE_X(G_x_mode = state;)
@@ -10912,7 +10988,7 @@ int hush_main(int argc, char **argv)
 
        cached_getpid = getpid();   /* for tcsetpgrp() during init */
        G.root_pid = cached_getpid; /* for $PID  (NOMMU can override via 
-$HEXPID:HEXPPID:...) */
-       G.root_ppid = getppid();    /* for $PPID (NOMMU can override)  */
+       G.root_ppid = getppid();    /* for $PPID (NOMMU can override) */
 
        /* Deal with HUSH_VERSION */
        debug_printf_env("unsetenv '%s'\n", "HUSH_VERSION");
@@ -11043,6 +11119,29 @@ int hush_main(int argc, char **argv)
                        /* Well, we cannot just declare interactiveness,
                         * we have to have some stuff (ctty, etc) */
                        /* G_interactive_fd++; */
+//There are a few cases where bash -i -c 'SCRIPT'
+//has visible effect (differs from bash -c 'SCRIPT'):
+//it ignores TERM:
+//     bash -i -c 'kill $$; echo ALIVE'
+//     ALIVE
+//it resets SIG_IGNed HUP to SIG_DFL:
+//     trap '' hup; bash -i -c 'kill -hup $$; echo ALIVE'
+//     Hangup   [the message is not printed by bash, it's the shell which 
started it]
+//is talkative about jobs and exiting:
+//     bash -i -c 'sleep 1 & exit'
+//     [1] 16170
+//     exit
+//includes $ENV file (only if run as "sh"):
+//     echo last >/tmp/ENV; ENV=/tmp/ENV sh -i -c 'echo HERE'
+//     last: cannot open /var/log/wtmp: No such file or directory
+//     HERE
+//(under "bash", it's the opposite: it runs $BASH_ENV file only *without* -i).
+//
+//ash -i -c 'sleep 3; sleep 3', on ^C, drops into a prompt instead of exiting
+//(this may be a bug, bash does not do this).
+//(ash -i -c 'sleep 3' won't show this, the last command gets auto-"exec"ed)
+//
+//None of the above feel like useful features people would rely on.
                        break;
                case 's':
                        G.opt_s = 1;
@@ -11307,9 +11406,12 @@ int hush_main(int argc, char **argv)
 
 # if ENABLE_FEATURE_EDITING
                G.line_input_state = new_line_input_t(FOR_SHELL);
-#  if EDITING_HAS_get_exe_name
+#  if ENABLE_FEATURE_TAB_COMPLETION
                G.line_input_state->get_exe_name = get_builtin_name;
 #  endif
+#  if EDITING_HAS_sh_get_var
+               G.line_input_state->sh_get_var = get_local_var_value;
+#  endif
 # endif
 # if ENABLE_HUSH_SAVEHISTORY && MAX_HISTORY > 0
                {
@@ -12422,7 +12524,7 @@ static int FAST_FUNC builtin_fg_bg(char **argv)
        /* TODO: bash prints a string representation
         * of job being foregrounded (like "sleep 1 | cat") */
        if (argv[0][0] == 'f' && G_saved_tty_pgrp) {
-               /* Put the job into the foreground.  */
+               /* Put the job into the foreground. */
                tcsetpgrp(G_interactive_fd, pi->pgrp);
        }
 
-- 
2.34.1

Reply via email to