mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-06-23 22:07:58 +02:00
145 lines
2.9 KiB
Plaintext
145 lines
2.9 KiB
Plaintext
*** ../bash-2.05b-patched/builtins/cd.def Mon Jul 15 14:51:39 2002
|
|
--- builtins/cd.def Sun Nov 7 15:13:42 2004
|
|
***************
|
|
*** 122,126 ****
|
|
the_current_working_directory () */
|
|
static char *
|
|
! resetpwd ()
|
|
{
|
|
char *tdir;
|
|
--- 124,129 ----
|
|
the_current_working_directory () */
|
|
static char *
|
|
! resetpwd (caller)
|
|
! char *caller;
|
|
{
|
|
char *tdir;
|
|
***************
|
|
*** 128,132 ****
|
|
FREE (the_current_working_directory);
|
|
the_current_working_directory = (char *)NULL;
|
|
! tdir = get_working_directory ("cd");
|
|
return (tdir);
|
|
}
|
|
--- 131,135 ----
|
|
FREE (the_current_working_directory);
|
|
the_current_working_directory = (char *)NULL;
|
|
! tdir = get_working_directory (caller);
|
|
return (tdir);
|
|
}
|
|
***************
|
|
*** 333,336 ****
|
|
--- 340,349 ----
|
|
directory = tcwd ? (verbatim_pwd ? sh_physpath (tcwd, 0) : tcwd)
|
|
: get_working_directory ("pwd");
|
|
+
|
|
+ /* Try again using getcwd() if canonicalization fails (for instance, if
|
|
+ the file system has changed state underneath bash). */
|
|
+ if (tcwd && directory == 0)
|
|
+ directory = resetpwd ("pwd");
|
|
+
|
|
#undef tcwd
|
|
|
|
***************
|
|
*** 364,368 ****
|
|
{
|
|
char *t, *tdir;
|
|
! int err, canon_failed;
|
|
|
|
tdir = (char *)NULL;
|
|
--- 379,383 ----
|
|
{
|
|
char *t, *tdir;
|
|
! int err, canon_failed, r;
|
|
|
|
tdir = (char *)NULL;
|
|
***************
|
|
*** 399,403 ****
|
|
if (posixly_correct && nolinks == 0 && canon_failed)
|
|
{
|
|
! errno = ENOENT;
|
|
return (0);
|
|
}
|
|
--- 414,423 ----
|
|
if (posixly_correct && nolinks == 0 && canon_failed)
|
|
{
|
|
! #if defined ENAMETOOLONG
|
|
! if (errno != ENOENT && errno != ENAMETOOLONG)
|
|
! #else
|
|
! if (errno != ENOENT)
|
|
! #endif
|
|
! errno = ENOTDIR;
|
|
return (0);
|
|
}
|
|
***************
|
|
*** 409,418 ****
|
|
shell's idea of the_current_working_directory. */
|
|
if (canon_failed)
|
|
- resetpwd ();
|
|
- else
|
|
{
|
|
! FREE (the_current_working_directory);
|
|
! the_current_working_directory = tdir;
|
|
}
|
|
|
|
return (1);
|
|
--- 429,439 ----
|
|
shell's idea of the_current_working_directory. */
|
|
if (canon_failed)
|
|
{
|
|
! t = resetpwd ("cd");
|
|
! if (t == 0)
|
|
! set_working_directory (tdir);
|
|
}
|
|
+ else
|
|
+ set_working_directory (tdir);
|
|
|
|
return (1);
|
|
***************
|
|
*** 425,429 ****
|
|
|
|
err = errno;
|
|
- free (tdir);
|
|
|
|
/* We're not in physical mode (nolinks == 0), but we failed to change to
|
|
--- 446,449 ----
|
|
***************
|
|
*** 432,445 ****
|
|
if (chdir (newdir) == 0)
|
|
{
|
|
! tdir = resetpwd ();
|
|
! FREE (tdir);
|
|
|
|
! return (1);
|
|
}
|
|
else
|
|
{
|
|
errno = err;
|
|
! return (0);
|
|
}
|
|
}
|
|
|
|
--- 452,471 ----
|
|
if (chdir (newdir) == 0)
|
|
{
|
|
! t = resetpwd ("cd");
|
|
! if (t == 0)
|
|
! set_working_directory (tdir);
|
|
! else
|
|
! free (t);
|
|
|
|
! r = 1;
|
|
}
|
|
else
|
|
{
|
|
errno = err;
|
|
! r = 0;
|
|
}
|
|
+
|
|
+ free (tdir);
|
|
+ return r;
|
|
}
|
|
|
|
|
|
|