set_prompt (char *s)
{
/* ??rehrauer: I don't know why this fails, since it looks as though
- assignments to prompt are wrapped in calls to savestring...
+ assignments to prompt are wrapped in calls to xstrdup...
if (prompt != NULL)
xfree (prompt);
*/
- PROMPT (0) = savestring (s, strlen (s));
+ PROMPT (0) = xstrdup (s);
}
\f
-/* If necessary, make the user confirm that we should quit. Return
- non-zero if we should quit, zero if we shouldn't. */
+struct qt_args
+{
+ char *args;
+ int from_tty;
+};
-int
-quit_confirm (void)
+/* Callback for iterate_over_inferiors. Kills or detaches the given
+ inferior, depending on how we originally gained control of it. */
+
+static int
+kill_or_detach (struct inferior *inf, void *args)
{
- if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution)
+ struct qt_args *qt = args;
+ struct thread_info *thread;
+
+ thread = any_thread_of_process (inf->pid);
+ if (thread != NULL)
{
- char *s;
- struct inferior *inf = current_inferior ();
-
- /* This is something of a hack. But there's no reliable way to
- see if a GUI is running. The `use_windows' variable doesn't
- cut it. */
- if (deprecated_init_ui_hook)
- s = _("A debugging session is active.\nDo you still want to close the debugger?");
- else if (inf->attach_flag)
- s = _("The program is running. Quit anyway (and detach it)? ");
- else
- s = _("The program is running. Quit anyway (and kill it)? ");
+ switch_to_thread (thread->ptid);
- if (!query ("%s", s))
- return 0;
+ /* Leave core files alone. */
+ if (target_has_execution)
+ {
+ if (inf->attach_flag)
+ target_detach (qt->args, qt->from_tty);
+ else
+ target_kill ();
+ }
}
- return 1;
+ return 0;
}
-struct qt_args
-{
- char *args;
- int from_tty;
-};
-
-/* Callback for iterate_over_threads. Finds any thread of inferior
- given by ARG (really an int*). */
+/* Callback for iterate_over_inferiors. Prints info about what GDB
+ will do to each inferior on a "quit". ARG points to a struct
+ ui_out where output is to be collected. */
static int
-any_thread_of (struct thread_info *thread, void *arg)
+print_inferior_quit_action (struct inferior *inf, void *arg)
{
- int pid = * (int *)arg;
+ struct ui_file *stb = arg;
- if (PIDGET (thread->ptid) == pid)
- return 1;
+ if (inf->attach_flag)
+ fprintf_filtered (stb,
+ _("\tInferior %d [%s] will be detached.\n"), inf->num,
+ target_pid_to_str (pid_to_ptid (inf->pid)));
+ else
+ fprintf_filtered (stb,
+ _("\tInferior %d [%s] will be killed.\n"), inf->num,
+ target_pid_to_str (pid_to_ptid (inf->pid)));
return 0;
}
-/* Callback for iterate_over_inferiors. Kills or detaches the given
- inferior, depending on how we originally gained control of it. */
+/* If necessary, make the user confirm that we should quit. Return
+ non-zero if we should quit, zero if we shouldn't. */
-static int
-kill_or_detach (struct inferior *inf, void *args)
+int
+quit_confirm (void)
{
- struct qt_args *qt = args;
- struct thread_info *thread;
+ struct ui_file *stb;
+ struct cleanup *old_chain;
+ char *str;
+ int qr;
+
+ /* Don't even ask if we're only debugging a core file inferior. */
+ if (!have_live_inferiors ())
+ return 1;
+
+ /* Build the query string as a single string. */
+ stb = mem_fileopen ();
+ old_chain = make_cleanup_ui_file_delete (stb);
- thread = iterate_over_threads (any_thread_of, &inf->pid);
- if (thread)
+ /* This is something of a hack. But there's no reliable way to see
+ if a GUI is running. The `use_windows' variable doesn't cut
+ it. */
+ if (deprecated_init_ui_hook)
+ fprintf_filtered (stb, _("A debugging session is active.\n"
+ "Do you still want to close the debugger?"));
+ else
{
- switch_to_thread (thread->ptid);
- if (inf->attach_flag)
- target_detach (qt->args, qt->from_tty);
- else
- target_kill ();
+ fprintf_filtered (stb, _("A debugging session is active.\n\n"));
+ iterate_over_inferiors (print_inferior_quit_action, stb);
+ fprintf_filtered (stb, _("\nQuit anyway? "));
}
- return 0;
+ str = ui_file_xstrdup (stb, NULL);
+ make_cleanup (xfree, str);
+
+ qr = query ("%s", str);
+ do_cleanups (old_chain);
+ return qr;
}
/* Helper routine for quit_force that requires error handling. */
struct qt_args *qt = (struct qt_args *)arg;
/* Kill or detach all inferiors. */
- if (target_has_execution)
- iterate_over_inferiors (kill_or_detach, qt);
+ iterate_over_inferiors (kill_or_detach, qt);
/* Give all pushed targets a chance to do minimal cleanup, and pop
them all out. */
tmpenv = getenv ("GDBHISTFILE");
if (tmpenv)
- history_filename = savestring (tmpenv, strlen (tmpenv));
+ history_filename = xstrdup (tmpenv);
else if (!history_filename)
{
/* We include the current directory so that if the user changes
whatever the DEFAULT_PROMPT is. */
the_prompts.top = 0;
PREFIX (0) = "";
- PROMPT (0) = savestring (DEFAULT_PROMPT, strlen (DEFAULT_PROMPT));
+ PROMPT (0) = xstrdup (DEFAULT_PROMPT);
SUFFIX (0) = "";
/* Set things up for annotation_level > 1, if the user ever decides
to use it. */
async_annotation_suffix = "prompt";
/* Set the variable associated with the setshow prompt command. */
- new_async_prompt = savestring (PROMPT (0), strlen (PROMPT (0)));
+ new_async_prompt = xstrdup (PROMPT (0));
/* If gdb was started with --annotate=2, this is equivalent to the
user entering the command 'set annotate 2' at the gdb prompt, so