Windows: Add a custom implementation for utime().
authorJohannes Sixt <johannes.sixt@telecom.at>
Fri, 7 Sep 2007 11:05:00 +0000 (13:05 +0200)
committerJohannes Sixt <johannes.sixt@telecom.at>
Thu, 26 Jun 2008 06:45:11 +0000 (08:45 +0200)
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>
compat/mingw.c
compat/mingw.h

index 6b742873da066b6e48e14519cb6f2ed42e5fc524..2e4755544320b78e71e00a187b95973079be9054 100644 (file)
@@ -155,6 +155,33 @@ int mingw_fstat(int fd, struct stat *buf)
        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)
 {
        Sleep(seconds*1000);
index 69b1dde3ca07bdb695eb5c87f124ec3b9a34b714..92e9273dd50a29bf8e2f7769ab7ea2256eeb471b 100644 (file)
@@ -168,6 +168,9 @@ int mingw_fstat(int fd, struct stat *buf);
 #define lstat mingw_lstat
 #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);
 void mingw_execvp(const char *cmd, char *const *argv);
 #define execvp mingw_execvp