Windows: Add a custom implementation for utime().

This is a necessary pendant to our lstat implementation: MSVCRT's
implementations of lstat and utime do some adjustments if daylight
saving time is in effect, but our lstat implementation doesn't do these
adjustments and report the correct UTC time.  With this implementation
we omit the adjustments in utime() as well and always write UTC.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
This commit is contained in:
Johannes Sixt 2007-09-07 13:05:00 +02:00
parent 5411bdc4e4
commit 7c0ffa1cb7
2 changed files with 30 additions and 0 deletions

View File

@ -155,6 +155,33 @@ int mingw_fstat(int fd, struct stat *buf)
return -1; return -1;
} }
static inline void time_t_to_filetime(time_t t, FILETIME *ft)
{
long long winTime = t * 10000000LL + 116444736000000000LL;
ft->dwLowDateTime = winTime;
ft->dwHighDateTime = winTime >> 32;
}
int mingw_utime (const char *file_name, const struct utimbuf *times)
{
FILETIME mft, aft;
int fh, rc;
/* must have write permission */
if ((fh = open(file_name, O_RDWR | O_BINARY)) < 0)
return -1;
time_t_to_filetime(times->modtime, &mft);
time_t_to_filetime(times->actime, &aft);
if (!SetFileTime((HANDLE)_get_osfhandle(fh), NULL, &aft, &mft)) {
errno = EINVAL;
rc = -1;
} else
rc = 0;
close(fh);
return rc;
}
unsigned int sleep (unsigned int seconds) unsigned int sleep (unsigned int seconds)
{ {
Sleep(seconds*1000); Sleep(seconds*1000);

View File

@ -168,6 +168,9 @@ int mingw_fstat(int fd, struct stat *buf);
#define lstat mingw_lstat #define lstat mingw_lstat
#define stat(x,y) mingw_lstat(x,y) #define stat(x,y) mingw_lstat(x,y)
int mingw_utime(const char *file_name, const struct utimbuf *times);
#define utime mingw_utime
pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env); pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env);
void mingw_execvp(const char *cmd, char *const *argv); void mingw_execvp(const char *cmd, char *const *argv);
#define execvp mingw_execvp #define execvp mingw_execvp