unix, windows: make uv_cwd be consistent with uv_exepath

Fixes #446
This commit is contained in:
Saúl Ibarra Corretgé 2014-02-27 09:44:28 +01:00
parent 649dfc3037
commit 422d2810b3
5 changed files with 31 additions and 14 deletions

View File

@ -2076,7 +2076,7 @@ UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst);
UV_EXTERN int uv_exepath(char* buffer, size_t* size);
/* Gets the current working directory */
UV_EXTERN int uv_cwd(char* buffer, size_t size);
UV_EXTERN int uv_cwd(char* buffer, size_t* size);
/* Changes the current working directory */
UV_EXTERN int uv_chdir(const char* dir);

View File

@ -589,16 +589,14 @@ ssize_t uv__recvmsg(int fd, struct msghdr* msg, int flags) {
}
int uv_cwd(char* buffer, size_t size) {
if (buffer == NULL)
int uv_cwd(char* buffer, size_t* size) {
if (buffer == NULL || size == NULL)
return -EINVAL;
if (size == 0)
return -EINVAL;
if (getcwd(buffer, size) == NULL)
if (getcwd(buffer, *size) == NULL)
return -errno;
*size = strlen(buffer);
return 0;
}

View File

@ -163,12 +163,12 @@ int uv_exepath(char* buffer, size_t* size_ptr) {
}
int uv_cwd(char* buffer, size_t size) {
int uv_cwd(char* buffer, size_t* size) {
DWORD utf16_len;
WCHAR utf16_buffer[MAX_PATH];
int r;
if (buffer == NULL || size == 0) {
if (buffer == NULL || size == NULL) {
return UV_EINVAL;
}
@ -192,19 +192,36 @@ int uv_cwd(char* buffer, size_t size) {
utf16_buffer[utf16_len] = L'\0';
}
/* Check how much space we need */
r = WideCharToMultiByte(CP_UTF8,
0,
utf16_buffer,
-1,
NULL,
0,
NULL,
NULL);
if (r == 0) {
return uv_translate_sys_error(GetLastError());
} else if (r > (int) *size) {
*size = r;
return UV_ENOBUFS;
}
/* Convert to UTF-8 */
r = WideCharToMultiByte(CP_UTF8,
0,
utf16_buffer,
-1,
buffer,
size > INT_MAX ? INT_MAX : (int) size,
*size > INT_MAX ? INT_MAX : (int) *size,
NULL,
NULL);
if (r == 0) {
return uv_translate_sys_error(GetLastError());
}
*size = r;
return 0;
}

View File

@ -33,8 +33,8 @@ TEST_IMPL(cwd_and_chdir) {
char* last_slash;
int err;
size = sizeof(buffer_orig) / sizeof(buffer_orig[0]);
err = uv_cwd(buffer_orig, size);
size = sizeof(buffer_orig);
err = uv_cwd(buffer_orig, &size);
ASSERT(err == 0);
/* Remove trailing slash unless at a root directory. */
@ -55,7 +55,7 @@ TEST_IMPL(cwd_and_chdir) {
err = uv_chdir(buffer_orig);
ASSERT(err == 0);
err = uv_cwd(buffer_new, size);
err = uv_cwd(buffer_new, &size);
ASSERT(err == 0);
ASSERT(strcmp(buffer_orig, buffer_new) == 0);

View File

@ -1465,8 +1465,10 @@ TEST_IMPL(fs_symlink_dir) {
#ifdef _WIN32
{
static char src_path_buf[PATHMAX];
size_t size;
size = sizeof(src_path_buf);
strcpy(src_path_buf, "\\\\?\\");
uv_cwd(src_path_buf + 4, sizeof(src_path_buf));
uv_cwd(src_path_buf + 4, &size);
strcat(src_path_buf, "\\test_dir\\");
test_dir = src_path_buf;
}