Introduce gdb_tilde_expand
authorSergio Durigan Junior <sergiodj@redhat.com>
Mon, 11 Sep 2017 05:03:51 +0000 (01:03 -0400)
committerSergio Durigan Junior <sergiodj@redhat.com>
Wed, 4 Oct 2017 05:57:29 +0000 (01:57 -0400)
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  <sergiodj@redhat.com>

* 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  <sergiodj@redhat.com>

* Makefile.in (SFILES): Add $(srcdir)/common/gdb_tilde_expand.c.
(OBS): Add gdb_tilde_expand.o.

gdb/ChangeLog
gdb/Makefile.in
gdb/common/gdb_tilde_expand.c [new file with mode: 0644]
gdb/common/gdb_tilde_expand.h [new file with mode: 0644]
gdb/gdbserver/ChangeLog
gdb/gdbserver/Makefile.in

index e9cb48ce8e03807a29d4beb7d712ccf0fc157d4f..6f9c7e6ca614b6fc9270ac4f7aaa8408bd7020f4 100644 (file)
@@ -1,3 +1,11 @@
+2017-10-04  Sergio Durigan Junior  <sergiodj@redhat.com>
+
+       * 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  <macro@imgtec.com>
 
        * gdbarch.sh (objfile): Remove duplicate declaration.
index f3f1d404ba89999091c6d01757fdced09b932c7c..9454e3a62fc8d93a2a8b2cb1ee3def4a99f8cc62 100644 (file)
@@ -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 (file)
index 0000000..8dd9423
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.  */
+
+#include "common-defs.h"
+#include "gdb_tilde_expand.h"
+#include <glob.h>
+
+/* 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 (file)
index 0000000..2ec0563
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.  */
+
+#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 */
index 67223a06182a7ef4b6974a6ab28a56c6e5a717bc..3de4b102b0a6a187f2d265e9831bdd98419785c1 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-04  Sergio Durigan Junior  <sergiodj@redhat.com>
+
+       * Makefile.in (SFILES): Add $(srcdir)/common/gdb_tilde_expand.c.
+       (OBS): Add gdb_tilde_expand.o.
+
 2017-10-02  Simon Marchi  <simon.marchi@ericsson.com>
 
        * lynx-i386-low.c (lynx_i386_arch_setup): Call init_target_desc.
index 1bbe5156295bfb7358855c814446d6f58ac60af8..6c931ba9522b2275d6906af42e09667fda591195 100644 (file)
@@ -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 \