From patchwork Tue May 5 20:14:57 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriel Corona X-Patchwork-Id: 6572 Received: (qmail 110172 invoked by alias); 5 May 2015 20:16:01 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 110157 invoked by uid 89); 5 May 2015 20:16:00 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, 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; Tue, 05 May 2015 20:15:59 +0000 Received: from localhost.localdomain (unknown [81.56.99.41]) by smtp1-g21.free.fr (Postfix) with ESMTP id 0BD2F940008; Tue, 5 May 2015 22:13:07 +0200 (CEST) From: Gabriel Corona To: gdb-patches@sourceware.org Cc: Gabriel Corona Subject: [PATCH 2/2] Make gdbserver connect to SOCK_STREAM sockets Date: Tue, 5 May 2015 22:14:57 +0200 Message-Id: <1430856897-12051-2-git-send-email-gabriel.corona@enst-bretagne.fr> In-Reply-To: <1430856897-12051-1-git-send-email-gabriel.corona@enst-bretagne.fr> References: <1430856897-12051-1-git-send-email-gabriel.corona@enst-bretagne.fr> X-IsSubscribed: yes In GDB: (gdb) target remote |socat STDIO UNIX-LISTEN:foo.sock In gdbserver: $ gdbserver foo.sock ./foo gdb/gdbserver/ChangeLog: * remote-utils.c: add support for connecting to a SOCK_STREAM socket * remote.c: add documentation about this feature --- gdb/gdbserver/remote-utils.c | 42 ++++++++++++++++++++++++++++++++++++++++-- gdb/gdbserver/server.c | 1 + 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index adf6d25..e2ba326 100644 --- a/gdb/gdbserver/remote-utils.c +++ b/gdb/gdbserver/remote-utils.c @@ -36,6 +36,9 @@ #if HAVE_SYS_SOCKET_H #include #endif +#if HAVE_SYS_UN_H +#include +#endif #if HAVE_NETDB_H #include #endif @@ -344,6 +347,33 @@ open_shell_command (const char *command) } #endif +#ifndef USE_WIN32API +static int +socket_open (const char *name) +{ + int sock; + struct sockaddr_un addr; + + if (strlen (name) >= sizeof (addr.sun_path)) + return -1; + + sock = socket (AF_UNIX, SOCK_STREAM, 0); + if (sock < 0) + return -1; + + addr.sun_family = AF_UNIX; + strcpy (addr.sun_path, name); + if (connect (sock, (const struct sockaddr *) &addr, + sizeof (struct sockaddr_un)) < 0) + { + close (sock); + return -1; + } + + return sock; +} +#endif + /* Open a connection to a remote debugger. NAME is the filename used for communication. */ @@ -386,10 +416,18 @@ remote_open (char *name) else if (port_str == NULL) { struct stat statbuf; + int res; - if (stat (name, &statbuf) == 0 + res = stat (name, &statbuf); + if (res == 0 && (S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode))) - remote_desc = open (name, O_RDWR); + { + remote_desc = open (name, O_RDWR); + } + else if (res == 0 && S_ISSOCK (statbuf.st_mode)) + { + remote_desc = socket_open (name); + } else { errno = EINVAL; diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 9ed4049..675f9a5 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -3037,6 +3037,7 @@ gdbserver_usage (FILE *stream) "\tgdbserver [OPTIONS] --multi COMM\n" "\n" "COMM may be a tty device (for serial debugging),\n" + "an existing pathname stream-oriented socket,\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"