From patchwork Mon Feb 12 19:57:32 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: 25919 Received: (qmail 130066 invoked by alias); 12 Feb 2018 19:57:48 -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 129809 invoked by uid 89); 12 Feb 2018 19:57:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.6 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; Mon, 12 Feb 2018 19:57:41 +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 D1D8983225; Mon, 12 Feb 2018 19:57:39 +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 21E18FD926; Mon, 12 Feb 2018 19:57:37 +0000 (UTC) From: Sergio Durigan Junior To: GDB Patches Cc: Simon Marchi , Sergio Durigan Junior Subject: [PATCH v2 1/2] Create new common/pathstuff.[ch] Date: Mon, 12 Feb 2018 14:57:32 -0500 Message-Id: <20180212195733.23639-2-sergiodj@redhat.com> In-Reply-To: <20180212195733.23639-1-sergiodj@redhat.com> References: <20180210014241.19278-3-sergiodj@redhat.com> <20180212195733.23639-1-sergiodj@redhat.com> X-IsSubscribed: yes Changes from v1: - Moved all of the "current_directory" modifications to this patch. - Eliminated spurious whitespace from comment. - Added new "gdb_tilde_expand_up" function, which returns a "gdb::unique_xmalloc_ptr". Updated "gdb_abspath" to use it. - Removed #include of "common/pathstuff.h" from "utils.h". Instead, include "common/pathstuff.h" only in those files that need it. 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: 2018-02-12 Sergio Durigan Junior * Makefile.in (SFILES): Add "common/pathstuff.c". (HFILES_NO_SRCDIR): Add "common/pathstuff.h". (COMMON_OBS): Add "pathstuff.o". * 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: 2018-02-12 Sergio Durigan Junior * server.c (current_directory): New global variable. (captured_main): Initialize "current_directory". * Makefile.in (SFILES): Add "$(srcdir)/common/pathstuff.c". (OBJS): Add "pathstuff.o". --- gdb/Makefile.in | 3 + 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 | 140 ++++++++++++++++++++++++++++++++++++++++++ gdb/common/pathstuff.h | 39 ++++++++++++ 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, 227 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 957654c9bd..64c9df3eaf 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1136,6 +1136,7 @@ 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 \ @@ -1427,6 +1428,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 \ @@ -1552,6 +1554,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ gdb_vecs.o \ mi/mi-common.o \ new-op.o \ + pathstuff.o \ print-utils.o \ ptid.o \ rsp-low.o \ 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..fc51edffa9 --- /dev/null +++ b/gdb/common/pathstuff.c @@ -0,0 +1,140 @@ +/* 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" + +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..909fd786bb --- /dev/null +++ b/gdb/common/pathstuff.h @@ -0,0 +1,39 @@ +/* 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. */ + +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. */ + +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 82e63d895f..3a1bb987b2 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 4fb2129b30..61be475858 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -423,10 +423,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 d651725bbe..a392423a13 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -86,6 +86,7 @@ #include #include #include +#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 c8c32ecc27..a5d071ec51 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -44,6 +44,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 3ce086d70f..4ac068c6dd 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 \ @@ -256,6 +257,7 @@ OBS = \ mem-break.o \ new-op.o \ notif.o \ + pathstuff.o \ print-utils.o \ ptid.o \ regcache.o \ diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index cb02b58507..f931273fa3 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) + { + warning (_("%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 794c97b48a..f178244f05 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 03b2d1e96d..ab0db19b48 100644 --- a/gdb/nto-tdep.c +++ b/gdb/nto-tdep.c @@ -31,6 +31,7 @@ #include "solib-svr4.h" #include "gdbcore.h" #include "objfiles.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 009bec5285..77f5e8d4d4 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);