This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 3/4] Introduce gdb_chdir
- From: Sergio Durigan Junior <sergiodj at redhat dot com>
- To: GDB Patches <gdb-patches at sourceware dot org>
- Cc: Pedro Alves <palves at redhat dot com>, Sergio Durigan Junior <sergiodj at redhat dot com>
- Date: Tue, 12 Sep 2017 00:23:24 -0400
- Subject: [PATCH 3/4] Introduce gdb_chdir
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=sergiodj at redhat dot com
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 71CE1AC1AC
- References: <20170912042325.14927-1-sergiodj@redhat.com>
In order to be able to change the inferior's directory before its
execution, it is necessary to perform a tilde expansion of the
directory provided by the user and then chdir into the resulting dir.
This is what gdb_chdir does.
Unfortunately it is not possible to use "tilde_expand" from readline
because this is common code and gdbserver doesn't use readline. For
that reason I decided to go with "glob" and its GNU extension,
GLOB_TILDE. With the import of the "glob" module from gnulib, this is
a no-brainer.
gdb/ChangeLog:
yyyy-mm-dd Sergio Durigan Junior <sergiodj@redhat.com>
* Makefile.in (SFILES): Add gdb_chdir.c.
(HFILES_NO_SRCDIR): Add gdb_chdir.h.
(COMMON_OBS): Add gdb_chdir.o.
* common/gdb_chdir.c: New file.
* common/gdb_chdir.h: Likewise.
gdb/gdbserver/ChangeLog:
yyyy-mm-dd Sergio Durigan Junior <sergiodj@redhat.com>
* Makefile.in (SFILES): Add $(srcdir)/common/gdb_chdir.c.
(OBS): Add gdb_chdir.o.
---
gdb/Makefile.in | 3 +++
gdb/common/gdb_chdir.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++
gdb/common/gdb_chdir.h | 26 ++++++++++++++++++++
gdb/gdbserver/Makefile.in | 2 ++
4 files changed, 91 insertions(+)
create mode 100644 gdb/common/gdb_chdir.c
create mode 100644 gdb/common/gdb_chdir.h
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 2aa474e598..38c89761dd 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1243,6 +1243,7 @@ SFILES = \
common/filestuff.c \
common/format.c \
common/job-control.c \
+ common/gdb_chdir.c \
common/gdb_vecs.c \
common/new-op.c \
common/print-utils.c \
@@ -1527,6 +1528,7 @@ HFILES_NO_SRCDIR = \
common/fileio.h \
common/format.h \
common/gdb_assert.h \
+ common/gdb_chdir.h \
common/gdb_locale.h \
common/gdb_setjmp.h \
common/gdb_signals.h \
@@ -1732,6 +1734,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
frame-unwind.o \
gcore.o \
gdb_bfd.o \
+ gdb_chdir.o \
gdb-dlfcn.o \
gdb_obstack.o \
gdb_regex.o \
diff --git a/gdb/common/gdb_chdir.c b/gdb/common/gdb_chdir.c
new file mode 100644
index 0000000000..16e2b3adf0
--- /dev/null
+++ b/gdb/common/gdb_chdir.c
@@ -0,0 +1,60 @@
+/* chdir(2) wrapper 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 <glob.h>
+#include "gdb_chdir.h"
+
+/* Perform path expansion (i.e., tilde expansion) on DIR, and return
+ the full path. */
+
+static std::string
+expand_path (const char *dir)
+{
+ glob_t g;
+ std::string expanded_dir;
+ int err = glob (dir, GLOB_TILDE | GLOB_TILDE_CHECK | GLOB_ONLYDIR, NULL, &g);
+
+ if (err != 0)
+ {
+ if (err == GLOB_NOMATCH)
+ error (_("No such directory '%s'. Failure to set cwd."), dir);
+
+ error (_("Could not process directory '%s'."), dir);
+ }
+
+ gdb_assert (g.gl_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. */
+ expanded_dir = g.gl_pathv[0];
+ globfree (&g);
+
+ return expanded_dir;
+}
+
+/* See gdb_chdir.h. */
+
+void
+gdb_chdir (const char *dir)
+{
+ std::string expanded_dir = expand_path (dir);
+
+ if (chdir (expanded_dir.c_str ()) < 0)
+ perror_with_name (expanded_dir.c_str ());
+}
diff --git a/gdb/common/gdb_chdir.h b/gdb/common/gdb_chdir.h
new file mode 100644
index 0000000000..5e6253e3b5
--- /dev/null
+++ b/gdb/common/gdb_chdir.h
@@ -0,0 +1,26 @@
+/* chdir(2) wrapper 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 HAVE_GDB_CHDIR_H
+#define HAVE_GDB_CHDIR_H
+
+/* Perform a "chdir" to DIR, doing the proper tilde expansion before. */
+extern void gdb_chdir (const char *dir);
+
+#endif /* ! HAVE_GDB_CHDIR_H */
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 1bbe515629..ecd12a7dcc 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_chdir.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_chdir.o \
gdb_vecs.o \
hostio.o \
inferiors.o \
--
2.13.3