diff options
author | Daniel Jacobowitz <drow@false.org> | 2003-06-17 20:28:14 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2003-06-17 20:28:14 +0000 |
commit | 6ad8ae5c579e2e6198870b21d10459edba9457ca (patch) | |
tree | 9d71b7266e55d4d44bf3a28736465e9f2d7132bc /gdb/gdbserver/server.c | |
parent | 687595f963bb32dd89d85bdf91e7ca6aa3187502 (diff) | |
download | gdb-6ad8ae5c579e2e6198870b21d10459edba9457ca.zip gdb-6ad8ae5c579e2e6198870b21d10459edba9457ca.tar.gz gdb-6ad8ae5c579e2e6198870b21d10459edba9457ca.tar.bz2 |
gdb/
* NEWS: Mention gdbserver detach change and "disconnect" command.
* infcmd.c (disconnect_command): New function.
(_initialize_infcmd): Add ``disconnect'' command.
* remote.c (remote_async_detach): Delete.
(remote_detach): Merge remote_async_detach.
(remote_disconnect): New.
(init_remote_ops): Set to_disconnect.
(init_remote_cisco_ops): Likewise.
(init_remote_async_ops): Likewise. Use remote_detach.
* target.c (cleanup_target): Default to_disconnect.
(update_current_target): Inherit to_disconnect.
(target_disconnect, debug_to_disconnect): New functions.
(setup_target_debug): Set to_disconnect.
* target.h (struct target_ops): Add to_disconnect.
(target_disconnect): Add prototype.
gdbserver/
* linux-low.c: Move comment to linux_thread_alive where it belonged.
(linux_detach_one_process, linux_detach): New functions.
(linux_target_ops): Add linux_detach.
* server.c (main): Handle 'D' packet.
* target.h (struct target_ops): Add "detach" member.
(detach_inferior): Define.
mi/
* mi-cmds.c (mi_cmds): Add "-target-disconnect".
Diffstat (limited to 'gdb/gdbserver/server.c')
-rw-r--r-- | gdb/gdbserver/server.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index d0963ba..81fde5b 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -217,6 +217,28 @@ main (int argc, char *argv[]) case 'd': remote_debug = !remote_debug; break; + case 'D': + fprintf (stderr, "Detaching from inferior\n"); + detach_inferior (); + write_ok (own_buf); + putpkt (own_buf); + remote_close (); + + /* If we are attached, then we can exit. Otherwise, we need to + hang around doing nothing, until the child is gone. */ + if (!attached) + { + int status, ret; + + do { + ret = waitpid (signal_pid, &status, 0); + if (WIFEXITED (status) || WIFSIGNALED (status)) + break; + } while (ret != -1 || errno != ECHILD); + } + + exit (0); + case '!': if (attached == 0) { |