From 7da0a8867419fc4a2a64d49cc71a14bd145cebff Mon Sep 17 00:00:00 2001 From: Sergio Durigan Junior Date: Mon, 11 Sep 2017 01:03:51 -0400 Subject: [PATCH] Introduce gdb_tilde_expand Currently, whenever we want to handle paths provided by the user and perform tilde expansion on GDB, we rely on "tilde_expand", which comes from readline. This was enough for our use cases so far, but the situation will change when we start dealing with paths on gdbserver as well, which is what the next patches implement. Unfortunately it is not possible to use "tilde_expand" in this case because gdbserver doesn't use readline. For that reason I decided to implement a new "gdb_tilde_expand" function, which is basically a wrapper for "glob" and its GNU extension, GLOB_TILDE_CHECK. With the import of the "glob" module from gnulib, we're sure that "glob" always supports this extension. gdb/ChangeLog: 2017-10-04 Sergio Durigan Junior * Makefile.in (SFILES): Add gdb_tilde_expand.c. (HFILES_NO_SRCDIR): Add gdb_tilde_expand.h. (COMMON_OBS): Add gdb_tilde_expand.o. * common/gdb_tilde_expand.c: New file. * common/gdb_tilde_expand.h: Likewise. gdb/gdbserver/ChangeLog: 2017-10-04 Sergio Durigan Junior * Makefile.in (SFILES): Add $(srcdir)/common/gdb_tilde_expand.c. (OBS): Add gdb_tilde_expand.o. --- gdb/ChangeLog | 8 ++++ gdb/Makefile.in | 3 ++ gdb/common/gdb_tilde_expand.c | 82 +++++++++++++++++++++++++++++++++++ gdb/common/gdb_tilde_expand.h | 27 ++++++++++++ gdb/gdbserver/ChangeLog | 5 +++ gdb/gdbserver/Makefile.in | 2 + 6 files changed, 127 insertions(+) create mode 100644 gdb/common/gdb_tilde_expand.c create mode 100644 gdb/common/gdb_tilde_expand.h diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e9cb48ce8e0..6f9c7e6ca61 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2017-10-04 Sergio Durigan Junior + + * Makefile.in (SFILES): Add gdb_tilde_expand.c. + (HFILES_NO_SRCDIR): Add gdb_tilde_expand.h. + (COMMON_OBS): Add gdb_tilde_expand.o. + * common/gdb_tilde_expand.c: New file. + * common/gdb_tilde_expand.h: Likewise. + 2017-10-03 Maciej W. Rozycki * gdbarch.sh (objfile): Remove duplicate declaration. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index f3f1d404ba8..9454e3a62fc 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1248,6 +1248,7 @@ SFILES = \ common/filestuff.c \ common/format.c \ common/job-control.c \ + common/gdb_tilde_expand.c \ common/gdb_vecs.c \ common/new-op.c \ common/print-utils.c \ @@ -1532,6 +1533,7 @@ HFILES_NO_SRCDIR = \ common/fileio.h \ common/format.h \ common/gdb_assert.h \ + common/gdb_tilde_expand.h \ common/gdb_locale.h \ common/gdb_setjmp.h \ common/gdb_signals.h \ @@ -1737,6 +1739,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ frame-unwind.o \ gcore.o \ gdb_bfd.o \ + gdb_tilde_expand.o \ gdb-dlfcn.o \ gdb_obstack.o \ gdb_regex.o \ diff --git a/gdb/common/gdb_tilde_expand.c b/gdb/common/gdb_tilde_expand.c new file mode 100644 index 00000000000..8dd94239f9a --- /dev/null +++ b/gdb/common/gdb_tilde_expand.c @@ -0,0 +1,82 @@ +/* Perform tilde expansion on paths for GDB and gdbserver. + + Copyright (C) 2017 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 "gdb_tilde_expand.h" +#include + +/* RAII-style class wrapping "glob". */ + +class gdb_glob +{ +public: + /* Construct a "gdb_glob" object by calling "glob" with the provided + parameters. This function can throw if "glob" fails. */ + gdb_glob (const char *pattern, int flags, + int (*errfunc) (const char *epath, int eerrno)) + { + int ret = glob (pattern, flags, errfunc, &m_glob); + + if (ret != 0) + { + if (ret == GLOB_NOMATCH) + error (_("Could not find a match for '%s'."), pattern); + else + error (_("glob could not process pattern '%s'."), + pattern); + } + } + + /* Destroy the object and free M_GLOB. */ + ~gdb_glob () + { + globfree (&m_glob); + } + + /* Return the GL_PATHC component of M_GLOB. */ + int pathc () const + { + return m_glob.gl_pathc; + } + + /* Return the GL_PATHV component of M_GLOB. */ + char **pathv () const + { + return m_glob.gl_pathv; + } + +private: + /* The actual glob object we're dealing with. */ + glob_t m_glob; +}; + +/* See common/gdb_tilde_expand.h. */ + +std::string +gdb_tilde_expand (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. */ + std::string expanded_dir = glob.pathv ()[0]; + + return expanded_dir; +} diff --git a/gdb/common/gdb_tilde_expand.h b/gdb/common/gdb_tilde_expand.h new file mode 100644 index 00000000000..2ec0563d9ac --- /dev/null +++ b/gdb/common/gdb_tilde_expand.h @@ -0,0 +1,27 @@ +/* Perform tilde expansion on paths for GDB and gdbserver. + + Copyright (C) 2017 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 GDB_TILDE_EXPAND_H +#define GDB_TILDE_EXPAND_H + +/* Perform path expansion (i.e., tilde expansion) on DIR, and return + the full path. */ +extern std::string gdb_tilde_expand (const char *dir); + +#endif /* ! GDB_TILDE_EXPAND_H */ diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 67223a06182..3de4b102b0a 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2017-10-04 Sergio Durigan Junior + + * Makefile.in (SFILES): Add $(srcdir)/common/gdb_tilde_expand.c. + (OBS): Add gdb_tilde_expand.o. + 2017-10-02 Simon Marchi * lynx-i386-low.c (lynx_i386_arch_setup): Call init_target_desc. diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index 1bbe5156295..6c931ba9522 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -205,6 +205,7 @@ SFILES = \ $(srcdir)/common/fileio.c \ $(srcdir)/common/filestuff.c \ $(srcdir)/common/job-control.c \ + $(srcdir)/common/gdb_tilde_expand.c \ $(srcdir)/common/gdb_vecs.c \ $(srcdir)/common/new-op.c \ $(srcdir)/common/print-utils.c \ @@ -247,6 +248,7 @@ OBS = \ fileio.o \ filestuff.o \ format.o \ + gdb_tilde_expand.o \ gdb_vecs.o \ hostio.o \ inferiors.o \ -- 2.30.2