From patchwork Tue Sep 12 04:23:24 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergio Durigan Junior X-Patchwork-Id: 22834 Received: (qmail 78072 invoked by alias); 12 Sep 2017 04:23:38 -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 78004 invoked by uid 89); 12 Sep 2017 04:23:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=obs X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 12 Sep 2017 04:23:35 +0000 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 71CE1AC1AC for ; Tue, 12 Sep 2017 04:23:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 71CE1AC1AC 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@redhat.com Received: from psique.yyz.redhat.com (unused-10-15-17-193.yyz.redhat.com [10.15.17.193]) by smtp.corp.redhat.com (Postfix) with ESMTP id D2D0570BD4; Tue, 12 Sep 2017 04:23:33 +0000 (UTC) From: Sergio Durigan Junior To: GDB Patches Cc: Pedro Alves , Sergio Durigan Junior Subject: [PATCH 3/4] Introduce gdb_chdir Date: Tue, 12 Sep 2017 00:23:24 -0400 Message-Id: <20170912042325.14927-4-sergiodj@redhat.com> In-Reply-To: <20170912042325.14927-1-sergiodj@redhat.com> References: <20170912042325.14927-1-sergiodj@redhat.com> X-IsSubscribed: yes 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 * 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 * 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 . */ + +#include "common-defs.h" +#include +#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 . */ + +#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 \