From patchwork Wed Feb 28 03:27:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergio Durigan Junior X-Patchwork-Id: 26116 Received: (qmail 66084 invoked by alias); 28 Feb 2018 03:27:19 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 65952 invoked by uid 89); 28 Feb 2018 03:27:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_LOW, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx3-rdu2.redhat.com (HELO mx1.redhat.com) (66.187.233.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 28 Feb 2018 03:27:13 +0000 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 207D2813F6FF; Wed, 28 Feb 2018 03:27:12 +0000 (UTC) Received: from psique.yyz.redhat.com (unused-10-15-17-196.yyz.redhat.com [10.15.17.196]) by smtp.corp.redhat.com (Postfix) with ESMTP id A5A50946A5; Wed, 28 Feb 2018 03:27:09 +0000 (UTC) From: Sergio Durigan Junior To: GDB Patches Cc: Simon Marchi , Pedro Alves , Joel Brobecker , Sergio Durigan Junior Subject: [PATCH v3 1/2] Create new common/pathstuff.[ch] Date: Tue, 27 Feb 2018 22:27:07 -0500 Message-Id: <20180228032708.19670-2-sergiodj@redhat.com> In-Reply-To: <20180228032708.19670-1-sergiodj@redhat.com> References: <20180210014241.19278-3-sergiodj@redhat.com> <20180228032708.19670-1-sergiodj@redhat.com> X-IsSubscribed: yes 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 * 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 * 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 +#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 +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 (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. */ +extern gdb::unique_xmalloc_ptr 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 . */ + +#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 +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 (xstrdup (buf)); + } +#else + { + char *rp = canonicalize_file_name (filename); + + if (rp != NULL) + return gdb::unique_xmalloc_ptr (rp); + } +#endif + + /* This system is a lost cause, just dup the buffer. */ + return gdb::unique_xmalloc_ptr (xstrdup (filename)); +} + +/* See common/pathstuff.h. */ + +gdb::unique_xmalloc_ptr +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 (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 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 (result); +} + +/* See common/pathstuff.h. */ + +gdb::unique_xmalloc_ptr +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 (xstrdup (path)); + + /* Beware the // my son, the Emacs barfs, the botch that catch... */ + return gdb::unique_xmalloc_ptr + (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 . */ + +#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 gdb_realpath (const char *filename); + +/* Return a copy of FILENAME, with its directory prefix canonicalized + by gdb_realpath. */ + +extern gdb::unique_xmalloc_ptr + 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 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 #include #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 #include "solist.h" #include +#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 #include "nat/linux-namespaces.h" #include +#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 +#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 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 +#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 +#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 +#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 -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 (xstrdup (buf)); - } -#else - { - char *rp = canonicalize_file_name (filename); - - if (rp != NULL) - return gdb::unique_xmalloc_ptr (rp); - } -#endif - - /* This system is a lost cause, just dup the buffer. */ - return gdb::unique_xmalloc_ptr (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 -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 (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 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 (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 -gdb_abspath (const char *path) -{ - gdb_assert (path != NULL && path[0] != '\0'); - - if (path[0] == '~') - return gdb::unique_xmalloc_ptr (tilde_expand (path)); - - if (IS_ABSOLUTE_PATH (path)) - return gdb::unique_xmalloc_ptr (xstrdup (path)); - - /* Beware the // my son, the Emacs barfs, the botch that catch... */ - return gdb::unique_xmalloc_ptr - (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 gdb_realpath (const char *); - -extern gdb::unique_xmalloc_ptr gdb_realpath_keepfile (const char *); - -extern gdb::unique_xmalloc_ptr gdb_abspath (const char *); - extern int gdb_filename_fnmatch (const char *pattern, const char *string, int flags);