From patchwork Thu Sep 21 22:59:23 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: 23071 Received: (qmail 45923 invoked by alias); 21 Sep 2017 22:59:36 -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 45856 invoked by uid 89); 21 Sep 2017 22:59:35 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=sysroot 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; Thu, 21 Sep 2017 22:59:34 +0000 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 08BE280F7A for ; Thu, 21 Sep 2017 22:59:33 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 08BE280F7A Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.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 3C2396BF86; Thu, 21 Sep 2017 22:59:32 +0000 (UTC) From: Sergio Durigan Junior To: GDB Patches Cc: Pedro Alves , Sergio Durigan Junior Subject: [PATCH v3 2/5] Get rid of "gdb_dirbuf" and use "getcwd (NULL, 0)" Date: Thu, 21 Sep 2017 18:59:23 -0400 Message-Id: <20170921225926.23132-3-sergiodj@redhat.com> In-Reply-To: <20170921225926.23132-1-sergiodj@redhat.com> References: <20170912042325.14927-1-sergiodj@redhat.com> <20170921225926.23132-1-sergiodj@redhat.com> X-IsSubscribed: yes Currently we have "current_directory" and "gdb_dirbuf" globals, which means that we basically have two possible places to consult when we want to know GDB's current working directory. This is not ideal and can lead to confusion. Moreover, the way we're using "gdb_difbuf" along with "getcwd" is problematic because we declare the buffer with "1024" elements hardcoded, which does not take into account longer pathnames that are possible in many filesystems. Using "PATH_MAX" would also not be a solution because of portability problems. Therefore, the best solution is to rely on the fact that "getcwd (NULL, 0)" will "do the right thing" and return a heap-allocated string containing the full path. With the new "getcwd" module from gnulib, it is now possible to do that without worrying about breaking some host. With this patch "current_directory" is now the only place to check for GDB's cwd. gdb/ChangeLog: yyyy-mm-dd Sergio Durigan Junior * cli/cli-cmds.c (pwd_command): Use "getcwd (NULL, 0)". (cd_command): Likewise. Free "current_directory" before assigning to it. * main.c (captured_main_1): Use "getcwd (NULL, 0)". * mi/mi-cmd-env.c (mi_cmd_env_pwd): Likewise. * top.c (gdb_dirbuf): Remove global declaration. * top.h (gdb_dirbuf): Likewise. Reviewed-by: Pedro Alves --- gdb/cli/cli-cmds.c | 17 ++++++++++++----- gdb/main.c | 5 ++--- gdb/mi/mi-cmd-env.c | 8 ++++---- gdb/top.c | 3 --- gdb/top.h | 1 - 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 260fd3f635..cbafb13837 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -384,13 +384,16 @@ pwd_command (char *args, int from_tty) { if (args) error (_("The \"pwd\" command does not take an argument: %s"), args); - if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf))) + + gdb::unique_xmalloc_ptr cwd (getcwd (NULL, 0)); + + if (cwd == NULL) error (_("Error finding name of working directory: %s"), safe_strerror (errno)); - if (strcmp (gdb_dirbuf, current_directory) != 0) + if (strcmp (cwd.get (), current_directory) != 0) printf_unfiltered (_("Working directory %s\n (canonically %s).\n"), - current_directory, gdb_dirbuf); + current_directory, cwd.get ()); else printf_unfiltered (_("Working directory %s.\n"), current_directory); } @@ -418,7 +421,8 @@ cd_command (char *dir, int from_tty) /* There's too much mess with DOSish names like "d:", "d:.", "d:./foo" etc. Instead of having lots of special #ifdef'ed code, simply get the canonicalized name of the current directory. */ - dir = getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)); + gdb::unique_xmalloc_ptr cwd (getcwd (NULL, 0)); + dir = cwd.get (); #endif len = strlen (dir); @@ -436,7 +440,10 @@ cd_command (char *dir, int from_tty) dir_holder.reset (savestring (dir, len)); if (IS_ABSOLUTE_PATH (dir_holder.get ())) - current_directory = dir_holder.release (); + { + xfree (current_directory); + current_directory = dir_holder.release (); + } else { if (IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])) diff --git a/gdb/main.c b/gdb/main.c index fe80511243..66ba75ba21 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -549,11 +549,10 @@ captured_main_1 (struct captured_main_args *context) (xstrprintf ("%s: warning: ", gdb_program_name)); warning_pre_print = tmp_warn_preprint.get (); - if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf))) + current_directory = getcwd (NULL, 0); + if (current_directory == NULL) perror_warning_with_name (_("error finding working directory")); - current_directory = gdb_dirbuf; - /* Set the sysroot path. */ gdb_sysroot = relocate_gdb_directory (TARGET_SYSTEM_ROOT, TARGET_SYSTEM_ROOT_RELOCATABLE); diff --git a/gdb/mi/mi-cmd-env.c b/gdb/mi/mi-cmd-env.c index 977b6e274d..db87ead33d 100644 --- a/gdb/mi/mi-cmd-env.c +++ b/gdb/mi/mi-cmd-env.c @@ -73,12 +73,12 @@ mi_cmd_env_pwd (const char *command, char **argv, int argc) } /* Otherwise the mi level is 2 or higher. */ - - if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf))) + gdb::unique_xmalloc_ptr cwd (getcwd (NULL, 0)); + if (cwd == NULL) error (_("-environment-pwd: error finding name of working directory: %s"), safe_strerror (errno)); - - uiout->field_string ("cwd", gdb_dirbuf); + + uiout->field_string ("cwd", cwd.get ()); } /* Change working directory. */ diff --git a/gdb/top.c b/gdb/top.c index 404e096755..c89e78f243 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -133,9 +133,6 @@ show_confirm (struct ui_file *file, int from_tty, char *current_directory; -/* The directory name is actually stored here (usually). */ -char gdb_dirbuf[1024]; - /* The last command line executed on the console. Used for command repetitions. */ char *saved_command_line; diff --git a/gdb/top.h b/gdb/top.h index 45798897f6..6b66083995 100644 --- a/gdb/top.h +++ b/gdb/top.h @@ -219,7 +219,6 @@ extern void ui_unregister_input_event_handler (struct ui *ui); /* From top.c. */ extern char *saved_command_line; extern int confirm; -extern char gdb_dirbuf[1024]; extern int inhibit_gdbinit; extern const char gdbinit[];