mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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/trunk@35109 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
0b83d3b27b
commit
ff075693c9
3 changed files with 34 additions and 27 deletions
|
@ -1,3 +1,11 @@
|
|||
Thu Mar 22 19:55:08 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.
|
||||
|
||||
Thu Mar 22 13:43:31 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* ext/openssl/ossl_pkey_rsa.c (rsa_generate): fix argument type.
|
||||
|
|
|
@ -150,6 +150,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()
|
||||
|
@ -158,7 +159,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
|
||||
|
@ -306,9 +306,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 *);
|
||||
|
|
|
@ -4433,7 +4433,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
|
||||
/* License: Ruby's */
|
||||
int
|
||||
|
@ -4443,10 +4444,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;
|
||||
}
|
||||
|
@ -4460,17 +4469,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
|
||||
|
||||
/* License: Ruby's */
|
||||
static time_t
|
||||
|
@ -5817,27 +5832,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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue