summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-03-22 02:23:03 (GMT)
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-03-22 02:23:03 (GMT)
commitc6985abdd175f7e10715990afbdc310796de1c43 (patch)
tree467164ac92d476a2dde438127025ebccbb896654 /win32
parent1e528da90c50447a1b5864afb445c1ee39e1e2cf (diff)
win32.c: name_for_stat
* win32/win32.c (name_for_stat): extract from rb_w32_stat. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50049 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32')
-rw-r--r--win32/win32.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/win32/win32.c b/win32/win32.c
index 012a9a3..ec1ebe4 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4868,6 +4868,7 @@ isUNCRoot(const WCHAR *path)
} while (0)
static time_t filetime_to_unixtime(const FILETIME *ft);
+static WCHAR *name_for_stat(WCHAR *buf, const WCHAR *path);
#undef fstat
/* License: Ruby's */
@@ -5099,10 +5100,8 @@ rb_w32_stat(const char *path, struct stat *st)
static int
wstati64(const WCHAR *path, struct stati64 *st)
{
- const WCHAR *p;
- WCHAR *buf1, *s, *end;
- int len, size;
- int ret;
+ WCHAR *buf1;
+ int ret, size;
VALUE v;
if (!path || !st) {
@@ -5111,6 +5110,23 @@ wstati64(const WCHAR *path, struct stati64 *st)
}
size = lstrlenW(path) + 2;
buf1 = ALLOCV_N(WCHAR, v, size);
+ if (!(path = name_for_stat(buf1, path)))
+ return -1;
+ ret = winnt_stat(path, st);
+ if (v)
+ ALLOCV_END(v);
+
+ return ret;
+}
+
+/* License: Ruby's */
+static WCHAR *
+name_for_stat(WCHAR *buf1, const WCHAR *path)
+{
+ const WCHAR *p;
+ WCHAR *s, *end;
+ int len;
+
for (p = path, s = buf1; *p; p++, s++) {
if (*p == L'/')
*s = L'\\';
@@ -5121,7 +5137,7 @@ wstati64(const WCHAR *path, struct stati64 *st)
len = s - buf1;
if (!len || L'\"' == *(--s)) {
errno = ENOENT;
- return -1;
+ return NULL;
}
end = buf1 + len - 1;
@@ -5134,11 +5150,7 @@ wstati64(const WCHAR *path, struct stati64 *st)
else if (*end == L'\\' || (buf1 + 1 == end && *end == L':'))
lstrcatW(buf1, L".");
- ret = winnt_stat(buf1, st);
- if (v)
- ALLOCV_END(v);
-
- return ret;
+ return buf1;
}
/* License: Ruby's */