public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* Local domain sockets (take 3)
@ 2018-09-05 15:27 John Darrington
  2018-09-05 15:27 ` [PATCH] Allow remote debugging over a Unix local domain socket John Darrington
  0 siblings, 1 reply; 13+ messages in thread
From: John Darrington @ 2018-09-05 15:27 UTC (permalink / raw)
  To: gdb-patches


Here is another version of the patch, taking into account Pedro's 
concerns.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-05 15:27 Local domain sockets (take 3) John Darrington
@ 2018-09-05 15:27 ` John Darrington
  2018-09-23  4:58   ` John Darrington
  2018-10-01 20:02   ` Pedro Alves
  0 siblings, 2 replies; 13+ messages in thread
From: John Darrington @ 2018-09-05 15:27 UTC (permalink / raw)
  To: gdb-patches; +Cc: John Darrington

Extend the "target remote" and "target extended-remote" commands
such that if the filename provided is a Unix local domain (AF_UNIX)
socket, then it'll be treated as such, instead of trying to open
it as if it were a character device.

gdb/ChangeLog:
	* NEWS: Mention changed commands.
	* ser-local.c: New file.
	* configure.ac (SER_HARDWIRE): Add ser-local.o.
	* Makefile.in: Add new file.
	* serial.c (serial_open): Check if filename is a socket
	  and lookup the appropriate interface accordingly.

gdb/doc/ChangeLog:
	* gdb.texinfo (Remote Connection Commands):  Describe
	  the changes to target remote and target extended-remote
	  relating to Unix domain sockets.
---
 gdb/Makefile.in     |   1 +
 gdb/NEWS            |   5 +++
 gdb/configure       |   1 +
 gdb/configure.ac    |   1 +
 gdb/doc/gdb.texinfo |  22 +++++++++-
 gdb/ser-local.c     | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/serial.c        |  12 +++++-
 7 files changed, 156 insertions(+), 2 deletions(-)
 create mode 100644 gdb/ser-local.c

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 118c3c8062..39bbe9be88 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -2323,6 +2323,7 @@ ALLDEPFILES = \
 	ser-go32.c \
 	ser-mingw.c \
 	ser-pipe.c \
+	ser-local.c \
 	ser-tcp.c \
 	sh-nbsd-nat.c \
 	sh-nbsd-tdep.c \
diff --git a/gdb/NEWS b/gdb/NEWS
index a7a3674375..e5926897a0 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -36,6 +36,11 @@ maint show dwarf unwinders
 
 * Changed commands
 
+target remote FILENAME
+target extended-remote FILENAME
+  If FILENAME is a Unix domain socket, GDB will attempt to connect
+  to this socket instead of opening FILENAME as a character device.
+
 thread apply [all | COUNT | -COUNT] [FLAG]... COMMAND
   The 'thread apply' command accepts new FLAG arguments.
   FLAG arguments allow to control what output to produce and how to handle
diff --git a/gdb/configure b/gdb/configure
index 9cd0036848..95f246d013 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -15586,6 +15586,7 @@ case ${host} in
   *go32* ) SER_HARDWIRE=ser-go32.o ;;
   *djgpp* ) SER_HARDWIRE=ser-go32.o ;;
   *mingw32*) SER_HARDWIRE="ser-base.o ser-tcp.o ser-mingw.o" ;;
+  *) SER_HARDWIRE="$SER_HARDWIRE ser-local.o" ;;
 esac
 
 
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 13bc5f9a8f..9a919eaa1e 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -1875,6 +1875,7 @@ case ${host} in
   *go32* ) SER_HARDWIRE=ser-go32.o ;;
   *djgpp* ) SER_HARDWIRE=ser-go32.o ;;
   *mingw32*) SER_HARDWIRE="ser-base.o ser-tcp.o ser-mingw.o" ;;
+  *) SER_HARDWIRE="$SER_HARDWIRE ser-local.o" ;;
 esac
 AC_SUBST(SER_HARDWIRE)
 
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 5068c0ac81..dae62c1787 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -20703,7 +20703,8 @@ programs.
 
 @subsection Remote Connection Commands
 @cindex remote connection commands
-@value{GDBN} can communicate with the target over a serial line, or
+@value{GDBN} can communicate with the target over a serial line, a
+local Unix domain socket, or
 over an @acronym{IP} network using @acronym{TCP} or @acronym{UDP}.  In
 each case, @value{GDBN} uses the same protocol for debugging your
 program; only the medium carrying the debugging packets varies.  The
@@ -20728,6 +20729,25 @@ If you're using a serial line, you may want to give @value{GDBN} the
 (@pxref{Remote Configuration, set serial baud}) before the
 @code{target} command.
 
+
+@item target remote @var{local-socket}
+@itemx target extended-remote @var{local-socket}
+@cindex local socket, @code{target remote}
+@cindex Unix domain socket
+Use @var{local-socket} to communicate with the target.  For example,
+to use a local Unix domain socket bound to the file system entry @file{/tmp/gdb-socket0}:
+
+@smallexample
+target remote /tmp/gdb-socket0
+@end smallexample
+
+Note that this command has the same form as the command to connect
+to a serial line.  @value{GDBN} will automatically determine which
+kind of file you have specified and will make the appropriate kind
+of connection.
+This feature is not available if the host system does not support
+Unix domain sockets.
+
 @item target remote @code{@var{host}:@var{port}}
 @itemx target remote @code{@var{[host]}:@var{port}}
 @itemx target remote @code{tcp:@var{host}:@var{port}}
diff --git a/gdb/ser-local.c b/gdb/ser-local.c
new file mode 100644
index 0000000000..a3b8248ae5
--- /dev/null
+++ b/gdb/ser-local.c
@@ -0,0 +1,116 @@
+/* Serial interface for local domain connections on Un*x like systems.
+
+   Copyright (C) 1992-2018 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "defs.h"
+#include "serial.h"
+#include "ser-base.h"
+
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#ifndef UNIX_PATH_MAX
+#define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path)
+#endif
+
+/* Open a AF_UNIX socket.  */
+int
+local_open (struct serial *scb, const char *name)
+{
+  struct sockaddr_un addr;
+
+  if (strlen(name) > UNIX_PATH_MAX - 1)
+    {
+      warning (_("The socket name is too long.  It may be no longer than %zu bytes."),
+               UNIX_PATH_MAX - 1L);
+      return -1;
+    }
+
+  memset (&addr, 0, sizeof addr);
+  addr.sun_family = AF_UNIX;
+  strncpy (addr.sun_path, name, UNIX_PATH_MAX - 1);
+
+  int sock = socket (AF_UNIX, SOCK_STREAM, 0);
+
+  if (connect (sock, (struct sockaddr *) &addr,
+	       sizeof (struct sockaddr_un)) < 0)
+    {
+      close (sock);
+      scb->fd = -1;
+      return -1;
+    }
+
+  scb->fd = sock;
+
+  return 0;
+}
+
+void
+local_close (struct serial *scb)
+{
+  if (scb->fd == -1)
+    return;
+
+  close (scb->fd);
+  scb->fd = -1;
+}
+
+static int
+local_read_prim (struct serial *scb, size_t count)
+{
+  return recv (scb->fd, scb->buf, count, 0);
+}
+
+static int
+local_write_prim (struct serial *scb, const void *buf, size_t count)
+{
+  return send (scb->fd, buf, count, 0);
+}
+
+/* The local socket ops.  */
+
+static const struct serial_ops local_ops =
+{
+  "local",
+  local_open,
+  local_close,
+  NULL,
+  ser_base_readchar,
+  ser_base_write,
+  ser_base_flush_output,
+  ser_base_flush_input,
+  ser_base_send_break,
+  ser_base_raw,
+  ser_base_get_tty_state,
+  ser_base_copy_tty_state,
+  ser_base_set_tty_state,
+  ser_base_print_tty_state,
+  ser_base_setbaudrate,
+  ser_base_setstopbits,
+  ser_base_setparity,
+  ser_base_drain_output,
+  ser_base_async,
+  local_read_prim,
+  local_write_prim
+};
+
+void
+_initialize_ser_socket (void)
+{
+  serial_add_interface (&local_ops);
+}
diff --git a/gdb/serial.c b/gdb/serial.c
index fb2b212918..c04e011012 100644
--- a/gdb/serial.c
+++ b/gdb/serial.c
@@ -213,7 +213,17 @@ serial_open (const char *name)
   else if (strchr (name, ':'))
     ops = serial_interface_lookup ("tcp");
   else
-    ops = serial_interface_lookup ("hardwire");
+    {
+#ifndef USE_WIN32API
+      /* Check to see if name is a socket.  If it is, then treat it
+         as such.  Otherwise assume that it's a character device.  */
+      struct stat sb;
+      if (0 == stat (name, &sb) && ((sb.st_mode & S_IFMT) == S_IFSOCK))
+	ops = serial_interface_lookup ("local");
+      else
+#endif
+	ops = serial_interface_lookup ("hardwire");
+    }
 
   if (!ops)
     return NULL;
-- 
2.11.0

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-05 15:27 ` [PATCH] Allow remote debugging over a Unix local domain socket John Darrington
@ 2018-09-23  4:58   ` John Darrington
  2018-09-23  6:01     ` Eli Zaretskii
  2018-10-01 20:02   ` Pedro Alves
  1 sibling, 1 reply; 13+ messages in thread
From: John Darrington @ 2018-09-23  4:58 UTC (permalink / raw)
  To: John Darrington; +Cc: gdb-patches

Ping!

On Wed, Sep 05, 2018 at 05:26:56PM +0200, John Darrington wrote:
     Extend the "target remote" and "target extended-remote" commands
     such that if the filename provided is a Unix local domain (AF_UNIX)
     socket, then it'll be treated as such, instead of trying to open
     it as if it were a character device.
     
     gdb/ChangeLog:
     	* NEWS: Mention changed commands.
     	* ser-local.c: New file.
     	* configure.ac (SER_HARDWIRE): Add ser-local.o.
     	* Makefile.in: Add new file.
     	* serial.c (serial_open): Check if filename is a socket
     	  and lookup the appropriate interface accordingly.
     
     gdb/doc/ChangeLog:
     	* gdb.texinfo (Remote Connection Commands):  Describe
     	  the changes to target remote and target extended-remote
     	  relating to Unix domain sockets.
     ---
      gdb/Makefile.in     |   1 +
      gdb/NEWS            |   5 +++
      gdb/configure       |   1 +
      gdb/configure.ac    |   1 +
      gdb/doc/gdb.texinfo |  22 +++++++++-
      gdb/ser-local.c     | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++
      gdb/serial.c        |  12 +++++-
      7 files changed, 156 insertions(+), 2 deletions(-)
      create mode 100644 gdb/ser-local.c
     
     diff --git a/gdb/Makefile.in b/gdb/Makefile.in
     index 118c3c8062..39bbe9be88 100644
     --- a/gdb/Makefile.in
     +++ b/gdb/Makefile.in
     @@ -2323,6 +2323,7 @@ ALLDEPFILES = \
      	ser-go32.c \
      	ser-mingw.c \
      	ser-pipe.c \
     +	ser-local.c \
      	ser-tcp.c \
      	sh-nbsd-nat.c \
      	sh-nbsd-tdep.c \
     diff --git a/gdb/NEWS b/gdb/NEWS
     index a7a3674375..e5926897a0 100644
     --- a/gdb/NEWS
     +++ b/gdb/NEWS
     @@ -36,6 +36,11 @@ maint show dwarf unwinders
      
      * Changed commands
      
     +target remote FILENAME
     +target extended-remote FILENAME
     +  If FILENAME is a Unix domain socket, GDB will attempt to connect
     +  to this socket instead of opening FILENAME as a character device.
     +
      thread apply [all | COUNT | -COUNT] [FLAG]... COMMAND
        The 'thread apply' command accepts new FLAG arguments.
        FLAG arguments allow to control what output to produce and how to handle
     diff --git a/gdb/configure b/gdb/configure
     index 9cd0036848..95f246d013 100755
     --- a/gdb/configure
     +++ b/gdb/configure
     @@ -15586,6 +15586,7 @@ case ${host} in
        *go32* ) SER_HARDWIRE=ser-go32.o ;;
        *djgpp* ) SER_HARDWIRE=ser-go32.o ;;
        *mingw32*) SER_HARDWIRE="ser-base.o ser-tcp.o ser-mingw.o" ;;
     +  *) SER_HARDWIRE="$SER_HARDWIRE ser-local.o" ;;
      esac
      
      
     diff --git a/gdb/configure.ac b/gdb/configure.ac
     index 13bc5f9a8f..9a919eaa1e 100644
     --- a/gdb/configure.ac
     +++ b/gdb/configure.ac
     @@ -1875,6 +1875,7 @@ case ${host} in
        *go32* ) SER_HARDWIRE=ser-go32.o ;;
        *djgpp* ) SER_HARDWIRE=ser-go32.o ;;
        *mingw32*) SER_HARDWIRE="ser-base.o ser-tcp.o ser-mingw.o" ;;
     +  *) SER_HARDWIRE="$SER_HARDWIRE ser-local.o" ;;
      esac
      AC_SUBST(SER_HARDWIRE)
      
     diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
     index 5068c0ac81..dae62c1787 100644
     --- a/gdb/doc/gdb.texinfo
     +++ b/gdb/doc/gdb.texinfo
     @@ -20703,7 +20703,8 @@ programs.
      
      @subsection Remote Connection Commands
      @cindex remote connection commands
     -@value{GDBN} can communicate with the target over a serial line, or
     +@value{GDBN} can communicate with the target over a serial line, a
     +local Unix domain socket, or
      over an @acronym{IP} network using @acronym{TCP} or @acronym{UDP}.  In
      each case, @value{GDBN} uses the same protocol for debugging your
      program; only the medium carrying the debugging packets varies.  The
     @@ -20728,6 +20729,25 @@ If you're using a serial line, you may want to give @value{GDBN} the
      (@pxref{Remote Configuration, set serial baud}) before the
      @code{target} command.
      
     +
     +@item target remote @var{local-socket}
     +@itemx target extended-remote @var{local-socket}
     +@cindex local socket, @code{target remote}
     +@cindex Unix domain socket
     +Use @var{local-socket} to communicate with the target.  For example,
     +to use a local Unix domain socket bound to the file system entry @file{/tmp/gdb-socket0}:
     +
     +@smallexample
     +target remote /tmp/gdb-socket0
     +@end smallexample
     +
     +Note that this command has the same form as the command to connect
     +to a serial line.  @value{GDBN} will automatically determine which
     +kind of file you have specified and will make the appropriate kind
     +of connection.
     +This feature is not available if the host system does not support
     +Unix domain sockets.
     +
      @item target remote @code{@var{host}:@var{port}}
      @itemx target remote @code{@var{[host]}:@var{port}}
      @itemx target remote @code{tcp:@var{host}:@var{port}}
     diff --git a/gdb/ser-local.c b/gdb/ser-local.c
     new file mode 100644
     index 0000000000..a3b8248ae5
     --- /dev/null
     +++ b/gdb/ser-local.c
     @@ -0,0 +1,116 @@
     +/* Serial interface for local domain connections on Un*x like systems.
     +
     +   Copyright (C) 1992-2018 Free Software Foundation, Inc.
     +
     +   This file is part of GDB.
     +
     +   This program is free software; you can redistribute it and/or modify
     +   it under the terms of the GNU General Public License as published by
     +   the Free Software Foundation; either version 3 of the License, or
     +   (at your option) any later version.
     +
     +   This program is distributed in the hope that it will be useful,
     +   but WITHOUT ANY WARRANTY; without even the implied warranty of
     +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     +   GNU General Public License for more details.
     +
     +   You should have received a copy of the GNU General Public License
     +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     +
     +#include "defs.h"
     +#include "serial.h"
     +#include "ser-base.h"
     +
     +#include <sys/socket.h>
     +#include <sys/un.h>
     +
     +#ifndef UNIX_PATH_MAX
     +#define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path)
     +#endif
     +
     +/* Open a AF_UNIX socket.  */
     +int
     +local_open (struct serial *scb, const char *name)
     +{
     +  struct sockaddr_un addr;
     +
     +  if (strlen(name) > UNIX_PATH_MAX - 1)
     +    {
     +      warning (_("The socket name is too long.  It may be no longer than %zu bytes."),
     +               UNIX_PATH_MAX - 1L);
     +      return -1;
     +    }
     +
     +  memset (&addr, 0, sizeof addr);
     +  addr.sun_family = AF_UNIX;
     +  strncpy (addr.sun_path, name, UNIX_PATH_MAX - 1);
     +
     +  int sock = socket (AF_UNIX, SOCK_STREAM, 0);
     +
     +  if (connect (sock, (struct sockaddr *) &addr,
     +	       sizeof (struct sockaddr_un)) < 0)
     +    {
     +      close (sock);
     +      scb->fd = -1;
     +      return -1;
     +    }
     +
     +  scb->fd = sock;
     +
     +  return 0;
     +}
     +
     +void
     +local_close (struct serial *scb)
     +{
     +  if (scb->fd == -1)
     +    return;
     +
     +  close (scb->fd);
     +  scb->fd = -1;
     +}
     +
     +static int
     +local_read_prim (struct serial *scb, size_t count)
     +{
     +  return recv (scb->fd, scb->buf, count, 0);
     +}
     +
     +static int
     +local_write_prim (struct serial *scb, const void *buf, size_t count)
     +{
     +  return send (scb->fd, buf, count, 0);
     +}
     +
     +/* The local socket ops.  */
     +
     +static const struct serial_ops local_ops =
     +{
     +  "local",
     +  local_open,
     +  local_close,
     +  NULL,
     +  ser_base_readchar,
     +  ser_base_write,
     +  ser_base_flush_output,
     +  ser_base_flush_input,
     +  ser_base_send_break,
     +  ser_base_raw,
     +  ser_base_get_tty_state,
     +  ser_base_copy_tty_state,
     +  ser_base_set_tty_state,
     +  ser_base_print_tty_state,
     +  ser_base_setbaudrate,
     +  ser_base_setstopbits,
     +  ser_base_setparity,
     +  ser_base_drain_output,
     +  ser_base_async,
     +  local_read_prim,
     +  local_write_prim
     +};
     +
     +void
     +_initialize_ser_socket (void)
     +{
     +  serial_add_interface (&local_ops);
     +}
     diff --git a/gdb/serial.c b/gdb/serial.c
     index fb2b212918..c04e011012 100644
     --- a/gdb/serial.c
     +++ b/gdb/serial.c
     @@ -213,7 +213,17 @@ serial_open (const char *name)
        else if (strchr (name, ':'))
          ops = serial_interface_lookup ("tcp");
        else
     -    ops = serial_interface_lookup ("hardwire");
     +    {
     +#ifndef USE_WIN32API
     +      /* Check to see if name is a socket.  If it is, then treat it
     +         as such.  Otherwise assume that it's a character device.  */
     +      struct stat sb;
     +      if (0 == stat (name, &sb) && ((sb.st_mode & S_IFMT) == S_IFSOCK))
     +	ops = serial_interface_lookup ("local");
     +      else
     +#endif
     +	ops = serial_interface_lookup ("hardwire");
     +    }
      
        if (!ops)
          return NULL;
     -- 
     2.11.0

-- 
Avoid eavesdropping.  Send strong encrypted email.
PGP Public key ID: 1024D/2DE827B3 
fingerprint = 8797 A26D 0854 2EAB 0285  A290 8A67 719C 2DE8 27B3
See http://sks-keyservers.net or any PGP keyserver for public key.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-23  4:58   ` John Darrington
@ 2018-09-23  6:01     ` Eli Zaretskii
  0 siblings, 0 replies; 13+ messages in thread
From: Eli Zaretskii @ 2018-09-23  6:01 UTC (permalink / raw)
  To: John Darrington; +Cc: gdb-patches

> Date: Sun, 23 Sep 2018 06:58:10 +0200
> From: John Darrington <john@darrington.wattle.id.au>
> Cc: gdb-patches@sourceware.org
> 
> Ping!

Sorry for the delay.  The documentation parts are approved.

Thanks.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-05 15:27 ` [PATCH] Allow remote debugging over a Unix local domain socket John Darrington
  2018-09-23  4:58   ` John Darrington
@ 2018-10-01 20:02   ` Pedro Alves
  1 sibling, 0 replies; 13+ messages in thread
From: Pedro Alves @ 2018-10-01 20:02 UTC (permalink / raw)
  To: John Darrington, gdb-patches

On 09/05/2018 04:26 PM, John Darrington wrote:
> Extend the "target remote" and "target extended-remote" commands
> such that if the filename provided is a Unix local domain (AF_UNIX)
> socket, then it'll be treated as such, instead of trying to open
> it as if it were a character device.
> 
> gdb/ChangeLog:
> 	* NEWS: Mention changed commands.
> 	* ser-local.c: New file.
> 	* configure.ac (SER_HARDWIRE): Add ser-local.o.
> 	* Makefile.in: Add new file.
> 	* serial.c (serial_open): Check if filename is a socket
> 	  and lookup the appropriate interface accordingly.

Add:
	* configure: Regenerate.

> 
> gdb/doc/ChangeLog:
> 	* gdb.texinfo (Remote Connection Commands):  Describe

Spurious double space.

> 	  the changes to target remote and target extended-remote
> 	  relating to Unix domain sockets.
> ---
>  gdb/Makefile.in     |   1 +
>  gdb/NEWS            |   5 +++
>  gdb/configure       |   1 +
>  gdb/configure.ac    |   1 +
>  gdb/doc/gdb.texinfo |  22 +++++++++-
>  gdb/ser-local.c     | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  gdb/serial.c        |  12 +++++-
>  7 files changed, 156 insertions(+), 2 deletions(-)
>  create mode 100644 gdb/ser-local.c
> 
> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index 118c3c8062..39bbe9be88 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -2323,6 +2323,7 @@ ALLDEPFILES = \
>  	ser-go32.c \
>  	ser-mingw.c \
>  	ser-pipe.c \
> +	ser-local.c \
>  	ser-tcp.c \
>  	sh-nbsd-nat.c \
>  	sh-nbsd-tdep.c \
> diff --git a/gdb/NEWS b/gdb/NEWS
> index a7a3674375..e5926897a0 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -36,6 +36,11 @@ maint show dwarf unwinders
>  
>  * Changed commands
>  
> +target remote FILENAME
> +target extended-remote FILENAME
> +  If FILENAME is a Unix domain socket, GDB will attempt to connect
> +  to this socket instead of opening FILENAME as a character device.
> +
>  thread apply [all | COUNT | -COUNT] [FLAG]... COMMAND
>    The 'thread apply' command accepts new FLAG arguments.
>    FLAG arguments allow to control what output to produce and how to handle
> diff --git a/gdb/configure b/gdb/configure
> index 9cd0036848..95f246d013 100755
> --- a/gdb/configure
> +++ b/gdb/configure
> @@ -15586,6 +15586,7 @@ case ${host} in
>    *go32* ) SER_HARDWIRE=ser-go32.o ;;
>    *djgpp* ) SER_HARDWIRE=ser-go32.o ;;
>    *mingw32*) SER_HARDWIRE="ser-base.o ser-tcp.o ser-mingw.o" ;;
> +  *) SER_HARDWIRE="$SER_HARDWIRE ser-local.o" ;;
>  esac
>  
>  
> diff --git a/gdb/configure.ac b/gdb/configure.ac
> index 13bc5f9a8f..9a919eaa1e 100644
> --- a/gdb/configure.ac
> +++ b/gdb/configure.ac
> @@ -1875,6 +1875,7 @@ case ${host} in
>    *go32* ) SER_HARDWIRE=ser-go32.o ;;
>    *djgpp* ) SER_HARDWIRE=ser-go32.o ;;
>    *mingw32*) SER_HARDWIRE="ser-base.o ser-tcp.o ser-mingw.o" ;;
> +  *) SER_HARDWIRE="$SER_HARDWIRE ser-local.o" ;;
>  esac
>  AC_SUBST(SER_HARDWIRE)
>  
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index 5068c0ac81..dae62c1787 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -20703,7 +20703,8 @@ programs.
>  
>  @subsection Remote Connection Commands
>  @cindex remote connection commands
> -@value{GDBN} can communicate with the target over a serial line, or
> +@value{GDBN} can communicate with the target over a serial line, a
> +local Unix domain socket, or
>  over an @acronym{IP} network using @acronym{TCP} or @acronym{UDP}.  In
>  each case, @value{GDBN} uses the same protocol for debugging your
>  program; only the medium carrying the debugging packets varies.  The
> @@ -20728,6 +20729,25 @@ If you're using a serial line, you may want to give @value{GDBN} the
>  (@pxref{Remote Configuration, set serial baud}) before the
>  @code{target} command.
>  
> +
> +@item target remote @var{local-socket}
> +@itemx target extended-remote @var{local-socket}
> +@cindex local socket, @code{target remote}
> +@cindex Unix domain socket
> +Use @var{local-socket} to communicate with the target.  For example,
> +to use a local Unix domain socket bound to the file system entry @file{/tmp/gdb-socket0}:
> +
> +@smallexample
> +target remote /tmp/gdb-socket0
> +@end smallexample
> +
> +Note that this command has the same form as the command to connect
> +to a serial line.  @value{GDBN} will automatically determine which
> +kind of file you have specified and will make the appropriate kind
> +of connection.
> +This feature is not available if the host system does not support
> +Unix domain sockets.
> +
>  @item target remote @code{@var{host}:@var{port}}
>  @itemx target remote @code{@var{[host]}:@var{port}}
>  @itemx target remote @code{tcp:@var{host}:@var{port}}
> diff --git a/gdb/ser-local.c b/gdb/ser-local.c
> new file mode 100644
> index 0000000000..a3b8248ae5
> --- /dev/null
> +++ b/gdb/ser-local.c
> @@ -0,0 +1,116 @@
> +/* Serial interface for local domain connections on Un*x like systems.
> +
> +   Copyright (C) 1992-2018 Free Software Foundation, Inc.
> +
> +   This file is part of GDB.
> +
> +   This program is free software; you can redistribute it and/or modify
> +   it under the terms of the GNU General Public License as published by
> +   the Free Software Foundation; either version 3 of the License, or
> +   (at your option) any later version.
> +
> +   This program is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +   GNU General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
> +
> +#include "defs.h"
> +#include "serial.h"
> +#include "ser-base.h"
> +
> +#include <sys/socket.h>
> +#include <sys/un.h>
> +
> +#ifndef UNIX_PATH_MAX
> +#define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path)
> +#endif
> +
> +/* Open a AF_UNIX socket.  */

"Open an", I suppose.  Add empty line between comment and function.

> +int
> +local_open (struct serial *scb, const char *name)

I think this can be static.

> +{
> +  struct sockaddr_un addr;
> +
> +  if (strlen(name) > UNIX_PATH_MAX - 1)

Space before open parens.

> +    {
> +      warning (_("The socket name is too long.  It may be no longer than %zu bytes."),

Too long line (over 80 cols).

> +               UNIX_PATH_MAX - 1L);

That %z potentially causes a warning on systems that _don't_ define
UNIX_PATH_MAX in terms of sizeof (and thus size_t).  Use %s with pulongest
instead.

> +      return -1;
> +    }
> +
> +  memset (&addr, 0, sizeof addr);
> +  addr.sun_family = AF_UNIX;
> +  strncpy (addr.sun_path, name, UNIX_PATH_MAX - 1);
> +
> +  int sock = socket (AF_UNIX, SOCK_STREAM, 0);
> +
> +  if (connect (sock, (struct sockaddr *) &addr,
> +	       sizeof (struct sockaddr_un)) < 0)
> +    {
> +      close (sock);
> +      scb->fd = -1;
> +      return -1;
> +    }
> +
> +  scb->fd = sock;
> +
> +  return 0;
> +}
> +
> +void
> +local_close (struct serial *scb)

Likewise, I think this can be static.


> +{
> +  if (scb->fd == -1)
> +    return;
> +
> +  close (scb->fd);
> +  scb->fd = -1;
> +}
> +
> +static int
> +local_read_prim (struct serial *scb, size_t count)
> +{
> +  return recv (scb->fd, scb->buf, count, 0);
> +}
> +
> +static int
> +local_write_prim (struct serial *scb, const void *buf, size_t count)
> +{
> +  return send (scb->fd, buf, count, 0);
> +}
> +
> +/* The local socket ops.  */
> +
> +static const struct serial_ops local_ops =
> +{
> +  "local",
> +  local_open,
> +  local_close,
> +  NULL,
> +  ser_base_readchar,
> +  ser_base_write,
> +  ser_base_flush_output,
> +  ser_base_flush_input,
> +  ser_base_send_break,
> +  ser_base_raw,
> +  ser_base_get_tty_state,
> +  ser_base_copy_tty_state,
> +  ser_base_set_tty_state,
> +  ser_base_print_tty_state,
> +  ser_base_setbaudrate,
> +  ser_base_setstopbits,
> +  ser_base_setparity,
> +  ser_base_drain_output,
> +  ser_base_async,
> +  local_read_prim,
> +  local_write_prim
> +};
> +
> +void
> +_initialize_ser_socket (void)
> +{
> +  serial_add_interface (&local_ops);
> +}
> diff --git a/gdb/serial.c b/gdb/serial.c
> index fb2b212918..c04e011012 100644
> --- a/gdb/serial.c
> +++ b/gdb/serial.c
> @@ -213,7 +213,17 @@ serial_open (const char *name)
>    else if (strchr (name, ':'))
>      ops = serial_interface_lookup ("tcp");
>    else
> -    ops = serial_interface_lookup ("hardwire");
> +    {
> +#ifndef USE_WIN32API
> +      /* Check to see if name is a socket.  If it is, then treat it
> +         as such.  Otherwise assume that it's a character device.  */
> +      struct stat sb;
> +      if (0 == stat (name, &sb) && ((sb.st_mode & S_IFMT) == S_IFSOCK))

We don't use that constant-on-left style in GDB.  GCC warns about
mistaken use of "=" anyway.  Redundant set of parens on the right
term (which we avoid).  Write:

      if (stat (name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFSOCK)


> +	ops = serial_interface_lookup ("local");
> +      else
> +#endif
> +	ops = serial_interface_lookup ("hardwire");
> +    }

Otherwise, and other than the naming thing discussed
on the other thread, this LGTM.

Really sorry for the delay, and thanks much for the patch.
Lack of UDS support has come up once in a while on IRC
over the years.  The workaround has been to use netcat
or something like it, if you needed it.

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-10-01 18:12           ` John Darrington
@ 2018-10-01 18:25             ` Pedro Alves
  0 siblings, 0 replies; 13+ messages in thread
From: Pedro Alves @ 2018-10-01 18:25 UTC (permalink / raw)
  To: John Darrington, Tom Tromey; +Cc: gdb-patches

On 10/01/2018 07:12 PM, John Darrington wrote:

> How much longer should I wait?
> 
> It's been four weeks since I posted this, and after several reminders
> Pedro has not said anything.    So I think it's reasonable to assume
> that either he doesn't see any more problems with this patch or that he
> believes any problems that there are, are too small to worry about.
> 
> It's not reasonable to wait indefinitely in case he does eventually
> have something to say.

September has been complicated.  After Cauldron, I was out of office the
whole of last week for an annual team meeting.  Looking at the patch now.

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-11  5:22         ` Tom Tromey
  2018-09-11  9:35           ` Pedro Alves
@ 2018-10-01 18:12           ` John Darrington
  2018-10-01 18:25             ` Pedro Alves
  1 sibling, 1 reply; 13+ messages in thread
From: John Darrington @ 2018-10-01 18:12 UTC (permalink / raw)
  To: Tom Tromey; +Cc: John Darrington, gdb-patches

On Mon, Sep 10, 2018 at 11:22:36PM -0600, Tom Tromey wrote:
     >>>>> "John" == John Darrington <john@darrington.wattle.id.au> writes:
     
     John> ... it seems that Pedro doesn't have anything more to say.   So I'll
     John> push this in the next day or two if he doesn't pipe up.
     
     No, please wait.
     This weekend was the GNU Cauldron.  He may be traveling.
     
     Tom

How much longer should I wait?

It's been four weeks since I posted this, and after several reminders
Pedro has not said anything.    So I think it's reasonable to assume
that either he doesn't see any more problems with this patch or that he
believes any problems that there are, are too small to worry about.

It's not reasonable to wait indefinitely in case he does eventually
have something to say.

J'

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-11  5:22         ` Tom Tromey
@ 2018-09-11  9:35           ` Pedro Alves
  2018-10-01 18:12           ` John Darrington
  1 sibling, 0 replies; 13+ messages in thread
From: Pedro Alves @ 2018-09-11  9:35 UTC (permalink / raw)
  To: Tom Tromey, John Darrington; +Cc: gdb-patches

On 09/11/2018 06:22 AM, Tom Tromey wrote:
>>>>>> "John" == John Darrington <john@darrington.wattle.id.au> writes:
> 
> John> ... it seems that Pedro doesn't have anything more to say.   So I'll
> John> push this in the next day or two if he doesn't pipe up.
> 
> No, please wait.
> This weekend was the GNU Cauldron.  He may be traveling.

Yes, I was.  Thanks for the patience.

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-11  5:20       ` John Darrington
@ 2018-09-11  5:22         ` Tom Tromey
  2018-09-11  9:35           ` Pedro Alves
  2018-10-01 18:12           ` John Darrington
  0 siblings, 2 replies; 13+ messages in thread
From: Tom Tromey @ 2018-09-11  5:22 UTC (permalink / raw)
  To: John Darrington; +Cc: Tom Tromey, gdb-patches

>>>>> "John" == John Darrington <john@darrington.wattle.id.au> writes:

John> ... it seems that Pedro doesn't have anything more to say.   So I'll
John> push this in the next day or two if he doesn't pipe up.

No, please wait.
This weekend was the GNU Cauldron.  He may be traveling.

Tom

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-08  4:22     ` John Darrington
@ 2018-09-11  5:20       ` John Darrington
  2018-09-11  5:22         ` Tom Tromey
  0 siblings, 1 reply; 13+ messages in thread
From: John Darrington @ 2018-09-11  5:20 UTC (permalink / raw)
  To: John Darrington; +Cc: Tom Tromey, gdb-patches

On Sat, Sep 08, 2018 at 06:21:58AM +0200, John Darrington wrote:
     On Fri, Sep 07, 2018 at 03:05:59PM -0600, Tom Tromey wrote:
          >>>>> "John" == John Darrington <john@darrington.wattle.id.au> writes:
          
          John> Extend the "target remote" and "target extended-remote" commands
          John> such that if the filename provided is a Unix local domain (AF_UNIX)
          John> socket, then it'll be treated as such, instead of trying to open
          John> it as if it were a character device.
          
          I think Pedro should have the final review on this, since he had more
          comments the last time around.
     
     Okay.  Pedro?
          

... it seems that Pedro doesn't have anything more to say.   So I'll
push this in the next day or two if he doesn't pipe up.

J'

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-07 21:06   ` Tom Tromey
@ 2018-09-08  4:22     ` John Darrington
  2018-09-11  5:20       ` John Darrington
  0 siblings, 1 reply; 13+ messages in thread
From: John Darrington @ 2018-09-08  4:22 UTC (permalink / raw)
  To: Tom Tromey; +Cc: John Darrington, gdb-patches

On Fri, Sep 07, 2018 at 03:05:59PM -0600, Tom Tromey wrote:
     >>>>> "John" == John Darrington <john@darrington.wattle.id.au> writes:
     
     John> Extend the "target remote" and "target extended-remote" commands
     John> such that if the filename provided is a Unix local domain (AF_UNIX)
     John> socket, then it'll be treated as such, instead of trying to open
     John> it as if it were a character device.
     
     I think Pedro should have the final review on this, since he had more
     comments the last time around.

Okay.  Pedro?
     
     John> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
     John> index 5068c0ac81..dae62c1787 100644
     John> --- a/gdb/doc/gdb.texinfo
     John> +++ b/gdb/doc/gdb.texinfo
     John> @@ -20703,7 +20703,8 @@ programs.
      
     John>  @code{target} command.
      
     John> +
     John> +@item target remote @var{local-socket}
     John> +@itemx target extended-remote @var{local-socket}
     
     That looked like one extra newline in there to me.
I will fix that.
     
     Now that there are 3 copies of this in gdb, it would be good to unify
     them somewhere in common/.

I agree.  But shouldn't that be the subject of a separate change?


J'

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-03 12:17 ` [PATCH] Allow remote debugging over a Unix local domain socket John Darrington
@ 2018-09-07 21:06   ` Tom Tromey
  2018-09-08  4:22     ` John Darrington
  0 siblings, 1 reply; 13+ messages in thread
From: Tom Tromey @ 2018-09-07 21:06 UTC (permalink / raw)
  To: John Darrington; +Cc: gdb-patches

>>>>> "John" == John Darrington <john@darrington.wattle.id.au> writes:

John> Extend the "target remote" and "target extended-remote" commands
John> such that if the filename provided is a Unix local domain (AF_UNIX)
John> socket, then it'll be treated as such, instead of trying to open
John> it as if it were a character device.

I think Pedro should have the final review on this, since he had more
comments the last time around.

John> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
John> index 5068c0ac81..dae62c1787 100644
John> --- a/gdb/doc/gdb.texinfo
John> +++ b/gdb/doc/gdb.texinfo
John> @@ -20703,7 +20703,8 @@ programs.
 
John>  @code{target} command.
 
John> +
John> +@item target remote @var{local-socket}
John> +@itemx target extended-remote @var{local-socket}

That looked like one extra newline in there to me.

John> +#ifndef UNIX_MAX_PATH
John> +# define UNIX_MAX_PATH 108
John> +#endif

As mentioned before, use the sizeof thing.
Now that there are 3 copies of this in gdb, it would be good to unify
them somewhere in common/.

I see:

./gdbserver/tracepoint.c6861:#define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path)
./common/agent.c131:#define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path)

The linux unix(7) man page has some stuff to say about the sizes.

In another message you said:

John> I thought posix required a minimum of 108.

I don't know, but if other platforms do it differently, then gdb has to
adapt to them and not just go by POSIX.

One alternative in these cases is to see if there is a gnulib module we
could use.

thanks,
Tom

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] Allow remote debugging over a Unix local domain socket.
  2018-09-03 12:17 Another version for review John Darrington
@ 2018-09-03 12:17 ` John Darrington
  2018-09-07 21:06   ` Tom Tromey
  0 siblings, 1 reply; 13+ messages in thread
From: John Darrington @ 2018-09-03 12:17 UTC (permalink / raw)
  To: gdb-patches; +Cc: John Darrington

Extend the "target remote" and "target extended-remote" commands
such that if the filename provided is a Unix local domain (AF_UNIX)
socket, then it'll be treated as such, instead of trying to open
it as if it were a character device.

gdb/ChangeLog:
	* NEWS: Mention changed commands.
	* configure.ac (SER_HARDWIRE): Add ser-socket.o.
	* ser-socket.c: New file.
	* Makefile.in: Add new file.
	* serial.c (serial_open): Check if filename is a socket
	  and lookup the appropriate interface accordingly.

gdb/doc/ChangeLog:
	* gdb.texinfo (Remote Connection Commands):  Describe
	  the changes to target remote and target extended-remote
	  relating to Unix domain sockets.
---
 gdb/Makefile.in     |   1 +
 gdb/NEWS            |   5 +++
 gdb/configure       |   1 +
 gdb/configure.ac    |   1 +
 gdb/doc/gdb.texinfo |  22 +++++++++-
 gdb/ser-socket.c    | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/serial.c        |  12 +++++-
 7 files changed, 155 insertions(+), 2 deletions(-)
 create mode 100644 gdb/ser-socket.c

diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 118c3c8062..4646ade6c1 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -2323,6 +2323,7 @@ ALLDEPFILES = \
 	ser-go32.c \
 	ser-mingw.c \
 	ser-pipe.c \
+	ser-socket.c \
 	ser-tcp.c \
 	sh-nbsd-nat.c \
 	sh-nbsd-tdep.c \
diff --git a/gdb/NEWS b/gdb/NEWS
index a7a3674375..e5926897a0 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -36,6 +36,11 @@ maint show dwarf unwinders
 
 * Changed commands
 
+target remote FILENAME
+target extended-remote FILENAME
+  If FILENAME is a Unix domain socket, GDB will attempt to connect
+  to this socket instead of opening FILENAME as a character device.
+
 thread apply [all | COUNT | -COUNT] [FLAG]... COMMAND
   The 'thread apply' command accepts new FLAG arguments.
   FLAG arguments allow to control what output to produce and how to handle
diff --git a/gdb/configure b/gdb/configure
index 9cd0036848..21c4f8b6af 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -15586,6 +15586,7 @@ case ${host} in
   *go32* ) SER_HARDWIRE=ser-go32.o ;;
   *djgpp* ) SER_HARDWIRE=ser-go32.o ;;
   *mingw32*) SER_HARDWIRE="ser-base.o ser-tcp.o ser-mingw.o" ;;
+  *) SER_HARDWIRE="$SER_HARDWIRE ser-socket.o" ;;
 esac
 
 
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 13bc5f9a8f..07c874df96 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -1875,6 +1875,7 @@ case ${host} in
   *go32* ) SER_HARDWIRE=ser-go32.o ;;
   *djgpp* ) SER_HARDWIRE=ser-go32.o ;;
   *mingw32*) SER_HARDWIRE="ser-base.o ser-tcp.o ser-mingw.o" ;;
+  *) SER_HARDWIRE="$SER_HARDWIRE ser-socket.o" ;;
 esac
 AC_SUBST(SER_HARDWIRE)
 
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 5068c0ac81..dae62c1787 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -20703,7 +20703,8 @@ programs.
 
 @subsection Remote Connection Commands
 @cindex remote connection commands
-@value{GDBN} can communicate with the target over a serial line, or
+@value{GDBN} can communicate with the target over a serial line, a
+local Unix domain socket, or
 over an @acronym{IP} network using @acronym{TCP} or @acronym{UDP}.  In
 each case, @value{GDBN} uses the same protocol for debugging your
 program; only the medium carrying the debugging packets varies.  The
@@ -20728,6 +20729,25 @@ If you're using a serial line, you may want to give @value{GDBN} the
 (@pxref{Remote Configuration, set serial baud}) before the
 @code{target} command.
 
+
+@item target remote @var{local-socket}
+@itemx target extended-remote @var{local-socket}
+@cindex local socket, @code{target remote}
+@cindex Unix domain socket
+Use @var{local-socket} to communicate with the target.  For example,
+to use a local Unix domain socket bound to the file system entry @file{/tmp/gdb-socket0}:
+
+@smallexample
+target remote /tmp/gdb-socket0
+@end smallexample
+
+Note that this command has the same form as the command to connect
+to a serial line.  @value{GDBN} will automatically determine which
+kind of file you have specified and will make the appropriate kind
+of connection.
+This feature is not available if the host system does not support
+Unix domain sockets.
+
 @item target remote @code{@var{host}:@var{port}}
 @itemx target remote @code{@var{[host]}:@var{port}}
 @itemx target remote @code{tcp:@var{host}:@var{port}}
diff --git a/gdb/ser-socket.c b/gdb/ser-socket.c
new file mode 100644
index 0000000000..6275447e2b
--- /dev/null
+++ b/gdb/ser-socket.c
@@ -0,0 +1,115 @@
+/* Serial interface for local domain connections on Un*x like systems.
+
+   Copyright (C) 1992-2018 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "defs.h"
+#include "serial.h"
+#include "ser-base.h"
+
+#include <sys/socket.h>
+#include <sys/un.h>
+
+/* Open a AF_UNIX socket.  */
+int
+socket_open (struct serial *scb, const char *name)
+{
+  struct sockaddr_un addr;
+
+  memset (&addr, 0, sizeof addr);
+  addr.sun_family = AF_UNIX;
+#ifndef UNIX_MAX_PATH
+# define UNIX_MAX_PATH 108
+#endif
+  strncpy (addr.sun_path, name, UNIX_MAX_PATH - 1);
+
+  int sock = socket (AF_UNIX, SOCK_STREAM, 0);
+
+  if (connect (sock, (struct sockaddr *) &addr,
+	       sizeof (struct sockaddr_un)) < 0)
+    {
+      close (sock);
+      scb->fd = -1;
+      return -1;
+    }
+
+  scb->fd = sock;
+
+  return 0;
+}
+
+void
+socket_close (struct serial *scb)
+{
+  if (scb->fd == -1)
+    return;
+
+  close (scb->fd);
+  scb->fd = -1;
+}
+
+static int
+socket_read_prim (struct serial *scb, size_t count)
+{
+  return recv (scb->fd, scb->buf, count, 0);
+}
+
+static int
+socket_write_prim (struct serial *scb, const void *buf, size_t count)
+{
+  return send (scb->fd, buf, count, 0);
+}
+
+static int
+ser_socket_send_break (struct serial *scb)
+{
+  /* Send telnet IAC and BREAK characters.  */
+  return (serial_write (scb, "\377\363", 2));
+}
+
+/* The SOCKET ops.  */
+
+static const struct serial_ops socket_ops =
+{
+  "socket",
+  socket_open,
+  socket_close,
+  NULL,
+  ser_base_readchar,
+  ser_base_write,
+  ser_base_flush_output,
+  ser_base_flush_input,
+  ser_socket_send_break,
+  ser_base_raw,
+  ser_base_get_tty_state,
+  ser_base_copy_tty_state,
+  ser_base_set_tty_state,
+  ser_base_print_tty_state,
+  ser_base_setbaudrate,
+  ser_base_setstopbits,
+  ser_base_setparity,
+  ser_base_drain_output,
+  ser_base_async,
+  socket_read_prim,
+  socket_write_prim
+};
+
+void
+_initialize_ser_socket (void)
+{
+  serial_add_interface (&socket_ops);
+}
diff --git a/gdb/serial.c b/gdb/serial.c
index fb2b212918..f1fcd95e3c 100644
--- a/gdb/serial.c
+++ b/gdb/serial.c
@@ -213,7 +213,17 @@ serial_open (const char *name)
   else if (strchr (name, ':'))
     ops = serial_interface_lookup ("tcp");
   else
-    ops = serial_interface_lookup ("hardwire");
+    {
+#ifndef USE_WIN32API
+      /* Check to see if name is a socket.  If it is, then treat it
+         as such.  Otherwise assume that it's a character device.  */
+      struct stat sb;
+      if (0 == stat (name, &sb) && ((sb.st_mode & S_IFMT) == S_IFSOCK))
+	ops = serial_interface_lookup ("socket");
+      else
+#endif
+	ops = serial_interface_lookup ("hardwire");
+    }
 
   if (!ops)
     return NULL;
-- 
2.11.0

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2018-10-01 20:02 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-05 15:27 Local domain sockets (take 3) John Darrington
2018-09-05 15:27 ` [PATCH] Allow remote debugging over a Unix local domain socket John Darrington
2018-09-23  4:58   ` John Darrington
2018-09-23  6:01     ` Eli Zaretskii
2018-10-01 20:02   ` Pedro Alves
  -- strict thread matches above, loose matches on Subject: below --
2018-09-03 12:17 Another version for review John Darrington
2018-09-03 12:17 ` [PATCH] Allow remote debugging over a Unix local domain socket John Darrington
2018-09-07 21:06   ` Tom Tromey
2018-09-08  4:22     ` John Darrington
2018-09-11  5:20       ` John Darrington
2018-09-11  5:22         ` Tom Tromey
2018-09-11  9:35           ` Pedro Alves
2018-10-01 18:12           ` John Darrington
2018-10-01 18:25             ` Pedro Alves

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).