Get rid of "gdb_dirbuf" and use "getcwd (NULL, 0)"
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. Reviewed-by: Pedro Alves <palves@redhat.com> gdb/ChangeLog: 2017-09-22 Sergio Durigan Junior <sergiodj@redhat.com> * 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.
This commit is contained in:
parent
6ec2e0f5bd
commit
43573013c9
6 changed files with 28 additions and 15 deletions
|
@ -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<char> 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<char> 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]))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue