/* This is a helper for the `set logging' command. */ static void handle_redirections (int from_tty) { struct ui_file *output; if (saved_filename != NULL) { fprintf_unfiltered (gdb_stdout, "Already logging to %s.\n", saved_filename); return; } output = gdb_fopen (logging_filename, logging_overwrite ? "w" : "a"); if (output == NULL) perror_with_name ("set logging"); /* Redirects everything to gdb_stdout while this is running. */ if (!logging_redirect) { output = tee_file_new (gdb_stdout, 0, output, 1); if (output == NULL) perror_with_name ("set logging"); if (from_tty) fprintf_unfiltered (gdb_stdout, "Copying output to %s.\n", logging_filename); } else if (from_tty) fprintf_unfiltered (gdb_stdout, "Redirecting output to %s.\n", logging_filename); saved_filename = xstrdup (logging_filename); saved_output.out = gdb_stdout; saved_output.err = gdb_stderr; saved_output.log = gdb_stdlog; saved_output.targ = gdb_stdtarg; gdb_stdout = output; gdb_stderr = output; gdb_stdlog = output; gdb_stdtarg = output; if (ui_out_redirect (uiout, gdb_stdout) < 0) warning ("Current output protocol does not support redirection"); }
static int mi_set_logging (struct interp *interp, int start_log, struct ui_file *out, struct ui_file *logfile) { struct mi_interp *mi = interp_data (interp); if (!mi) return 0; if (start_log) { /* The tee created already is based on gdb_stdout, which for MI is a console and so we end up in an infinite loop of console writing to ui_file writing to console etc. So discard the existing tee (it hasn't been used yet, and MI won't ever use it), and create one based on raw_stdout instead. */ if (logfile) { ui_file_delete (out); out = tee_file_new (raw_stdout, 0, logfile, 0); } saved_raw_stdout = raw_stdout; raw_stdout = out; } else { raw_stdout = saved_raw_stdout; saved_raw_stdout = NULL; } mi_console_set_raw (mi->out, raw_stdout); mi_console_set_raw (mi->err, raw_stdout); mi_console_set_raw (mi->log, raw_stdout); mi_console_set_raw (mi->targ, raw_stdout); mi_console_set_raw (mi->event_channel, raw_stdout); return 1; }