On Wed, May 31, 2023 at 12:52 PM Hsin-Yi Wang <hsinyi(a)chromium.org> wrote:
 On Wed, May 31, 2023 at 11:05 AM Hsin-Yi Wang <hsinyi(a)chromium.org> wrote:
 >
 > On Wed, May 31, 2023 at 10:54 AM HAGIO KAZUHITO(萩尾 一仁)
 > <k-hagio-ab(a)nec.com> wrote:
 > >
 > > On 2023/05/31 3:13, Hsin-Yi Wang wrote:
 > > > When stdin is not a TTY, prompt ("crash> ") won't be
displayed. If
 > > > another process interact with crash with piped stdin/stdout, it will not
 > > > get the prompt as a delimiter.
 > > >
 > > > Compared to other debugger like gdb, crash seems intended to give a
 > > > prompt in this case in the beginning of process_command_line(). It
 > > > checks if pc->flags does NOT have any of
 > > > READLINE|SILENT|CMDLINE_IFILE|RCHOME_IFILE|RCLOCAL_IFILE, a
 > > > prompt should be printed. The check will never be true since READLINE is
 > > > set in setup_environment() unconditionally. It makes more sense to
 > > > change the READLINE flag in the check to TTY instead.
 > > >
 > > > Additionally, when stdin is not TTY, repeat the command line from user
 > > > after prompt, which can give more context.
 > > >
 > > > The prompt and command line can be opt out by using the silent (-s) flag.
 > > >
 > > > Signed-off-by: Hsin-Yi Wang <hsinyi(a)chromium.org>
 > >
 > > Thanks, but I found a case that prints two prompts, after a fatal error:
 > >
 > > # cat ~/.crashrc
 > > sys config        <<-- any command that fails with error(FATAL)
 > > sys
 > > # echo quit | crash
 > > ...
 > > 2 crash> sys config
 > > sys: kernel_config_data does not exist in this kernel
 > > 1 crash> 2 crash> sys
 > >        KERNEL: /usr/lib/debug/lib/modules/4.18.0-305.el8.x86_64/vmlinux
 > > ...
 > >
 > > where the crash has this:
 > >
 > > --- a/cmdline.c
 > > +++ b/cmdline.c
 > > @@ -66,7 +66,7 @@ process_command_line(void)
 > >
 > >          if (!(pc->flags &
 > >              (TTY|SILENT|CMDLINE_IFILE|RCHOME_IFILE|RCLOCAL_IFILE)))
 > > -               fprintf(fp, "%s", pc->prompt);
 > > +               fprintf(fp, "1 %s", pc->prompt);
 > >          fflush(fp);
 > >
 > >          /*
 > > @@ -1487,7 +1487,7 @@ exec_input_file(void)
 > >                          continue;
 > >
 > >                   if (!(pc->flags & SILENT)) {
 > > -                        fprintf(fp, "%s%s", pc->prompt, buf);
 > > +                        fprintf(fp, "2 %s%s", pc->prompt, buf);
 Ah, I misread this as the fprintf in process_command_line. I'll take a
 look at this issue to see how to avoid it.  Sorry for the confusion.
 >
 > I don't think we need to print a prompt again here. It can be used as
 > a delimiter when all the previous output are done and waiting for user
 > input. If we print the prompt again. what it will read:
 >
 > crash 8.0.3++
 > 1 crash>
 > // suppose stdin has cmd1 after here.
 > 2 crash> cmd1
 > cmd1_output
 > 1 crash>
 > // supposes stdin has cmd2 after here.
 > 2 crash> cmd2
 > cmd2_output
 >
 > Without the 2nd prompt:
 > crash 8.0.3++
 > 1 crash>
 > // suppose stdin has cmd1 after here.
 > cmd1
 > cmd1_output
 > 1 crash>
 > // suppose stdin has cmd2 after here.
 > cmd2
 > cmd2_output
 >
 > >                           fflush(fp);
 > >                   }
 > >
 > > Can we avoid this?
 > > 
This is addressed in v2. In process_command_line(), we can tell if
we're still recovering from FATAL command in the input file, don't
print the prompt as it will be printed later.
Test cases:
1.
~/.crashrc
sys config
sys
output:
2 crash> sys config
sys: kernel_config_data does not exist in this kernel
2 crash> sys
      KERNEL:...
1 crash> quit
2.
~/.crashrc
sys
sys
output:
2 crash> sys
      KERNEL:...
2 crash> sys
      KERNEL:...
1 crash> quit
Thanks for catching this!
 > > Thanks,
 > > Kazu
 > >
 > > > ---
 > > > v1:
 > > > - The original discussion:
https://listman.redhat.com/archives/crash-utility/2023-May/010710.html
 > > > - Kazu: provide the idea to print the command line as well.
 > > > ---
 > > >   cmdline.c | 6 +++++-
 > > >   1 file changed, 5 insertions(+), 1 deletion(-)
 > > >
 > > > diff --git a/cmdline.c b/cmdline.c
 > > > index ded6551..9821d86 100644
 > > > --- a/cmdline.c
 > > > +++ b/cmdline.c
 > > > @@ -65,7 +65,7 @@ process_command_line(void)
 > > >       BZERO(pc->command_line, BUFSIZE);
 > > >
 > > >       if (!(pc->flags &
 > > > -         (READLINE|SILENT|CMDLINE_IFILE|RCHOME_IFILE|RCLOCAL_IFILE)))
 > > > +         (TTY|SILENT|CMDLINE_IFILE|RCHOME_IFILE|RCLOCAL_IFILE)))
 > > >               fprintf(fp, "%s", pc->prompt);
 > > >       fflush(fp);
 > > >
 > > > @@ -139,6 +139,10 @@ process_command_line(void)
 > > >           } else {
 > > >               if (fgets(pc->command_line, BUFSIZE-1, stdin) == NULL)
 > > >                       clean_exit(1);
 > > > +             if (!(pc->flags & SILENT)) {
 > > > +                     fprintf(fp, "%s", pc->command_line);
 > > > +                     fflush(fp);
 > > > +             }
 > > >               clean_line(pc->command_line);
 > > >               strcpy(pc->orig_line, pc->command_line);
 > > >           }