summaryrefslogtreecommitdiff
path: root/gdb/common
diff options
context:
space:
mode:
authorSergio Durigan Junior <sergiodj@redhat.com>2017-09-11 01:03:51 -0400
committerSergio Durigan Junior <sergiodj@redhat.com>2017-10-04 01:57:29 -0400
commit7da0a8867419fc4a2a64d49cc71a14bd145cebff (patch)
treeb226a30bb410d61dea4e27c0dbd8ec42e440f3af /gdb/common
parenta5259595e7a6faac0240d257f7e9cfa599557d2e (diff)
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 <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.
Diffstat (limited to 'gdb/common')
-rw-r--r--gdb/common/gdb_tilde_expand.c82
-rw-r--r--gdb/common/gdb_tilde_expand.h27
2 files changed, 109 insertions, 0 deletions
diff --git a/gdb/common/gdb_tilde_expand.c b/gdb/common/gdb_tilde_expand.c
new file mode 100644
index 0000000000..8dd94239f9
--- /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 <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
index 0000000000..2ec0563d9a
--- /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 <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 */