[v3,1/2] Create new common/pathstuff.[ch]
Commit Message
Changes from v2:
- Added comments to the path manipulation functions.
This commit moves the path manipulation routines found on utils.c to a
new common/pathstuff.c, and updates the Makefile.in's accordingly.
The routines moved are "gdb_realpath", "gdb_realpath_keepfile" and
"gdb_abspath".
This will be needed because gdbserver will have to call "gdb_abspath"
on my next patch, which implements a way to expand the path of the
inferior provided by the user in order to allow specifying just the
binary name when starting gdbserver, like:
$ gdbserver :1234 a.out
With the recent addition of the startup-with-shell feature on
gdbserver, this scenario doesn't work anymore if the user doesn't have
the current directory listed in the PATH variable.
I had to do a minor adjustment on "gdb_abspath" because we don't have
access to "tilde_expand" on gdbserver, so now the function is using
"gdb_tilde_expand" instead. Otherwise, the code is the same.
Regression tested on the BuildBot, without regressions.
gdb/ChangeLog:
yyyy-mm-dd Sergio Durigan Junior <sergiodj@redhat.com>
* Makefile.in (COMMON_SFILES): Add "common/pathstuff.c".
(HFILES_NO_SRCDIR): Add "common/pathstuff.h".
* auto-load.c: Include "common/pathstuff.h".
* common/common-def.h (current_directory): Move here.
* common/gdb_tilde_expand.c (gdb_tilde_expand_up): New
function.
* common/gdb_tilde_expand.h (gdb_tilde_expand_up): New
prototype.
* common/pathstuff.c: New file.
* common/pathstuff.h: New file.
* compile/compile.c: Include "common/pathstuff.h".
* defs.h (current_directory): Move to "common/common-defs.h".
* dwarf2read.c: Include "common/pathstuff.h".
* exec.c: Likewise.
* guile/scm-safe-call.c: Likewise.
* linux-thread-db.c: Likewise.
* main.c: Likewise.
* nto-tdep.c: Likewise.
* objfiles.c: Likewise.
* source.c: Likewise.
* symtab.c: Likewise.
* utils.c: Include "common/pathstuff.h".
(gdb_realpath): Move to "common/pathstuff.c".
(gdb_realpath_keepfile): Likewise.
(gdb_abspath): Likewise.
* utils.h (gdb_realpath): Move to "common/pathstuff.h".
(gdb_realpath_keepfile): Likewise.
(gdb_abspath): Likewise.
gdb/gdbserver/ChangeLog:
yyyy-mm-dd Sergio Durigan Junior <sergiodj@redhat.com>
* Makefile.in (SFILES): Add "$(srcdir)/common/pathstuff.c".
(OBJS): Add "pathstuff.o".
* server.c (current_directory): New global variable.
(captured_main): Initialize "current_directory".
---
gdb/Makefile.in | 2 +
gdb/auto-load.c | 1 +
gdb/common/common-defs.h | 3 +
gdb/common/gdb_tilde_expand.c | 13 ++++
gdb/common/gdb_tilde_expand.h | 4 ++
gdb/common/pathstuff.c | 142 ++++++++++++++++++++++++++++++++++++++++++
gdb/common/pathstuff.h | 49 +++++++++++++++
gdb/compile/compile.c | 1 +
gdb/defs.h | 4 --
gdb/dwarf2read.c | 1 +
gdb/exec.c | 1 +
gdb/gdbserver/Makefile.in | 2 +
gdb/gdbserver/server.c | 11 ++++
gdb/guile/scm-safe-call.c | 1 +
gdb/linux-thread-db.c | 1 +
gdb/main.c | 1 +
gdb/nto-tdep.c | 1 +
gdb/objfiles.c | 1 +
gdb/source.c | 1 +
gdb/symtab.c | 1 +
gdb/utils.c | 120 +----------------------------------
gdb/utils.h | 6 --
22 files changed, 238 insertions(+), 129 deletions(-)
create mode 100644 gdb/common/pathstuff.c
create mode 100644 gdb/common/pathstuff.h
Comments
On 2018-02-27 10:27 PM, Sergio Durigan Junior wrote:
> diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
> index cb02b58507..922d5269b3 100644
> --- a/gdb/gdbserver/server.c
> +++ b/gdb/gdbserver/server.c
> @@ -56,6 +56,10 @@
> break; \
> }
>
> +/* String containing the current directory (what getwd would return). */
> +
> +char *current_directory;
> +
> /* The environment to pass to the inferior when creating it. */
>
> static gdb_environ our_environ;
> @@ -3539,6 +3543,13 @@ captured_main (int argc, char *argv[])
> const char *selftest_filter = NULL;
> #endif
>
> + current_directory = getcwd (NULL, 0);
> + if (current_directory == NULL)
> + {
> + error (_("%s: error finding working directory"),
> + safe_strerror (errno));
> + }
Just one thing, I think Pedro suggested to put the variable string at the end:
error (_("Could not find working directory: %s"),
safe_strerror (errno));
Simon
On Tuesday, February 27 2018, I wrote:
> Changes from v2:
>
> - Added comments to the path manipulation functions.
>
>
> This commit moves the path manipulation routines found on utils.c to a
> new common/pathstuff.c, and updates the Makefile.in's accordingly.
> The routines moved are "gdb_realpath", "gdb_realpath_keepfile" and
> "gdb_abspath".
>
> This will be needed because gdbserver will have to call "gdb_abspath"
> on my next patch, which implements a way to expand the path of the
> inferior provided by the user in order to allow specifying just the
> binary name when starting gdbserver, like:
>
> $ gdbserver :1234 a.out
>
> With the recent addition of the startup-with-shell feature on
> gdbserver, this scenario doesn't work anymore if the user doesn't have
> the current directory listed in the PATH variable.
>
> I had to do a minor adjustment on "gdb_abspath" because we don't have
> access to "tilde_expand" on gdbserver, so now the function is using
> "gdb_tilde_expand" instead. Otherwise, the code is the same.
>
> Regression tested on the BuildBot, without regressions.
Pushed.
b4987c956dfa44ca9fd8552f63e15f5fa094b2a4
Thanks,
>
> gdb/ChangeLog:
> yyyy-mm-dd Sergio Durigan Junior <sergiodj@redhat.com>
>
> * Makefile.in (COMMON_SFILES): Add "common/pathstuff.c".
> (HFILES_NO_SRCDIR): Add "common/pathstuff.h".
> * auto-load.c: Include "common/pathstuff.h".
> * common/common-def.h (current_directory): Move here.
> * common/gdb_tilde_expand.c (gdb_tilde_expand_up): New
> function.
> * common/gdb_tilde_expand.h (gdb_tilde_expand_up): New
> prototype.
> * common/pathstuff.c: New file.
> * common/pathstuff.h: New file.
> * compile/compile.c: Include "common/pathstuff.h".
> * defs.h (current_directory): Move to "common/common-defs.h".
> * dwarf2read.c: Include "common/pathstuff.h".
> * exec.c: Likewise.
> * guile/scm-safe-call.c: Likewise.
> * linux-thread-db.c: Likewise.
> * main.c: Likewise.
> * nto-tdep.c: Likewise.
> * objfiles.c: Likewise.
> * source.c: Likewise.
> * symtab.c: Likewise.
> * utils.c: Include "common/pathstuff.h".
> (gdb_realpath): Move to "common/pathstuff.c".
> (gdb_realpath_keepfile): Likewise.
> (gdb_abspath): Likewise.
> * utils.h (gdb_realpath): Move to "common/pathstuff.h".
> (gdb_realpath_keepfile): Likewise.
> (gdb_abspath): Likewise.
>
> gdb/gdbserver/ChangeLog:
> yyyy-mm-dd Sergio Durigan Junior <sergiodj@redhat.com>
>
> * Makefile.in (SFILES): Add "$(srcdir)/common/pathstuff.c".
> (OBJS): Add "pathstuff.o".
> * server.c (current_directory): New global variable.
> (captured_main): Initialize "current_directory".
> ---
> gdb/Makefile.in | 2 +
> gdb/auto-load.c | 1 +
> gdb/common/common-defs.h | 3 +
> gdb/common/gdb_tilde_expand.c | 13 ++++
> gdb/common/gdb_tilde_expand.h | 4 ++
> gdb/common/pathstuff.c | 142 ++++++++++++++++++++++++++++++++++++++++++
> gdb/common/pathstuff.h | 49 +++++++++++++++
> gdb/compile/compile.c | 1 +
> gdb/defs.h | 4 --
> gdb/dwarf2read.c | 1 +
> gdb/exec.c | 1 +
> gdb/gdbserver/Makefile.in | 2 +
> gdb/gdbserver/server.c | 11 ++++
> gdb/guile/scm-safe-call.c | 1 +
> gdb/linux-thread-db.c | 1 +
> gdb/main.c | 1 +
> gdb/nto-tdep.c | 1 +
> gdb/objfiles.c | 1 +
> gdb/source.c | 1 +
> gdb/symtab.c | 1 +
> gdb/utils.c | 120 +----------------------------------
> gdb/utils.h | 6 --
> 22 files changed, 238 insertions(+), 129 deletions(-)
> create mode 100644 gdb/common/pathstuff.c
> create mode 100644 gdb/common/pathstuff.h
>
> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index 1c58b9270d..19be64f226 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -955,6 +955,7 @@ COMMON_SFILES = \
> common/gdb_tilde_expand.c \
> common/gdb_vecs.c \
> common/new-op.c \
> + common/pathstuff.c \
> common/print-utils.c \
> common/ptid.c \
> common/rsp-low.c \
> @@ -1429,6 +1430,7 @@ HFILES_NO_SRCDIR = \
> common/gdb_wait.h \
> common/common-inferior.h \
> common/host-defs.h \
> + common/pathstuff.h \
> common/print-utils.h \
> common/ptid.h \
> common/queue.h \
> diff --git a/gdb/auto-load.c b/gdb/auto-load.c
> index b79341faf6..9dd8754e1a 100644
> --- a/gdb/auto-load.c
> +++ b/gdb/auto-load.c
> @@ -40,6 +40,7 @@
> #include "extension.h"
> #include "gdb/section-scripts.h"
> #include <algorithm>
> +#include "common/pathstuff.h"
>
> /* The section to look in for auto-loaded scripts (in file formats that
> support sections).
> diff --git a/gdb/common/common-defs.h b/gdb/common/common-defs.h
> index acbc32ca69..881a4eaaff 100644
> --- a/gdb/common/common-defs.h
> +++ b/gdb/common/common-defs.h
> @@ -91,4 +91,7 @@
> /* Pull in gdb::unique_xmalloc_ptr. */
> #include "common/gdb_unique_ptr.h"
>
> +/* String containing the current directory (what getwd would return). */
> +extern char *current_directory;
> +
> #endif /* COMMON_DEFS_H */
> diff --git a/gdb/common/gdb_tilde_expand.c b/gdb/common/gdb_tilde_expand.c
> index b4f371464d..fcb97961ac 100644
> --- a/gdb/common/gdb_tilde_expand.c
> +++ b/gdb/common/gdb_tilde_expand.c
> @@ -80,3 +80,16 @@ gdb_tilde_expand (const char *dir)
>
> return expanded_dir;
> }
> +
> +/* See common/gdb_tilde_expand.h. */
> +
> +gdb::unique_xmalloc_ptr<char>
> +gdb_tilde_expand_up (const char *dir)
> +{
> + gdb_glob glob (dir, GLOB_TILDE_CHECK, NULL);
> +
> + gdb_assert (glob.pathc () > 0);
> + /* "glob" may return more than one match to the path provided by the
> + user, but we are only interested in the first match. */
> + return gdb::unique_xmalloc_ptr<char> (xstrdup (glob.pathv ()[0]));
> +}
> diff --git a/gdb/common/gdb_tilde_expand.h b/gdb/common/gdb_tilde_expand.h
> index d0dfb37857..22860d3969 100644
> --- a/gdb/common/gdb_tilde_expand.h
> +++ b/gdb/common/gdb_tilde_expand.h
> @@ -24,4 +24,8 @@
> the full path. */
> extern std::string gdb_tilde_expand (const char *dir);
>
> +/* Same as GDB_TILDE_EXPAND, but return the full path as a
> + gdb::unique_xmalloc_ptr<char>. */
> +extern gdb::unique_xmalloc_ptr<char> gdb_tilde_expand_up (const char *dir);
> +
> #endif /* ! GDB_TILDE_EXPAND_H */
> diff --git a/gdb/common/pathstuff.c b/gdb/common/pathstuff.c
> new file mode 100644
> index 0000000000..02f6e44794
> --- /dev/null
> +++ b/gdb/common/pathstuff.c
> @@ -0,0 +1,142 @@
> +/* Path manipulation routines for GDB and gdbserver.
> +
> + Copyright (C) 1986-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 "common-defs.h"
> +#include "pathstuff.h"
> +#include "host-defs.h"
> +#include "filenames.h"
> +#include "gdb_tilde_expand.h"
> +
> +/* See common/pathstuff.h. */
> +
> +gdb::unique_xmalloc_ptr<char>
> +gdb_realpath (const char *filename)
> +{
> +/* On most hosts, we rely on canonicalize_file_name to compute
> + the FILENAME's realpath.
> +
> + But the situation is slightly more complex on Windows, due to some
> + versions of GCC which were reported to generate paths where
> + backlashes (the directory separator) were doubled. For instance:
> + c:\\some\\double\\slashes\\dir
> + ... instead of ...
> + c:\some\double\slashes\dir
> + Those double-slashes were getting in the way when comparing paths,
> + for instance when trying to insert a breakpoint as follow:
> + (gdb) b c:/some/double/slashes/dir/foo.c:4
> + No source file named c:/some/double/slashes/dir/foo.c:4.
> + (gdb) b c:\some\double\slashes\dir\foo.c:4
> + No source file named c:\some\double\slashes\dir\foo.c:4.
> + To prevent this from happening, we need this function to always
> + strip those extra backslashes. While canonicalize_file_name does
> + perform this simplification, it only works when the path is valid.
> + Since the simplification would be useful even if the path is not
> + valid (one can always set a breakpoint on a file, even if the file
> + does not exist locally), we rely instead on GetFullPathName to
> + perform the canonicalization. */
> +
> +#if defined (_WIN32)
> + {
> + char buf[MAX_PATH];
> + DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL);
> +
> + /* The file system is case-insensitive but case-preserving.
> + So it is important we do not lowercase the path. Otherwise,
> + we might not be able to display the original casing in a given
> + path. */
> + if (len > 0 && len < MAX_PATH)
> + return gdb::unique_xmalloc_ptr<char> (xstrdup (buf));
> + }
> +#else
> + {
> + char *rp = canonicalize_file_name (filename);
> +
> + if (rp != NULL)
> + return gdb::unique_xmalloc_ptr<char> (rp);
> + }
> +#endif
> +
> + /* This system is a lost cause, just dup the buffer. */
> + return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
> +}
> +
> +/* See common/pathstuff.h. */
> +
> +gdb::unique_xmalloc_ptr<char>
> +gdb_realpath_keepfile (const char *filename)
> +{
> + const char *base_name = lbasename (filename);
> + char *dir_name;
> + char *result;
> +
> + /* Extract the basename of filename, and return immediately
> + a copy of filename if it does not contain any directory prefix. */
> + if (base_name == filename)
> + return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
> +
> + dir_name = (char *) alloca ((size_t) (base_name - filename + 2));
> + /* Allocate enough space to store the dir_name + plus one extra
> + character sometimes needed under Windows (see below), and
> + then the closing \000 character. */
> + strncpy (dir_name, filename, base_name - filename);
> + dir_name[base_name - filename] = '\000';
> +
> +#ifdef HAVE_DOS_BASED_FILE_SYSTEM
> + /* We need to be careful when filename is of the form 'd:foo', which
> + is equivalent of d:./foo, which is totally different from d:/foo. */
> + if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':')
> + {
> + dir_name[2] = '.';
> + dir_name[3] = '\000';
> + }
> +#endif
> +
> + /* Canonicalize the directory prefix, and build the resulting
> + filename. If the dirname realpath already contains an ending
> + directory separator, avoid doubling it. */
> + gdb::unique_xmalloc_ptr<char> path_storage = gdb_realpath (dir_name);
> + const char *real_path = path_storage.get ();
> + if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
> + result = concat (real_path, base_name, (char *) NULL);
> + else
> + result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
> +
> + return gdb::unique_xmalloc_ptr<char> (result);
> +}
> +
> +/* See common/pathstuff.h. */
> +
> +gdb::unique_xmalloc_ptr<char>
> +gdb_abspath (const char *path)
> +{
> + gdb_assert (path != NULL && path[0] != '\0');
> +
> + if (path[0] == '~')
> + return gdb_tilde_expand_up (path);
> +
> + if (IS_ABSOLUTE_PATH (path))
> + return gdb::unique_xmalloc_ptr<char> (xstrdup (path));
> +
> + /* Beware the // my son, the Emacs barfs, the botch that catch... */
> + return gdb::unique_xmalloc_ptr<char>
> + (concat (current_directory,
> + IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
> + ? "" : SLASH_STRING,
> + path, (char *) NULL));
> +}
> diff --git a/gdb/common/pathstuff.h b/gdb/common/pathstuff.h
> new file mode 100644
> index 0000000000..3cb02c86d6
> --- /dev/null
> +++ b/gdb/common/pathstuff.h
> @@ -0,0 +1,49 @@
> +/* Path manipulation routines for GDB and gdbserver.
> +
> + Copyright (C) 1986-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/>. */
> +
> +#ifndef PATHSTUFF_H
> +#define PATHSTUFF_H
> +
> +/* Path utilities. */
> +
> +/* Return the real path of FILENAME, expanding all the symbolic links.
> +
> + Contrary to "gdb_abspath", this function does not use
> + CURRENT_DIRECTORY for path expansion. Instead, it relies on the
> + current working directory (CWD) of GDB or gdbserver. */
> +
> +extern gdb::unique_xmalloc_ptr<char> gdb_realpath (const char *filename);
> +
> +/* Return a copy of FILENAME, with its directory prefix canonicalized
> + by gdb_realpath. */
> +
> +extern gdb::unique_xmalloc_ptr<char>
> + gdb_realpath_keepfile (const char *filename);
> +
> +/* Return PATH in absolute form, performing tilde-expansion if necessary.
> + PATH cannot be NULL or the empty string.
> + This does not resolve symlinks however, use gdb_realpath for that.
> +
> + Contrary to "gdb_realpath", this function uses CURRENT_DIRECTORY
> + for the path expansion. This may lead to scenarios the current
> + working directory (CWD) is different than CURRENT_DIRECTORY. */
> +
> +extern gdb::unique_xmalloc_ptr<char> gdb_abspath (const char *path);
> +
> +#endif /* PATHSTUFF_H */
> diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c
> index 70c4570de7..7f35272872 100644
> --- a/gdb/compile/compile.c
> +++ b/gdb/compile/compile.c
> @@ -41,6 +41,7 @@
> #include "valprint.h"
> #include "common/gdb_optional.h"
> #include "common/gdb_unlinker.h"
> +#include "common/pathstuff.h"
>
>
>
> diff --git a/gdb/defs.h b/gdb/defs.h
> index c85bf2cf11..a924573b57 100644
> --- a/gdb/defs.h
> +++ b/gdb/defs.h
> @@ -402,10 +402,6 @@ enum info_proc_what
> IP_ALL
> };
>
> -/* * String containing the current directory (what getwd would return). */
> -
> -extern char *current_directory;
> -
> /* * Default radixes for input and output. Only some values supported. */
> extern unsigned input_radix;
> extern unsigned output_radix;
> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
> index 1e4376e4de..9825117fa7 100644
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -87,6 +87,7 @@
> #include <set>
> #include <forward_list>
> #include "rust-lang.h"
> +#include "common/pathstuff.h"
>
> /* When == 1, print basic high level tracing messages.
> When > 1, be more verbose.
> diff --git a/gdb/exec.c b/gdb/exec.c
> index 0b4237ff63..6b910e8f54 100644
> --- a/gdb/exec.c
> +++ b/gdb/exec.c
> @@ -45,6 +45,7 @@
> #include <sys/stat.h>
> #include "solist.h"
> #include <algorithm>
> +#include "common/pathstuff.h"
>
> void (*deprecated_file_changed_hook) (const char *);
>
> diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
> index 2dbf9ae63d..f2936920fe 100644
> --- a/gdb/gdbserver/Makefile.in
> +++ b/gdb/gdbserver/Makefile.in
> @@ -209,6 +209,7 @@ SFILES = \
> $(srcdir)/common/gdb_tilde_expand.c \
> $(srcdir)/common/gdb_vecs.c \
> $(srcdir)/common/new-op.c \
> + $(srcdir)/common/pathstuff.c \
> $(srcdir)/common/print-utils.c \
> $(srcdir)/common/ptid.c \
> $(srcdir)/common/rsp-low.c \
> @@ -249,6 +250,7 @@ OBS = \
> common/gdb_tilde_expand.o \
> common/gdb_vecs.o \
> common/new-op.o \
> + common/pathstuff.o \
> common/print-utils.o \
> common/ptid.o \
> common/rsp-low.o \
> diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
> index cb02b58507..922d5269b3 100644
> --- a/gdb/gdbserver/server.c
> +++ b/gdb/gdbserver/server.c
> @@ -56,6 +56,10 @@
> break; \
> }
>
> +/* String containing the current directory (what getwd would return). */
> +
> +char *current_directory;
> +
> /* The environment to pass to the inferior when creating it. */
>
> static gdb_environ our_environ;
> @@ -3539,6 +3543,13 @@ captured_main (int argc, char *argv[])
> const char *selftest_filter = NULL;
> #endif
>
> + current_directory = getcwd (NULL, 0);
> + if (current_directory == NULL)
> + {
> + error (_("%s: error finding working directory"),
> + safe_strerror (errno));
> + }
> +
> while (*next_arg != NULL && **next_arg == '-')
> {
> if (strcmp (*next_arg, "--version") == 0)
> diff --git a/gdb/guile/scm-safe-call.c b/gdb/guile/scm-safe-call.c
> index a9ce7b72c1..2cba399e23 100644
> --- a/gdb/guile/scm-safe-call.c
> +++ b/gdb/guile/scm-safe-call.c
> @@ -23,6 +23,7 @@
> #include "defs.h"
> #include "filenames.h"
> #include "guile-internal.h"
> +#include "common/pathstuff.h"
>
> /* Struct to marshall args to scscm_safe_call_body. */
>
> diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
> index 5ba4c03df6..10c85f56ad 100644
> --- a/gdb/linux-thread-db.c
> +++ b/gdb/linux-thread-db.c
> @@ -46,6 +46,7 @@
> #include <ctype.h>
> #include "nat/linux-namespaces.h"
> #include <algorithm>
> +#include "common/pathstuff.h"
>
> /* GNU/Linux libthread_db support.
>
> diff --git a/gdb/main.c b/gdb/main.c
> index 3c98787edb..189266f90e 100644
> --- a/gdb/main.c
> +++ b/gdb/main.c
> @@ -46,6 +46,7 @@
> #include "infrun.h"
> #include "signals-state-save-restore.h"
> #include <vector>
> +#include "common/pathstuff.h"
>
> /* The selected interpreter. This will be used as a set command
> variable, so it should always be malloc'ed - since
> diff --git a/gdb/nto-tdep.c b/gdb/nto-tdep.c
> index 8eb864b871..82a4fcbbb9 100644
> --- a/gdb/nto-tdep.c
> +++ b/gdb/nto-tdep.c
> @@ -32,6 +32,7 @@
> #include "gdbcore.h"
> #include "objfiles.h"
> #include "source.h"
> +#include "common/pathstuff.h"
>
> #define QNX_NOTE_NAME "QNX"
> #define QNX_INFO_SECT_NAME "QNX_info"
> diff --git a/gdb/objfiles.c b/gdb/objfiles.c
> index 70e369b8b4..a9aaf89540 100644
> --- a/gdb/objfiles.c
> +++ b/gdb/objfiles.c
> @@ -52,6 +52,7 @@
> #include "solist.h"
> #include "gdb_bfd.h"
> #include "btrace.h"
> +#include "common/pathstuff.h"
>
> #include <vector>
>
> diff --git a/gdb/source.c b/gdb/source.c
> index 8a27b2e666..04ee3b33d2 100644
> --- a/gdb/source.c
> +++ b/gdb/source.c
> @@ -44,6 +44,7 @@
> #include "readline/readline.h"
> #include "common/enum-flags.h"
> #include <algorithm>
> +#include "common/pathstuff.h"
>
> #define OPEN_MODE (O_RDONLY | O_BINARY)
> #define FDOPEN_MODE FOPEN_RB
> diff --git a/gdb/symtab.c b/gdb/symtab.c
> index 0fd3f3a30f..567195304f 100644
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -66,6 +66,7 @@
> #include "filename-seen-cache.h"
> #include "arch-utils.h"
> #include <algorithm>
> +#include "common/pathstuff.h"
>
> /* Forward declarations for local functions. */
>
> diff --git a/gdb/utils.c b/gdb/utils.c
> index c531748fe4..577f9df4ec 100644
> --- a/gdb/utils.c
> +++ b/gdb/utils.c
> @@ -70,6 +70,7 @@
> #include "common/gdb_optional.h"
> #include "cp-support.h"
> #include <algorithm>
> +#include "common/pathstuff.h"
>
> #if !HAVE_DECL_MALLOC
> extern PTR malloc (); /* ARI: PTR */
> @@ -2838,57 +2839,6 @@ string_to_core_addr (const char *my_string)
> return addr;
> }
>
> -gdb::unique_xmalloc_ptr<char>
> -gdb_realpath (const char *filename)
> -{
> -/* On most hosts, we rely on canonicalize_file_name to compute
> - the FILENAME's realpath.
> -
> - But the situation is slightly more complex on Windows, due to some
> - versions of GCC which were reported to generate paths where
> - backlashes (the directory separator) were doubled. For instance:
> - c:\\some\\double\\slashes\\dir
> - ... instead of ...
> - c:\some\double\slashes\dir
> - Those double-slashes were getting in the way when comparing paths,
> - for instance when trying to insert a breakpoint as follow:
> - (gdb) b c:/some/double/slashes/dir/foo.c:4
> - No source file named c:/some/double/slashes/dir/foo.c:4.
> - (gdb) b c:\some\double\slashes\dir\foo.c:4
> - No source file named c:\some\double\slashes\dir\foo.c:4.
> - To prevent this from happening, we need this function to always
> - strip those extra backslashes. While canonicalize_file_name does
> - perform this simplification, it only works when the path is valid.
> - Since the simplification would be useful even if the path is not
> - valid (one can always set a breakpoint on a file, even if the file
> - does not exist locally), we rely instead on GetFullPathName to
> - perform the canonicalization. */
> -
> -#if defined (_WIN32)
> - {
> - char buf[MAX_PATH];
> - DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL);
> -
> - /* The file system is case-insensitive but case-preserving.
> - So it is important we do not lowercase the path. Otherwise,
> - we might not be able to display the original casing in a given
> - path. */
> - if (len > 0 && len < MAX_PATH)
> - return gdb::unique_xmalloc_ptr<char> (xstrdup (buf));
> - }
> -#else
> - {
> - char *rp = canonicalize_file_name (filename);
> -
> - if (rp != NULL)
> - return gdb::unique_xmalloc_ptr<char> (rp);
> - }
> -#endif
> -
> - /* This system is a lost cause, just dup the buffer. */
> - return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
> -}
> -
> #if GDB_SELF_TEST
>
> static void
> @@ -2925,74 +2875,6 @@ gdb_realpath_tests ()
>
> #endif /* GDB_SELF_TEST */
>
> -/* Return a copy of FILENAME, with its directory prefix canonicalized
> - by gdb_realpath. */
> -
> -gdb::unique_xmalloc_ptr<char>
> -gdb_realpath_keepfile (const char *filename)
> -{
> - const char *base_name = lbasename (filename);
> - char *dir_name;
> - char *result;
> -
> - /* Extract the basename of filename, and return immediately
> - a copy of filename if it does not contain any directory prefix. */
> - if (base_name == filename)
> - return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
> -
> - dir_name = (char *) alloca ((size_t) (base_name - filename + 2));
> - /* Allocate enough space to store the dir_name + plus one extra
> - character sometimes needed under Windows (see below), and
> - then the closing \000 character. */
> - strncpy (dir_name, filename, base_name - filename);
> - dir_name[base_name - filename] = '\000';
> -
> -#ifdef HAVE_DOS_BASED_FILE_SYSTEM
> - /* We need to be careful when filename is of the form 'd:foo', which
> - is equivalent of d:./foo, which is totally different from d:/foo. */
> - if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':')
> - {
> - dir_name[2] = '.';
> - dir_name[3] = '\000';
> - }
> -#endif
> -
> - /* Canonicalize the directory prefix, and build the resulting
> - filename. If the dirname realpath already contains an ending
> - directory separator, avoid doubling it. */
> - gdb::unique_xmalloc_ptr<char> path_storage = gdb_realpath (dir_name);
> - const char *real_path = path_storage.get ();
> - if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
> - result = concat (real_path, base_name, (char *) NULL);
> - else
> - result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
> -
> - return gdb::unique_xmalloc_ptr<char> (result);
> -}
> -
> -/* Return PATH in absolute form, performing tilde-expansion if necessary.
> - PATH cannot be NULL or the empty string.
> - This does not resolve symlinks however, use gdb_realpath for that. */
> -
> -gdb::unique_xmalloc_ptr<char>
> -gdb_abspath (const char *path)
> -{
> - gdb_assert (path != NULL && path[0] != '\0');
> -
> - if (path[0] == '~')
> - return gdb::unique_xmalloc_ptr<char> (tilde_expand (path));
> -
> - if (IS_ABSOLUTE_PATH (path))
> - return gdb::unique_xmalloc_ptr<char> (xstrdup (path));
> -
> - /* Beware the // my son, the Emacs barfs, the botch that catch... */
> - return gdb::unique_xmalloc_ptr<char>
> - (concat (current_directory,
> - IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
> - ? "" : SLASH_STRING,
> - path, (char *) NULL));
> -}
> -
> ULONGEST
> align_up (ULONGEST v, int n)
> {
> diff --git a/gdb/utils.h b/gdb/utils.h
> index b234762929..8ca3eb0369 100644
> --- a/gdb/utils.h
> +++ b/gdb/utils.h
> @@ -295,12 +295,6 @@ extern struct cleanup *make_bpstat_clear_actions_cleanup (void);
>
> /* Path utilities. */
>
> -extern gdb::unique_xmalloc_ptr<char> gdb_realpath (const char *);
> -
> -extern gdb::unique_xmalloc_ptr<char> gdb_realpath_keepfile (const char *);
> -
> -extern gdb::unique_xmalloc_ptr<char> gdb_abspath (const char *);
> -
> extern int gdb_filename_fnmatch (const char *pattern, const char *string,
> int flags);
>
> --
> 2.14.3
On Wednesday, February 28 2018, Simon Marchi wrote:
> On 2018-02-27 10:27 PM, Sergio Durigan Junior wrote:
>> diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
>> index cb02b58507..922d5269b3 100644
>> --- a/gdb/gdbserver/server.c
>> +++ b/gdb/gdbserver/server.c
>> @@ -56,6 +56,10 @@
>> break; \
>> }
>>
>> +/* String containing the current directory (what getwd would return). */
>> +
>> +char *current_directory;
>> +
>> /* The environment to pass to the inferior when creating it. */
>>
>> static gdb_environ our_environ;
>> @@ -3539,6 +3543,13 @@ captured_main (int argc, char *argv[])
>> const char *selftest_filter = NULL;
>> #endif
>>
>> + current_directory = getcwd (NULL, 0);
>> + if (current_directory == NULL)
>> + {
>> + error (_("%s: error finding working directory"),
>> + safe_strerror (errno));
>> + }
>
> Just one thing, I think Pedro suggested to put the variable string at the end:
>
> error (_("Could not find working directory: %s"),
> safe_strerror (errno));
Ah, that's right, sorry about this, I got confused. And I didn't get
this message on my INBOX, so I went ahead and pushed the commit without
this change. I took the liberty to push an obvious commit now fixing
this.
815615463b1171cbff7c5e54f62fc708cc1bbc99
Thanks,
@@ -955,6 +955,7 @@ COMMON_SFILES = \
common/gdb_tilde_expand.c \
common/gdb_vecs.c \
common/new-op.c \
+ common/pathstuff.c \
common/print-utils.c \
common/ptid.c \
common/rsp-low.c \
@@ -1429,6 +1430,7 @@ HFILES_NO_SRCDIR = \
common/gdb_wait.h \
common/common-inferior.h \
common/host-defs.h \
+ common/pathstuff.h \
common/print-utils.h \
common/ptid.h \
common/queue.h \
@@ -40,6 +40,7 @@
#include "extension.h"
#include "gdb/section-scripts.h"
#include <algorithm>
+#include "common/pathstuff.h"
/* The section to look in for auto-loaded scripts (in file formats that
support sections).
@@ -91,4 +91,7 @@
/* Pull in gdb::unique_xmalloc_ptr. */
#include "common/gdb_unique_ptr.h"
+/* String containing the current directory (what getwd would return). */
+extern char *current_directory;
+
#endif /* COMMON_DEFS_H */
@@ -80,3 +80,16 @@ gdb_tilde_expand (const char *dir)
return expanded_dir;
}
+
+/* See common/gdb_tilde_expand.h. */
+
+gdb::unique_xmalloc_ptr<char>
+gdb_tilde_expand_up (const char *dir)
+{
+ gdb_glob glob (dir, GLOB_TILDE_CHECK, NULL);
+
+ gdb_assert (glob.pathc () > 0);
+ /* "glob" may return more than one match to the path provided by the
+ user, but we are only interested in the first match. */
+ return gdb::unique_xmalloc_ptr<char> (xstrdup (glob.pathv ()[0]));
+}
@@ -24,4 +24,8 @@
the full path. */
extern std::string gdb_tilde_expand (const char *dir);
+/* Same as GDB_TILDE_EXPAND, but return the full path as a
+ gdb::unique_xmalloc_ptr<char>. */
+extern gdb::unique_xmalloc_ptr<char> gdb_tilde_expand_up (const char *dir);
+
#endif /* ! GDB_TILDE_EXPAND_H */
new file mode 100644
@@ -0,0 +1,142 @@
+/* Path manipulation routines for GDB and gdbserver.
+
+ Copyright (C) 1986-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 "common-defs.h"
+#include "pathstuff.h"
+#include "host-defs.h"
+#include "filenames.h"
+#include "gdb_tilde_expand.h"
+
+/* See common/pathstuff.h. */
+
+gdb::unique_xmalloc_ptr<char>
+gdb_realpath (const char *filename)
+{
+/* On most hosts, we rely on canonicalize_file_name to compute
+ the FILENAME's realpath.
+
+ But the situation is slightly more complex on Windows, due to some
+ versions of GCC which were reported to generate paths where
+ backlashes (the directory separator) were doubled. For instance:
+ c:\\some\\double\\slashes\\dir
+ ... instead of ...
+ c:\some\double\slashes\dir
+ Those double-slashes were getting in the way when comparing paths,
+ for instance when trying to insert a breakpoint as follow:
+ (gdb) b c:/some/double/slashes/dir/foo.c:4
+ No source file named c:/some/double/slashes/dir/foo.c:4.
+ (gdb) b c:\some\double\slashes\dir\foo.c:4
+ No source file named c:\some\double\slashes\dir\foo.c:4.
+ To prevent this from happening, we need this function to always
+ strip those extra backslashes. While canonicalize_file_name does
+ perform this simplification, it only works when the path is valid.
+ Since the simplification would be useful even if the path is not
+ valid (one can always set a breakpoint on a file, even if the file
+ does not exist locally), we rely instead on GetFullPathName to
+ perform the canonicalization. */
+
+#if defined (_WIN32)
+ {
+ char buf[MAX_PATH];
+ DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL);
+
+ /* The file system is case-insensitive but case-preserving.
+ So it is important we do not lowercase the path. Otherwise,
+ we might not be able to display the original casing in a given
+ path. */
+ if (len > 0 && len < MAX_PATH)
+ return gdb::unique_xmalloc_ptr<char> (xstrdup (buf));
+ }
+#else
+ {
+ char *rp = canonicalize_file_name (filename);
+
+ if (rp != NULL)
+ return gdb::unique_xmalloc_ptr<char> (rp);
+ }
+#endif
+
+ /* This system is a lost cause, just dup the buffer. */
+ return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
+}
+
+/* See common/pathstuff.h. */
+
+gdb::unique_xmalloc_ptr<char>
+gdb_realpath_keepfile (const char *filename)
+{
+ const char *base_name = lbasename (filename);
+ char *dir_name;
+ char *result;
+
+ /* Extract the basename of filename, and return immediately
+ a copy of filename if it does not contain any directory prefix. */
+ if (base_name == filename)
+ return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
+
+ dir_name = (char *) alloca ((size_t) (base_name - filename + 2));
+ /* Allocate enough space to store the dir_name + plus one extra
+ character sometimes needed under Windows (see below), and
+ then the closing \000 character. */
+ strncpy (dir_name, filename, base_name - filename);
+ dir_name[base_name - filename] = '\000';
+
+#ifdef HAVE_DOS_BASED_FILE_SYSTEM
+ /* We need to be careful when filename is of the form 'd:foo', which
+ is equivalent of d:./foo, which is totally different from d:/foo. */
+ if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':')
+ {
+ dir_name[2] = '.';
+ dir_name[3] = '\000';
+ }
+#endif
+
+ /* Canonicalize the directory prefix, and build the resulting
+ filename. If the dirname realpath already contains an ending
+ directory separator, avoid doubling it. */
+ gdb::unique_xmalloc_ptr<char> path_storage = gdb_realpath (dir_name);
+ const char *real_path = path_storage.get ();
+ if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
+ result = concat (real_path, base_name, (char *) NULL);
+ else
+ result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
+
+ return gdb::unique_xmalloc_ptr<char> (result);
+}
+
+/* See common/pathstuff.h. */
+
+gdb::unique_xmalloc_ptr<char>
+gdb_abspath (const char *path)
+{
+ gdb_assert (path != NULL && path[0] != '\0');
+
+ if (path[0] == '~')
+ return gdb_tilde_expand_up (path);
+
+ if (IS_ABSOLUTE_PATH (path))
+ return gdb::unique_xmalloc_ptr<char> (xstrdup (path));
+
+ /* Beware the // my son, the Emacs barfs, the botch that catch... */
+ return gdb::unique_xmalloc_ptr<char>
+ (concat (current_directory,
+ IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
+ ? "" : SLASH_STRING,
+ path, (char *) NULL));
+}
new file mode 100644
@@ -0,0 +1,49 @@
+/* Path manipulation routines for GDB and gdbserver.
+
+ Copyright (C) 1986-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/>. */
+
+#ifndef PATHSTUFF_H
+#define PATHSTUFF_H
+
+/* Path utilities. */
+
+/* Return the real path of FILENAME, expanding all the symbolic links.
+
+ Contrary to "gdb_abspath", this function does not use
+ CURRENT_DIRECTORY for path expansion. Instead, it relies on the
+ current working directory (CWD) of GDB or gdbserver. */
+
+extern gdb::unique_xmalloc_ptr<char> gdb_realpath (const char *filename);
+
+/* Return a copy of FILENAME, with its directory prefix canonicalized
+ by gdb_realpath. */
+
+extern gdb::unique_xmalloc_ptr<char>
+ gdb_realpath_keepfile (const char *filename);
+
+/* Return PATH in absolute form, performing tilde-expansion if necessary.
+ PATH cannot be NULL or the empty string.
+ This does not resolve symlinks however, use gdb_realpath for that.
+
+ Contrary to "gdb_realpath", this function uses CURRENT_DIRECTORY
+ for the path expansion. This may lead to scenarios the current
+ working directory (CWD) is different than CURRENT_DIRECTORY. */
+
+extern gdb::unique_xmalloc_ptr<char> gdb_abspath (const char *path);
+
+#endif /* PATHSTUFF_H */
@@ -41,6 +41,7 @@
#include "valprint.h"
#include "common/gdb_optional.h"
#include "common/gdb_unlinker.h"
+#include "common/pathstuff.h"
@@ -402,10 +402,6 @@ enum info_proc_what
IP_ALL
};
-/* * String containing the current directory (what getwd would return). */
-
-extern char *current_directory;
-
/* * Default radixes for input and output. Only some values supported. */
extern unsigned input_radix;
extern unsigned output_radix;
@@ -87,6 +87,7 @@
#include <set>
#include <forward_list>
#include "rust-lang.h"
+#include "common/pathstuff.h"
/* When == 1, print basic high level tracing messages.
When > 1, be more verbose.
@@ -45,6 +45,7 @@
#include <sys/stat.h>
#include "solist.h"
#include <algorithm>
+#include "common/pathstuff.h"
void (*deprecated_file_changed_hook) (const char *);
@@ -209,6 +209,7 @@ SFILES = \
$(srcdir)/common/gdb_tilde_expand.c \
$(srcdir)/common/gdb_vecs.c \
$(srcdir)/common/new-op.c \
+ $(srcdir)/common/pathstuff.c \
$(srcdir)/common/print-utils.c \
$(srcdir)/common/ptid.c \
$(srcdir)/common/rsp-low.c \
@@ -249,6 +250,7 @@ OBS = \
common/gdb_tilde_expand.o \
common/gdb_vecs.o \
common/new-op.o \
+ common/pathstuff.o \
common/print-utils.o \
common/ptid.o \
common/rsp-low.o \
@@ -56,6 +56,10 @@
break; \
}
+/* String containing the current directory (what getwd would return). */
+
+char *current_directory;
+
/* The environment to pass to the inferior when creating it. */
static gdb_environ our_environ;
@@ -3539,6 +3543,13 @@ captured_main (int argc, char *argv[])
const char *selftest_filter = NULL;
#endif
+ current_directory = getcwd (NULL, 0);
+ if (current_directory == NULL)
+ {
+ error (_("%s: error finding working directory"),
+ safe_strerror (errno));
+ }
+
while (*next_arg != NULL && **next_arg == '-')
{
if (strcmp (*next_arg, "--version") == 0)
@@ -23,6 +23,7 @@
#include "defs.h"
#include "filenames.h"
#include "guile-internal.h"
+#include "common/pathstuff.h"
/* Struct to marshall args to scscm_safe_call_body. */
@@ -46,6 +46,7 @@
#include <ctype.h>
#include "nat/linux-namespaces.h"
#include <algorithm>
+#include "common/pathstuff.h"
/* GNU/Linux libthread_db support.
@@ -46,6 +46,7 @@
#include "infrun.h"
#include "signals-state-save-restore.h"
#include <vector>
+#include "common/pathstuff.h"
/* The selected interpreter. This will be used as a set command
variable, so it should always be malloc'ed - since
@@ -32,6 +32,7 @@
#include "gdbcore.h"
#include "objfiles.h"
#include "source.h"
+#include "common/pathstuff.h"
#define QNX_NOTE_NAME "QNX"
#define QNX_INFO_SECT_NAME "QNX_info"
@@ -52,6 +52,7 @@
#include "solist.h"
#include "gdb_bfd.h"
#include "btrace.h"
+#include "common/pathstuff.h"
#include <vector>
@@ -44,6 +44,7 @@
#include "readline/readline.h"
#include "common/enum-flags.h"
#include <algorithm>
+#include "common/pathstuff.h"
#define OPEN_MODE (O_RDONLY | O_BINARY)
#define FDOPEN_MODE FOPEN_RB
@@ -66,6 +66,7 @@
#include "filename-seen-cache.h"
#include "arch-utils.h"
#include <algorithm>
+#include "common/pathstuff.h"
/* Forward declarations for local functions. */
@@ -70,6 +70,7 @@
#include "common/gdb_optional.h"
#include "cp-support.h"
#include <algorithm>
+#include "common/pathstuff.h"
#if !HAVE_DECL_MALLOC
extern PTR malloc (); /* ARI: PTR */
@@ -2838,57 +2839,6 @@ string_to_core_addr (const char *my_string)
return addr;
}
-gdb::unique_xmalloc_ptr<char>
-gdb_realpath (const char *filename)
-{
-/* On most hosts, we rely on canonicalize_file_name to compute
- the FILENAME's realpath.
-
- But the situation is slightly more complex on Windows, due to some
- versions of GCC which were reported to generate paths where
- backlashes (the directory separator) were doubled. For instance:
- c:\\some\\double\\slashes\\dir
- ... instead of ...
- c:\some\double\slashes\dir
- Those double-slashes were getting in the way when comparing paths,
- for instance when trying to insert a breakpoint as follow:
- (gdb) b c:/some/double/slashes/dir/foo.c:4
- No source file named c:/some/double/slashes/dir/foo.c:4.
- (gdb) b c:\some\double\slashes\dir\foo.c:4
- No source file named c:\some\double\slashes\dir\foo.c:4.
- To prevent this from happening, we need this function to always
- strip those extra backslashes. While canonicalize_file_name does
- perform this simplification, it only works when the path is valid.
- Since the simplification would be useful even if the path is not
- valid (one can always set a breakpoint on a file, even if the file
- does not exist locally), we rely instead on GetFullPathName to
- perform the canonicalization. */
-
-#if defined (_WIN32)
- {
- char buf[MAX_PATH];
- DWORD len = GetFullPathName (filename, MAX_PATH, buf, NULL);
-
- /* The file system is case-insensitive but case-preserving.
- So it is important we do not lowercase the path. Otherwise,
- we might not be able to display the original casing in a given
- path. */
- if (len > 0 && len < MAX_PATH)
- return gdb::unique_xmalloc_ptr<char> (xstrdup (buf));
- }
-#else
- {
- char *rp = canonicalize_file_name (filename);
-
- if (rp != NULL)
- return gdb::unique_xmalloc_ptr<char> (rp);
- }
-#endif
-
- /* This system is a lost cause, just dup the buffer. */
- return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
-}
-
#if GDB_SELF_TEST
static void
@@ -2925,74 +2875,6 @@ gdb_realpath_tests ()
#endif /* GDB_SELF_TEST */
-/* Return a copy of FILENAME, with its directory prefix canonicalized
- by gdb_realpath. */
-
-gdb::unique_xmalloc_ptr<char>
-gdb_realpath_keepfile (const char *filename)
-{
- const char *base_name = lbasename (filename);
- char *dir_name;
- char *result;
-
- /* Extract the basename of filename, and return immediately
- a copy of filename if it does not contain any directory prefix. */
- if (base_name == filename)
- return gdb::unique_xmalloc_ptr<char> (xstrdup (filename));
-
- dir_name = (char *) alloca ((size_t) (base_name - filename + 2));
- /* Allocate enough space to store the dir_name + plus one extra
- character sometimes needed under Windows (see below), and
- then the closing \000 character. */
- strncpy (dir_name, filename, base_name - filename);
- dir_name[base_name - filename] = '\000';
-
-#ifdef HAVE_DOS_BASED_FILE_SYSTEM
- /* We need to be careful when filename is of the form 'd:foo', which
- is equivalent of d:./foo, which is totally different from d:/foo. */
- if (strlen (dir_name) == 2 && isalpha (dir_name[0]) && dir_name[1] == ':')
- {
- dir_name[2] = '.';
- dir_name[3] = '\000';
- }
-#endif
-
- /* Canonicalize the directory prefix, and build the resulting
- filename. If the dirname realpath already contains an ending
- directory separator, avoid doubling it. */
- gdb::unique_xmalloc_ptr<char> path_storage = gdb_realpath (dir_name);
- const char *real_path = path_storage.get ();
- if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
- result = concat (real_path, base_name, (char *) NULL);
- else
- result = concat (real_path, SLASH_STRING, base_name, (char *) NULL);
-
- return gdb::unique_xmalloc_ptr<char> (result);
-}
-
-/* Return PATH in absolute form, performing tilde-expansion if necessary.
- PATH cannot be NULL or the empty string.
- This does not resolve symlinks however, use gdb_realpath for that. */
-
-gdb::unique_xmalloc_ptr<char>
-gdb_abspath (const char *path)
-{
- gdb_assert (path != NULL && path[0] != '\0');
-
- if (path[0] == '~')
- return gdb::unique_xmalloc_ptr<char> (tilde_expand (path));
-
- if (IS_ABSOLUTE_PATH (path))
- return gdb::unique_xmalloc_ptr<char> (xstrdup (path));
-
- /* Beware the // my son, the Emacs barfs, the botch that catch... */
- return gdb::unique_xmalloc_ptr<char>
- (concat (current_directory,
- IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
- ? "" : SLASH_STRING,
- path, (char *) NULL));
-}
-
ULONGEST
align_up (ULONGEST v, int n)
{
@@ -295,12 +295,6 @@ extern struct cleanup *make_bpstat_clear_actions_cleanup (void);
/* Path utilities. */
-extern gdb::unique_xmalloc_ptr<char> gdb_realpath (const char *);
-
-extern gdb::unique_xmalloc_ptr<char> gdb_realpath_keepfile (const char *);
-
-extern gdb::unique_xmalloc_ptr<char> gdb_abspath (const char *);
-
extern int gdb_filename_fnmatch (const char *pattern, const char *string,
int flags);