On 2023/05/30 14:09, Hsin-Yi Wang wrote: > On Tue, May 30, 2023 at 10:31 AM HAGIO KAZUHITO(萩尾 一仁) > <k-hagio-ab@xxxxxxx> wrote: >> >> On 2023/05/28 5:17, Hsin-Yi Wang wrote: >>> hi crash-utility community, >>> >>> When stdin is not a TTY, but all the other flags remain the same, >>> prompt ("crash> ") won't be displayed. An example use case is, the >>> stdin of crash is replaced by a piped fd connected to another process. >>> >>> In process_command_line(), it checks if pc->flags does NOT have any of >>> the flag: READLINE|SILENT|CMDLINE_IFILE|RCHOME_IFILE|RCLOCAL_IFILE, a >>> prompt should be printed. >>> >>> But in setup_environment(), pc->flags is set to have READLINE flag[2], >>> the above check will not be true at all. >>> >>> Should READLINE be set for all cases in setup_environment()? >>> - If true, should the check in process_command_line() look for TTY >>> instead of READLINE? Since if pc->flags has TTY, [2] won't be true and >>> the prompt will be printed later in TTY's case[3]. >>> - If false, where should be a proper place and conditions to set READLINE? >>> >>> Or is the current behavior intended? I may not fully understand the >>> design logic. Any explanations are appreciated. >> >> I don't know the full history of crash, but my impression of the flag is >> that probably it's an ancient code and almost meaningless now, but the >> current behavior is intended. >> >> What you want to do is displaying the prompt and command without a tty? > > Interact with crash through another process that piped stdin/stdout > with crash to do additional input/output processing, so the filemode > won't work. Ah, got it. So the prompt can be used as a delimiter or something? It might be useful. > >> This is also my imagination, but probably they wanted only command >> output like this without the prompt and command: >> >> # echo sys | crash -s >> KERNEL: /usr/lib/debug/lib/modules/4.18.0-305.el8.x86_64/vmlinux >> DUMPFILE: /proc/kcore >> CPUS: 16 >> DATE: Tue May 30 11:15:41 JST 2023 >> UPTIME: 19 days, 23:23:48 >> LOAD AVERAGE: 0.18, 0.12, 0.09 >> TASKS: 555 >> NODENAME: r110j-1 >> RELEASE: 4.18.0-305.el8.x86_64 >> VERSION: #1 SMP Thu Apr 29 08:54:30 EDT 2021 >> MACHINE: x86_64 (3400 Mhz) >> MEMORY: 63.9 GB >> # > > But I wonder if the current behavior is intended, wouldn't [1] never > be run because of [2]? > [1] https://github.com/crash-utility/crash/blob/05a3a328fcd8920e49926b6d1c9c81ce0b6acbca/cmdline.c#L67 > [2] https://github.com/crash-utility/crash/blob/8246dce99dd23457e8c7a3fe9609c706694d1959/main.c#L1182 Right, I guessed that it ultimately became so after changes, although it should have got removed. But maybe not. > > Another not necessarily related data point is, I compared the gdb tool > and it will also give the prompt if no tty presented. > >> >> Because if they wanted the prompt and command, it would be easily done >> like this... >> >> --- a/cmdline.c >> +++ b/cmdline.c >> @@ -139,6 +139,7 @@ process_command_line(void) >> } else { >> if (fgets(pc->command_line, BUFSIZE-1, stdin) == NULL) >> clean_exit(1); >> + fprintf(fp, "%s%s", pc->prompt, pc->command_line); >> clean_line(pc->command_line); >> strcpy(pc->orig_line, pc->command_line); >> } > > Yeah, maybe print this before the fgets with fflush()? similar to [1], > or does the following make sense? > > diff --git a/cmdline.c b/cmdline.c > index ded6551..181800a 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); It does not print the input command line only with this, I would like to also print it if we print the prompt. How about this? --- 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,11 @@ 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); } This looks consistent with the other types of crash session. And we can still get only a command output with -s option. # echo sys | crash -s Thanks, Kazu > >> >> If you want the prompt and command with pre-generated crash commands, >> you can use "crash -i" option. How about this? > > Filemode is not ideal if we want to pipe crash with another process > that users interact with, since we will have to load vmlinux and > dumpfile every time. > > But if this still looks like working as intended, I will close this issue. > > Thanks for your reply. > >> >> # echo sys > cmd >> # crash -i cmd >> >> Thanks, >> Kazu >> >>> >>> Thanks! >>> >>> [1] https://github.com/crash-utility/crash/blob/05a3a328fcd8920e49926b6d1c9c81ce0b6acbca/cmdline.c#L67 >>> [2] https://github.com/crash-utility/crash/blob/8246dce99dd23457e8c7a3fe9609c706694d1959/main.c#L1182 >>> [3] https://github.com/crash-utility/crash/blob/05a3a328fcd8920e49926b6d1c9c81ce0b6acbca/cmdline.c#L120 >>> >>> -- >>> Crash-utility mailing list >>> Crash-utility@xxxxxxxxxx >>> https://listman.redhat.com/mailman/listinfo/crash-utility >>> Contribution Guidelines: https://github.com/crash-utility/crash/wiki -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/crash-utility Contribution Guidelines: https://github.com/crash-utility/crash/wiki