Index: gdb/cli/cli-logging.c |
diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c |
index 0c5bda8797563cdb787df11e3e1f6856c91f49ca..6ff064ad6f3d1ff12ed005ea483e9359eaa0022a 100644 |
--- a/gdb/cli/cli-logging.c |
+++ b/gdb/cli/cli-logging.c |
@@ -20,6 +20,7 @@ |
#include "defs.h" |
#include "gdbcmd.h" |
#include "ui-out.h" |
+#include "interps.h" |
#include "gdb_assert.h" |
#include "gdb_string.h" |
@@ -115,11 +116,17 @@ set_logging_redirect (char *args, int from_tty, struct cmd_list_element *c) |
logging_filename); |
} |
- gdb_stdout = output; |
- gdb_stderr = output; |
- gdb_stdlog = output; |
- gdb_stdtarg = output; |
- gdb_stdtargerr = output; |
+ /* Give the current interpreter a chance to do anything special that |
+ it might need for logging, such as updating other channels. */ |
+ if (current_interp_set_logging (1, output, NULL) == 0) |
+ { |
+ gdb_stdout = output; |
+ gdb_stdlog = output; |
+ gdb_stderr = output; |
+ gdb_stdtarg = output; |
+ gdb_stdtargerr = output; |
+ } |
+ |
logging_no_redirect_file = new_logging_no_redirect_file; |
/* There is a former output pushed on the ui_out_redirect stack. We |
@@ -147,19 +154,25 @@ show_logging_redirect (struct ui_file *file, int from_tty, |
static void |
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; |
- gdb_stdtarg = saved_output.targ; |
- gdb_stdtargerr = saved_output.targ; |
+ |
+ if (current_interp_set_logging (0, NULL, NULL) == 0) |
+ { |
+ /* Only delete one of the files -- they are all set to the same |
+ value. */ |
+ ui_file_delete (gdb_stdout); |
+ |
+ gdb_stdout = saved_output.out; |
+ gdb_stderr = saved_output.err; |
+ gdb_stdlog = saved_output.log; |
+ gdb_stdtarg = saved_output.targ; |
+ gdb_stdtargerr = saved_output.targ; |
+ } |
+ |
saved_output.out = NULL; |
saved_output.err = NULL; |
saved_output.log = NULL; |
@@ -175,6 +188,7 @@ handle_redirections (int from_tty) |
{ |
struct cleanup *cleanups; |
struct ui_file *output; |
+ struct ui_file *no_redirect_file = NULL; |
if (saved_filename != NULL) |
{ |
@@ -191,7 +205,7 @@ handle_redirections (int from_tty) |
/* Redirects everything to gdb_stdout while this is running. */ |
if (!logging_redirect) |
{ |
- struct ui_file *no_redirect_file = output; |
+ no_redirect_file = output; |
output = tee_file_new (gdb_stdout, 0, no_redirect_file, 0); |
if (output == NULL) |
@@ -220,14 +234,22 @@ handle_redirections (int from_tty) |
saved_output.targ = gdb_stdtarg; |
saved_output.targerr = gdb_stdtargerr; |
- gdb_stdout = output; |
- gdb_stderr = output; |
- gdb_stdlog = output; |
- gdb_stdtarg = output; |
- gdb_stdtargerr = output; |
+ /* Let the interpreter do anything it needs. */ |
+ if (current_interp_set_logging (1, output, no_redirect_file) == 0) |
+ { |
+ gdb_stdout = output; |
+ gdb_stdlog = output; |
+ gdb_stderr = output; |
+ gdb_stdtarg = output; |
+ gdb_stdtargerr = output; |
+ } |
- if (ui_out_redirect (current_uiout, output) < 0) |
- warning (_("Current output protocol does not support redirection")); |
+ /* Don't do the redirect for MI, it confuses MI's ui-out scheme. */ |
+ if (!ui_out_is_mi_like_p (current_uiout)) |
+ { |
+ if (ui_out_redirect (current_uiout, output) < 0) |
+ warning (_("Current output protocol does not support redirection")); |
+ } |
} |
static void |