aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dir.c7
-rw-r--r--win32/win32.c33
2 files changed, 32 insertions, 8 deletions
diff --git a/dir.c b/dir.c
index 3f25bc576d..3db196fef9 100644
--- a/dir.c
+++ b/dir.c
@@ -1081,6 +1081,7 @@ dir_s_chdir(int argc, VALUE *argv, VALUE obj)
return INT2FIX(0);
}
+#ifndef _WIN32
VALUE
rb_dir_getwd_ospath(void)
{
@@ -1093,10 +1094,7 @@ rb_dir_getwd_ospath(void)
path_guard = Data_Wrap_Struct((VALUE)0, NULL, RUBY_DEFAULT_FREE, NULL);
path = my_getcwd();
DATA_PTR(path_guard) = path;
-#ifdef _WIN32
- cwd = rb_utf8_str_new_cstr(path);
- OBJ_TAINT(cwd);
-#elif defined __APPLE__
+#ifdef __APPLE__
cwd = rb_str_normalize_ospath(path, strlen(path));
OBJ_TAINT(cwd);
#else
@@ -1107,6 +1105,7 @@ rb_dir_getwd_ospath(void)
xfree(path);
return cwd;
}
+#endif
VALUE
rb_dir_getwd(void)
diff --git a/win32/win32.c b/win32/win32.c
index d10081b4ce..a997cb39e4 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4656,7 +4656,7 @@ clock_getres(clockid_t clock_id, struct timespec *sp)
/* License: Ruby's */
static char *
-w32_getcwd(char *buffer, int size, UINT cp)
+w32_getcwd(char *buffer, int size, UINT cp, void *alloc(int, void *), void *arg)
{
WCHAR *p;
int wlen, len;
@@ -4687,7 +4687,7 @@ w32_getcwd(char *buffer, int size, UINT cp)
}
}
else {
- buffer = malloc(len);
+ buffer = (*alloc)(len, arg);
if (!buffer) {
errno = ENOMEM;
return NULL;
@@ -4699,17 +4699,42 @@ w32_getcwd(char *buffer, int size, UINT cp)
}
/* License: Ruby's */
+static void *
+getcwd_alloc(int size, void *dummy)
+{
+ return malloc(size);
+}
+
+/* License: Ruby's */
char *
rb_w32_getcwd(char *buffer, int size)
{
- return w32_getcwd(buffer, size, filecp());
+ return w32_getcwd(buffer, size, filecp(), getcwd_alloc, NULL);
}
/* License: Ruby's */
char *
rb_w32_ugetcwd(char *buffer, int size)
{
- return w32_getcwd(buffer, size, CP_UTF8);
+ return w32_getcwd(buffer, size, CP_UTF8, getcwd_alloc, NULL);
+}
+
+/* License: Ruby's */
+static void *
+getcwd_value(int size, void *arg)
+{
+ VALUE str = *(VALUE *)arg = rb_utf8_str_new(0, size - 1);
+ OBJ_TAINT(str);
+ return RSTRING_PTR(str);
+}
+
+/* License: Ruby's */
+VALUE
+rb_dir_getwd_ospath(void)
+{
+ VALUE cwd = Qnil;
+ w32_getcwd(NULL, 0, CP_UTF8, getcwd_value, &cwd);
+ return cwd;
}
/* License: Artistic or GPL */