summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-17 15:04:57 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-17 15:04:57 +0000
commit9310a593df470eccac1068f2a70e8707655ec21d (patch)
tree7d21728599db73aec1eb7d2d9304fe861d811530
parent6c29b79807253217c70172260f999c40b26dc49d (diff)
merge revision(s) 35109,35110,35651: [Backport #6385]
* win32/win32.c (rb_w32_fstat, rb_w32_fstati64): convert FILETIME to time_t directly, not to be affected by TZ unnecessarily. * win32/win32.c (unixtime_to_filetime): convert time_t to FILETIME simply. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@35678 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--include/ruby/win32.h7
-rw-r--r--test/ruby/test_file.rb20
-rw-r--r--version.h6
-rw-r--r--win32/win32.c49
5 files changed, 58 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog
index d8149c1fee..1aba27ddfd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Fri May 18 00:04:53 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_fstat, rb_w32_fstati64): convert FILETIME
+ to time_t directly, not to be affected by TZ unnecessarily.
+
+ * win32/win32.c (unixtime_to_filetime): convert time_t to FILETIME
+ simply.
+
Wed May 16 01:07:46 2012 Aaron Patterson <aaron@tenderlovemaking.com>
* ext/digest/md5/extconf.rb: use pkg_config for openssl so that
diff --git a/include/ruby/win32.h b/include/ruby/win32.h
index 3d15742dc7..7183d682a3 100644
--- a/include/ruby/win32.h
+++ b/include/ruby/win32.h
@@ -149,6 +149,7 @@ extern DWORD rb_w32_osid(void);
#define getppid() rb_w32_getppid()
#define sleep(x) rb_w32_Sleep((x)*1000)
#define Sleep(msec) (void)rb_w32_Sleep(msec)
+#define fstati64(fd,st) rb_w32_fstati64(fd,st)
#ifdef __BORLANDC__
#define creat(p, m) _creat(p, m)
#define eof() _eof()
@@ -157,7 +158,6 @@ extern DWORD rb_w32_osid(void);
#define tell(h) _tell(h)
#define _open _sopen
#define sopen _sopen
-#define _fstati64(fd,st) rb_w32_fstati64(fd,st)
#undef fopen
#define fopen(p, m) rb_w32_fopen(p, m)
#undef fdopen
@@ -184,7 +184,7 @@ extern DWORD rb_w32_osid(void);
#if SIZEOF_OFF_T == 8
#define off_t __int64
#define stat stati64
-#define fstat(fd,st) _fstati64(fd,st)
+#define fstat(fd,st) fstati64(fd,st)
#if defined(__BORLANDC__)
#define stati64(path, st) rb_w32_stati64(path, st)
#elif !defined(_MSC_VER) || RT_VER < 80
@@ -195,7 +195,6 @@ extern DWORD rb_w32_osid(void);
#else
#define stati64 _stat64
#define _stat64(path, st) rb_w32_stati64(path, st)
-#define _fstati64 _fstat64
#endif
#else
#define stat(path,st) rb_w32_stat(path,st)
@@ -305,9 +304,9 @@ extern int rb_w32_ustati64(const char *, struct stati64 *);
extern int rb_w32_access(const char *, int);
extern int rb_w32_uaccess(const char *, int);
extern char rb_w32_fd_is_text(int);
+extern int rb_w32_fstati64(int, struct stati64 *);
#ifdef __BORLANDC__
-extern int rb_w32_fstati64(int, struct stati64 *);
extern off_t _lseeki64(int, off_t, int);
extern FILE *rb_w32_fopen(const char *, const char *);
extern FILE *rb_w32_fdopen(int, const char *);
diff --git a/test/ruby/test_file.rb b/test/ruby/test_file.rb
index 765458c09e..cab0f26113 100644
--- a/test/ruby/test_file.rb
+++ b/test/ruby/test_file.rb
@@ -181,6 +181,26 @@ class TestFile < Test::Unit::TestCase
}
end
+ def test_utime
+ bug6385 = '[ruby-core:44776]'
+
+ mod_time_contents = Time.at 1306527039
+
+ file = Tempfile.new("utime")
+ file.close
+ path = file.path
+
+ File.utime(File.atime(path), mod_time_contents, path)
+ stats = File.stat(path)
+
+ file.open
+ file_mtime = file.mtime
+ file.close(true)
+
+ assert_equal(mod_time_contents, file_mtime, bug6385)
+ assert_equal(mod_time_contents, stats.mtime, bug6385)
+ end
+
def test_chmod_m17n
bug5671 = '[ruby-dev:44898]'
Dir.mktmpdir('test-file-chmod-m17n-') do |tmpdir|
diff --git a/version.h b/version.h
index 670a5264f0..f199d50806 100644
--- a/version.h
+++ b/version.h
@@ -1,10 +1,10 @@
#define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 215
+#define RUBY_PATCHLEVEL 216
-#define RUBY_RELEASE_DATE "2012-05-16"
+#define RUBY_RELEASE_DATE "2012-05-18"
#define RUBY_RELEASE_YEAR 2012
#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 16
+#define RUBY_RELEASE_DAY 18
#include "ruby/version.h"
diff --git a/win32/win32.c b/win32/win32.c
index 6ea6888e10..e7545fe17a 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4131,7 +4131,8 @@ isUNCRoot(const WCHAR *path)
(dest).st_ctime = (src).st_ctime; \
} while (0)
-#ifdef __BORLANDC__
+static time_t filetime_to_unixtime(const FILETIME *ft);
+
#undef fstat
int
rb_w32_fstat(int fd, struct stat *st)
@@ -4140,10 +4141,18 @@ rb_w32_fstat(int fd, struct stat *st)
int ret = fstat(fd, st);
if (ret) return ret;
+#ifdef __BORLANDC__
st->st_mode &= ~(S_IWGRP | S_IWOTH);
- if (GetFileInformationByHandle((HANDLE)_get_osfhandle(fd), &info) &&
- !(info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
- st->st_mode |= S_IWUSR;
+#endif
+ if (GetFileInformationByHandle((HANDLE)_get_osfhandle(fd), &info)) {
+#ifdef __BORLANDC__
+ if (!(info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
+ st->st_mode |= S_IWUSR;
+ }
+#endif
+ st->st_atime = filetime_to_unixtime(&info.ftLastAccessTime);
+ st->st_mtime = filetime_to_unixtime(&info.ftLastWriteTime);
+ st->st_ctime = filetime_to_unixtime(&info.ftCreationTime);
}
return ret;
}
@@ -4156,17 +4165,23 @@ rb_w32_fstati64(int fd, struct stati64 *st)
int ret = fstat(fd, &tmp);
if (ret) return ret;
+#ifdef __BORLANDC__
tmp.st_mode &= ~(S_IWGRP | S_IWOTH);
+#endif
COPY_STAT(tmp, *st, +);
if (GetFileInformationByHandle((HANDLE)_get_osfhandle(fd), &info)) {
+#ifdef __BORLANDC__
if (!(info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
st->st_mode |= S_IWUSR;
}
+#endif
st->st_size = ((__int64)info.nFileSizeHigh << 32) | info.nFileSizeLow;
+ st->st_atime = filetime_to_unixtime(&info.ftLastAccessTime);
+ st->st_mtime = filetime_to_unixtime(&info.ftLastWriteTime);
+ st->st_ctime = filetime_to_unixtime(&info.ftCreationTime);
}
return ret;
}
-#endif
static time_t
filetime_to_unixtime(const FILETIME *ft)
@@ -5456,27 +5471,11 @@ rb_w32_write_console(uintptr_t strarg, int fd)
static int
unixtime_to_filetime(time_t time, FILETIME *ft)
{
- struct tm *tm;
- SYSTEMTIME st;
- FILETIME lt;
+ ULARGE_INTEGER tmp;
- tm = localtime(&time);
- if (!tm) {
- return -1;
- }
- st.wYear = tm->tm_year + 1900;
- st.wMonth = tm->tm_mon + 1;
- st.wDayOfWeek = tm->tm_wday;
- st.wDay = tm->tm_mday;
- st.wHour = tm->tm_hour;
- st.wMinute = tm->tm_min;
- st.wSecond = tm->tm_sec;
- st.wMilliseconds = 0;
- if (!SystemTimeToFileTime(&st, &lt) ||
- !LocalFileTimeToFileTime(&lt, ft)) {
- errno = map_errno(GetLastError());
- return -1;
- }
+ tmp.QuadPart = ((LONG_LONG)time + (LONG_LONG)((1970-1601)*365.2425) * 24 * 60 * 60) * 10 * 1000 * 1000;
+ ft->dwLowDateTime = tmp.LowPart;
+ ft->dwHighDateTime = tmp.HighPart;
return 0;
}