summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-16 17:34:44 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-16 17:34:44 +0000
commit2368dbdfa3c438b614a4727bde7cacac2d0a87a9 (patch)
treea3580abe631e47b8fc161eb5085587023cf19bfa /win32
parent3ca42c0435512e44f4662152afa62100be968c8f (diff)
merge revision(s) 58745,58780,59040,60743: [Backport #13863]
rb_w32_ugetcwd: UTF-8 version getcwd * dir.c (rb_dir_getwd): convert from UTF-8. * win32/win32.c (w32_getcwd): codepage aware getcwd using GetCurrentDirectoryW. potential memory leak * dir.c (rb_dir_getwd): get rid of potential memory leak. * util.c (ruby_getcwd): ditto. file.c: realpath in OS path encoding * dir.c (rb_dir_getwd_ospath): return cwd path in the OS path encoding. * file.c (rb_realpath_internal): work in the OS path encoding load.c: cwd encoding * load.c (rb_get_expanded_load_path): save cwd cache in OS path encoding, to get rid of unnecessary conversion and infinite loading when it needs encoding conversion. [ruby-dev:50221] [Bug #13863] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@62784 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32')
-rw-r--r--win32/dir.h1
-rw-r--r--win32/win32.c52
2 files changed, 36 insertions, 17 deletions
diff --git a/win32/dir.h b/win32/dir.h
index b1f981f257..29c4c1c6d5 100644
--- a/win32/dir.h
+++ b/win32/dir.h
@@ -33,6 +33,7 @@ long rb_w32_telldir(DIR *);
void rb_w32_seekdir(DIR *, long);
void rb_w32_rewinddir(DIR *);
void rb_w32_closedir(DIR *);
+char *rb_w32_ugetcwd(char *, int);
#define opendir(s) rb_w32_opendir((s))
#define readdir(d) rb_w32_readdir((d), 0)
diff --git a/win32/win32.c b/win32/win32.c
index 62801dae71..efbe70b481 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4654,43 +4654,61 @@ clock_getres(clockid_t clock_id, struct timespec *sp)
}
/* License: Ruby's */
-char *
-rb_w32_getcwd(char *buffer, int size)
+static char *
+w32_getcwd(char *buffer, int size, UINT cp)
{
- char *p = buffer;
- int len;
+ WCHAR *p;
+ int wlen, len;
- len = GetCurrentDirectory(0, NULL);
+ len = GetCurrentDirectoryW(0, NULL);
if (!len) {
errno = map_errno(GetLastError());
return NULL;
}
- if (p) {
+ if (buffer && size < len) {
+ errno = ERANGE;
+ return NULL;
+ }
+
+ p = ALLOCA_N(WCHAR, len);
+ if (!GetCurrentDirectoryW(len, p)) {
+ errno = map_errno(GetLastError());
+ return NULL;
+ }
+
+ wlen = translate_wchar(p, L'\\', L'/') - p + 1;
+ len = WideCharToMultiByte(cp, 0, p, wlen, NULL, 0, NULL, NULL);
+ if (buffer) {
if (size < len) {
errno = ERANGE;
return NULL;
}
}
else {
- p = malloc(len);
- size = len;
- if (!p) {
+ buffer = malloc(len);
+ if (!buffer) {
errno = ENOMEM;
return NULL;
}
}
+ WideCharToMultiByte(cp, 0, p, wlen, buffer, len, NULL, NULL);
- if (!GetCurrentDirectory(size, p)) {
- errno = map_errno(GetLastError());
- if (!buffer)
- free(p);
- return NULL;
- }
+ return buffer;
+}
- translate_char(p, '\\', '/', filecp());
+/* License: Ruby's */
+char *
+rb_w32_getcwd(char *buffer, int size)
+{
+ return w32_getcwd(buffer, size, filecp());
+}
- return p;
+/* License: Ruby's */
+char *
+rb_w32_ugetcwd(char *buffer, int size)
+{
+ return w32_getcwd(buffer, size, CP_UTF8);
}
/* License: Artistic or GPL */