diff --git a/lib/path.js b/lib/path.js index 87451e9375..5d69d2270f 100644 --- a/lib/path.js +++ b/lib/path.js @@ -96,7 +96,13 @@ if (isWindows) { // directories. If we've resolved a drive letter but not yet an // absolute path, get cwd for that drive. We're sure the device is not // an unc path at this points, because unc paths are always absolute. - path = process._cwdForDrive(resolvedDevice[0]); + path = process.env['=' + resolvedDevice]; + // Verify that a drive-local cwd was found and that it actually points + // to our drive. If not, default to the drive's root. + if (!path || path.slice(0, 3).toLowerCase() !== + resolvedDevice.toLowerCase() + '\\') { + path = resolvedDevice + '\\'; + } } // Skip empty and invalid entries diff --git a/src/node.cc b/src/node.cc index d429a9c7f2..6cbfd02748 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1262,77 +1262,6 @@ static Handle Cwd(const Arguments& args) { } -#ifdef _WIN32 -static Handle CwdForDrive(const Arguments& args) { - HandleScope scope; - - if (args.Length() < 1) { - Local exception = Exception::Error( - String::New("process._cwdForDrive takes exactly 1 argument.")); - return ThrowException(exception); - } - - Local driveLetter = args[0]->ToString(); - if (driveLetter->Length() != 1) { - Local exception = Exception::Error( - String::New("Drive name should be 1 character.")); - return ThrowException(exception); - } - - char drive; - - driveLetter->WriteAscii(&drive, 0, 1, 0); - if (drive >= 'a' && drive <= 'z') { - // Convert to uppercase - drive += 'A' - 'a'; - } else if (drive < 'A' || drive > 'Z') { - // Not a letter - Local exception = Exception::Error( - String::New("Drive name should be a letter.")); - return ThrowException(exception); - } - - WCHAR env_key[] = L"=X:"; - env_key[1] = (WCHAR) drive; - - DWORD len = GetEnvironmentVariableW(env_key, NULL, 0); - if (len == 0 && (GetLastError() == ERROR_ENVVAR_NOT_FOUND || - GetLastError() == ERROR_SUCCESS)) { - // There is no current directory for that drive. Default to drive + ":\". - Local cwd = String::Concat(String::New(&drive, 1), - String::New(":\\")); - return scope.Close(cwd); - - } else if (len == 0) { - // Error - Local exception = Exception::Error( - String::New(winapi_strerror(GetLastError()))); - return ThrowException(exception); - } - - WCHAR* buffer = new WCHAR[len]; - if (buffer == NULL) { - Local exception = Exception::Error( - String::New("Out of memory.")); - return ThrowException(exception); - } - - DWORD len2 = GetEnvironmentVariableW(env_key, buffer, len); - if ((len2 == 0 && GetLastError() != ERROR_SUCCESS) || len2 >= len) { - // Error - delete[] buffer; - Local exception = Exception::Error( - String::New(winapi_strerror(GetLastError()))); - return ThrowException(exception); - } - - Local cwd = String::New(reinterpret_cast(buffer), len2); - delete[] buffer; - return scope.Close(cwd); -} -#endif - - static Handle Umask(const Arguments& args) { HandleScope scope; unsigned int old; @@ -2177,10 +2106,6 @@ Handle SetupProcessObject(int argc, char *argv[]) { NODE_SET_METHOD(process, "chdir", Chdir); NODE_SET_METHOD(process, "cwd", Cwd); -#ifdef _WIN32 - NODE_SET_METHOD(process, "_cwdForDrive", CwdForDrive); -#endif - NODE_SET_METHOD(process, "umask", Umask); #ifdef __POSIX__