GDB: Remote target can now accept the form unix::/path/to/socket.

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.
This commit is contained in:
John Darrington 2018-10-13 18:12:01 +02:00
parent 0a163825df
commit 88f5cc8cf8
2 changed files with 19 additions and 4 deletions

View 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)
@ -33,9 +35,21 @@
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);

View 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