From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 68500 invoked by alias); 2 May 2015 22:40:21 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 68486 invoked by uid 89); 2 May 2015 22:40:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_LOW,SPF_NEUTRAL autolearn=ham version=3.3.2 X-HELO: smtp1-g21.free.fr Received: from smtp1-g21.free.fr (HELO smtp1-g21.free.fr) (212.27.42.1) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Sat, 02 May 2015 22:40:18 +0000 Received: from localhost.localdomain (unknown [81.56.99.41]) by smtp1-g21.free.fr (Postfix) with ESMTP id 6E67C940063; Sun, 3 May 2015 00:37:30 +0200 (CEST) From: Gabriel Corona To: gdb-patches@sourceware.org Cc: Gabriel Corona Subject: [PATCH] Use a shell command as a socket for gdbserver Date: Sat, 02 May 2015 22:40:00 -0000 Message-Id: <1430606377-16456-1-git-send-email-gabriel.corona@enst-bretagne.fr> X-SW-Source: 2015-05/txt/msg00019.txt.bz2 This brings feature parity with gdb in this regard. This can be used to do gdbserver over unix socket (without redirecting the inferior stdio to /dev/null): $ gdbserver '|socat STDIO UNIX-LISTEN:foo.sock' ./foo and in gdb: (gdb) target remote |socat STDIO UNIX:foo.sock Altneratively, we can initiate a connection to a remote server: $ gdbserver '|socat STDIO TCP:gdb.example.com:9000' ./foo gdb/gdbserver/ChangeLog: * remote-utils.c: add support for using a shell command stdio as COMM * remote.c: add documentation about this feature --- gdb/gdbserver/remote-utils.c | 63 ++++++++++++++++++++++++++++++++++++++++++++ gdb/gdbserver/server.c | 3 ++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index 1de86be..6d88968 100644 --- a/gdb/gdbserver/remote-utils.c +++ b/gdb/gdbserver/remote-utils.c @@ -58,6 +58,8 @@ #endif #include +#include "gdb_wait.h" + #if USE_WIN32API #include #endif @@ -239,6 +241,14 @@ remote_prepare (char *name) return; } +#ifndef USE_WIN32API + if (name[0] == '|') + { + transport_is_reliable = 1; + return; + } +#endif + port_str = strchr (name, ':'); if (port_str == NULL) { @@ -280,6 +290,48 @@ remote_prepare (char *name) transport_is_reliable = 1; } +#ifndef USE_WIN32API +static int open_shell_command(char* command) +{ + int sockets[2]; + int res; + pid_t child, pid; + + res = socketpair(AF_LOCAL, SOCK_STREAM, 0, sockets); + if (res < 0) + error ("Could not get socketpair."); + child = fork(); + if (child < 0) + { + error ("Could not fork."); + } + else if (child == 0) + { + if (close (sockets[0]) < 0) + exit (1); + if (dup2 (sockets[1], 0) < 0 || dup2 (sockets[1], 1) < 0) + exit (1); + res = fork (); + if (res < 0) + exit (1); + if (res != 0) + exit (0); + execl ("/bin/sh", "sh", "-c", command, NULL); + exit (1); + } + else + { + signal (SIGPIPE, SIG_IGN); + while ((pid = waitpid (child, NULL, 0)) < 0 && errno == EINTR); + if (pid < 0) + error ("Could not wait for child."); + close (sockets[1]); + return sockets[0]; + } + return -1; +} +#endif + /* Open a connection to a remote debugger. NAME is the filename used for communication. */ @@ -288,6 +340,17 @@ remote_open (char *name) { char *port_str; +#ifndef USE_WIN32API + if (name[0] == '|') + { + fprintf (stderr, "Remote debugging using shell command\n"); + remote_desc = open_shell_command (name + 1); + enable_async_notification (remote_desc); + add_file_handler (remote_desc, handle_serial_event, NULL); + return; + } +#endif + port_str = strchr (name, ':'); #ifdef USE_WIN32API if (port_str == NULL) diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index d2e20d9..9ed4049 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -3036,7 +3036,8 @@ gdbserver_usage (FILE *stream) "\tgdbserver [OPTIONS] --attach COMM PID\n" "\tgdbserver [OPTIONS] --multi COMM\n" "\n" - "COMM may either be a tty device (for serial debugging),\n" + "COMM may be a tty device (for serial debugging),\n" + "'|some shell command' to use stdin/stdout of a given shell command,\n" "HOST:PORT to listen for a TCP connection, or '-' or 'stdio' to use \n" "stdin/stdout of gdbserver.\n" "PROG is the executable program. ARGS are arguments passed to inferior.\n" -- 2.1.4