GDB: Remote target can now accept the form unix::/path/to/socket.
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 13 Oct 2018 16:12:01 +0000 (18:12 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 23 Oct 2018 14:09:34 +0000 (16:09 +0200)
Allow target remote to use the unix::/path/to/socket syntax as well as just
plain /path/to/socket

gdb/

  * ser-uds.c (uds_open): Use parse_connection_spec to deal with the
    comm form unix::/path/to/socket.

  * serial.c (serial_open): Consider the "unix:" prefix when deciding which
    interface to use.

gdb/ser-uds.c
gdb/serial.c

index a98469f..acace25 100644 (file)
@@ -23,6 +23,8 @@
 
 #include <sys/socket.h>
 #include <sys/un.h>
+#include <netdb.h>
+#include "netstuff.h"
 
 #ifndef UNIX_PATH_MAX
 #define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path)
 static int
 uds_open (struct serial *scb, const char *name)
 {
+  struct addrinfo hint;
+
+  memset (&hint, 0, sizeof (hint));
+  /* Assume no prefix will be passed, therefore we should use
+     AF_UNSPEC.  */
+  hint.ai_family = AF_UNSPEC;
+  hint.ai_socktype = SOCK_STREAM;
+
+  parsed_connection_spec parsed = parse_connection_spec (name, &hint);
+
+  const char *socket_name = parsed.port_str.empty() ? name : parsed.port_str.c_str ();
+
   struct sockaddr_un addr;
 
-  if (strlen (name) > UNIX_PATH_MAX - 1)
+  if (strlen (socket_name) > UNIX_PATH_MAX - 1)
     {
       warning
         (_("The socket name is too long.  It may be no longer than %s bytes."),
@@ -45,7 +59,7 @@ uds_open (struct serial *scb, const char *name)
 
   memset (&addr, 0, sizeof addr);
   addr.sun_family = AF_UNIX;
-  strncpy (addr.sun_path, name, UNIX_PATH_MAX - 1);
+  strncpy (addr.sun_path, socket_name, UNIX_PATH_MAX - 1);
 
   int sock = socket (AF_UNIX, SOCK_STREAM, 0);
 
index 7f9362a..f7c3e6e 100644 (file)
@@ -210,7 +210,7 @@ serial_open (const char *name)
   /* Check for a colon, suggesting an IP address/port pair.
      Do this *after* checking for all the interesting prefixes.  We
      don't want to constrain the syntax of what can follow them.  */
-  else if (strchr (name, ':'))
+  else if (!startswith (name, "unix:") && (strchr (name, ':')))
     ops = serial_interface_lookup ("tcp");
   else
     {
@@ -218,7 +218,8 @@ serial_open (const char *name)
       /* 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 (stat (name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFSOCK)
+      if (startswith (name, "unix:") ||
+         (stat (name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFSOCK))
        ops = serial_interface_lookup ("local");
       else
 #endif