diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-05-17 15:04:57 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-05-17 15:04:57 +0000 |
commit | 9310a593df470eccac1068f2a70e8707655ec21d (patch) | |
tree | 7d21728599db73aec1eb7d2d9304fe861d811530 | |
parent | 6c29b79807253217c70172260f999c40b26dc49d (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-- | ChangeLog | 8 | ||||
-rw-r--r-- | include/ruby/win32.h | 7 | ||||
-rw-r--r-- | test/ruby/test_file.rb | 20 | ||||
-rw-r--r-- | version.h | 6 | ||||
-rw-r--r-- | win32/win32.c | 49 |
5 files changed, 58 insertions, 32 deletions
@@ -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| @@ -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, <) || - !LocalFileTimeToFileTime(<, 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; } |