summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/path.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r--winsup/cygwin/path.cc32
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.