diff options
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r-- | winsup/cygwin/path.cc | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 76a009854..5dd13f67f 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -2994,8 +2994,14 @@ int chdir (const char *dir) { MALLOC_CHECK; - syscall_printf ("dir %s", dir); path_conv path (dir, PC_FULL | PC_SYM_FOLLOW); + if (path.error) + { + set_errno (path.error); + syscall_printf ("-1 = chdir (%s)", dir); + return -1; + } + syscall_printf ("dir %s", dir); char *s; /* Incredibly. Windows allows you to specify a path with trailing @@ -3005,13 +3011,6 @@ chdir (const char *dir) for (s = strchr (dir, '\0'); --s >= dir && isspace ((unsigned int) (*s & 0xff)); ) *s = '\0'; - if (path.error) - { - set_errno (path.error); - syscall_printf ("-1 = chdir (%s)", dir); - return -1; - } - /* Look for trailing path component consisting entirely of dots. This is needed only in case of chdir since Windows simply ignores count of dots > 2 here instead of returning an error code. Counts of dots @@ -3068,6 +3067,23 @@ chdir (const char *dir) return res; } +extern "C" +int +fchdir (int fd) +{ + sigframe thisframe (mainthread); + + if (cygheap->fdtab.not_open (fd)) + { + syscall_printf ("-1 = fchdir (%d)", fd); + set_errno (EBADF); + return -1; + } + int ret = chdir (cygheap->fdtab[fd]->get_name ()); + syscall_printf ("%d = fchdir (%d)", ret, fd); + return ret; +} + /******************** Exported Path Routines *********************/ /* Cover functions to the path conversion routines. |