diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2010-08-19 10:14:31 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2010-08-19 10:14:31 +0000 |
commit | e652eb9230f1182a18b514317ec6cf22a168ca3f (patch) | |
tree | d082931adb055b7f5a93e5f23d84b0e31ce186b4 | |
parent | 1087b2462f99ee7a1e06259e88559d2e5d22b1d9 (diff) | |
download | cygnal-e652eb9230f1182a18b514317ec6cf22a168ca3f.tar.gz cygnal-e652eb9230f1182a18b514317ec6cf22a168ca3f.tar.bz2 cygnal-e652eb9230f1182a18b514317ec6cf22a168ca3f.zip |
* external.cc (sync_wincwd): New function.
(cygwin_internal): Rename CW_SETCWD to CW_SYNC_WINCWD. Call
sync_wincwd from here.
* include/sys/cygwin.h (cygwin_getinfo_types): Rename CW_SETCWD to
CW_SYNC_WINCWD.
-rw-r--r-- | winsup/cygwin/ChangeLog | 8 | ||||
-rw-r--r-- | winsup/cygwin/external.cc | 32 | ||||
-rw-r--r-- | winsup/cygwin/include/sys/cygwin.h | 2 |
3 files changed, 35 insertions, 7 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 547f0b139..6fa859452 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2010-08-19 Corinna Vinschen <corinna@vinschen.de> + + * external.cc (sync_wincwd): New function. + (cygwin_internal): Rename CW_SETCWD to CW_SYNC_WINCWD. Call + sync_wincwd from here. + * include/sys/cygwin.h (cygwin_getinfo_types): Rename CW_SETCWD to + CW_SYNC_WINCWD. + 2010-08-18 Christopher Faylor <me+cygwin@cgf.cx> * external.cc (CW_SETCWD): New option. diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc index 53ce5b1b8..e8d3580f4 100644 --- a/winsup/cygwin/external.cc +++ b/winsup/cygwin/external.cc @@ -162,6 +162,29 @@ sync_winenv () free (envblock); } +/* Synchronize Win32 CWD with Cygwin CWD. Return -1 and set errno if + setting the Win32 CWD fails. */ +static unsigned long +sync_wincwd () +{ + unsigned long ret = (unsigned long) -1; + /* Lock cwd. We're accessing it directly here. */ + cygheap->cwd.cwd_lock.acquire (); + /* First check if the path can work at all. Fortunately we already have + an error code in the cwd, which was stored there for the sake of + spawn_guts. */ + if (cygheap->cwd.get_error ()) + set_errno (cygheap->cwd.get_error ()); + /* Of course, SetCurrentDirectoryW still can fail, for instance, if the + CWD has been removed or renamed in the meantime. */ + else if (!SetCurrentDirectoryW (cygheap->cwd.win32.Buffer)) + __seterrno (); + else + ret = 0; + cygheap->cwd.cwd_lock.release (); + return ret; +} + /* * Cygwin-specific wrapper for win32 ExitProcess and TerminateProcess. * It ensures that the correct exit code, derived from the specified @@ -514,13 +537,10 @@ cygwin_internal (cygwin_getinfo_types t, ...) res = (uintptr_t) strerror (err); } break; + case CW_SYNC_WINCWD: + res = sync_wincwd (); + break; - case CW_SETCWD: - { - cygheap->cwd.cwd_lock.acquire (); - PWCHAR cwd = cygheap->cwd.win32.Buffer; - res = !SetCurrentDirectoryW (cwd); - } default: set_errno (ENOSYS); } diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h index 158fa0db1..aa4ce4d7c 100644 --- a/winsup/cygwin/include/sys/cygwin.h +++ b/winsup/cygwin/include/sys/cygwin.h @@ -150,7 +150,7 @@ typedef enum CW_CVT_MNT_OPTS, CW_LST_MNT_OPTS, CW_STRERROR, - CW_SETCWD + CW_SYNC_WINCWD } cygwin_getinfo_types; /* Token type for CW_SET_EXTERNAL_TOKEN */ |