diff options
Diffstat (limited to 'gdb/cli/cli-logging.c')
-rw-r--r-- | gdb/cli/cli-logging.c | 114 |
1 files changed, 103 insertions, 11 deletions
diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c index af63dcc..aa53523 100644 --- a/gdb/cli/cli-logging.c +++ b/gdb/cli/cli-logging.c @@ -21,6 +21,7 @@ #include "defs.h" #include "gdbcmd.h" #include "ui-out.h" +#include "gdb_assert.h" #include "gdb_string.h" @@ -46,6 +47,15 @@ show_logging_filename (struct ui_file *file, int from_tty, } static int logging_overwrite; + +static void +set_logging_overwrite (char *args, int from_tty, struct cmd_list_element *c) +{ + if (saved_filename) + warning (_("Currently logging to %s. Turn the logging off and on to " + "make the new setting effective."), saved_filename); +} + static void show_logging_overwrite (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) @@ -55,7 +65,67 @@ Whether logging overwrites or appends to the log file is %s.\n"), value); } +/* Value as configured by the user. */ static int logging_redirect; + +/* The on-disk file in use if logging is currently active together with + redirection turned off (and therefore using tee_file_new). For active + logging with redirection the on-disk file is directly in GDB_STDOUT and + this variable is NULL. */ +static struct ui_file *logging_no_redirect_file; + +static void +set_logging_redirect (char *args, int from_tty, struct cmd_list_element *c) +{ + struct cleanup *cleanups = NULL; + struct ui_file *output, *new_logging_no_redirect_file; + + if (saved_filename == NULL + || (logging_redirect != 0 && logging_no_redirect_file == NULL) + || (logging_redirect == 0 && logging_no_redirect_file != NULL)) + return; + + if (logging_redirect != 0) + { + gdb_assert (logging_no_redirect_file != NULL); + + /* ui_out_redirect still has not been called for next gdb_stdout. */ + cleanups = make_cleanup_ui_file_delete (gdb_stdout); + + output = logging_no_redirect_file; + new_logging_no_redirect_file = NULL; + + if (from_tty) + fprintf_unfiltered (saved_output.out, "Redirecting output to %s.\n", + logging_filename); + } + else + { + gdb_assert (logging_no_redirect_file == NULL); + output = tee_file_new (saved_output.out, 0, gdb_stdout, 0); + if (output == NULL) + perror_with_name (_("set logging")); + new_logging_no_redirect_file = gdb_stdout; + + if (from_tty) + fprintf_unfiltered (saved_output.out, "Copying output to %s.\n", + logging_filename); + } + + gdb_stdout = output; + gdb_stderr = output; + gdb_stdlog = output; + gdb_stdtarg = output; + logging_no_redirect_file = new_logging_no_redirect_file; + + /* It should not happen, the redirection has been already setup. */ + if (ui_out_redirect (uiout, output) < 0) + warning (_("Current output protocol does not support redirection")); + + if (logging_redirect != 0) + do_cleanups (cleanups); +} + static void show_logging_redirect (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) @@ -70,6 +140,11 @@ pop_output_files (void) /* Only delete one of the files -- they are all set to the same value. */ ui_file_delete (gdb_stdout); + if (logging_no_redirect_file) + { + ui_file_delete (logging_no_redirect_file); + logging_no_redirect_file = NULL; + } gdb_stdout = saved_output.out; gdb_stderr = saved_output.err; gdb_stdlog = saved_output.log; @@ -104,18 +179,25 @@ handle_redirections (int from_tty) /* Redirects everything to gdb_stdout while this is running. */ if (!logging_redirect) { - output = tee_file_new (gdb_stdout, 0, output, 1); + struct ui_file *no_redirect_file = output; + + output = tee_file_new (gdb_stdout, 0, no_redirect_file, 0); if (output == NULL) perror_with_name (_("set logging")); - discard_cleanups (cleanups); - cleanups = make_cleanup_ui_file_delete (output); + make_cleanup_ui_file_delete (output); if (from_tty) fprintf_unfiltered (gdb_stdout, "Copying output to %s.\n", logging_filename); + logging_no_redirect_file = no_redirect_file; + } + else + { + gdb_assert (logging_no_redirect_file == NULL); + + if (from_tty) + fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n", + logging_filename); } - else if (from_tty) - fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n", - logging_filename); discard_cleanups (cleanups); @@ -187,10 +269,20 @@ show_logging_command (char *args, int from_tty) else printf_unfiltered (_("Logs will be appended to the log file.\n")); - if (logging_redirect) - printf_unfiltered (_("Output will be sent only to the log file.\n")); + if (saved_filename) + { + if (logging_redirect) + printf_unfiltered (_("Output is being sent only to the log file.\n")); + else + printf_unfiltered (_("Output is being logged and displayed.\n")); + } else - printf_unfiltered (_("Output will be logged and displayed.\n")); + { + if (logging_redirect) + printf_unfiltered (_("Output will be sent only to the log file.\n")); + else + printf_unfiltered (_("Output will be logged and displayed.\n")); + } } /* Provide a prototype to silence -Wmissing-prototypes. */ @@ -211,7 +303,7 @@ _initialize_cli_logging (void) Set whether logging overwrites or appends to the log file."), _("\ Show whether logging overwrites or appends to the log file."), _("\ If set, logging overrides the log file."), - NULL, + set_logging_overwrite, show_logging_overwrite, &set_logging_cmdlist, &show_logging_cmdlist); add_setshow_boolean_cmd ("redirect", class_support, &logging_redirect, _("\ @@ -219,7 +311,7 @@ Set the logging output mode."), _("\ Show the logging output mode."), _("\ If redirect is off, output will go to both the screen and the log file.\n\ If redirect is on, output will go only to the log file."), - NULL, + set_logging_redirect, show_logging_redirect, &set_logging_cmdlist, &show_logging_cmdlist); add_setshow_filename_cmd ("file", class_support, &logging_filename, _("\ |