aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compat/mingw.c27
-rw-r--r--compat/mingw.h3
2 files changed, 30 insertions, 0 deletions
diff --git a/compat/mingw.c b/compat/mingw.c
index 6b742873d..2e4755544 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -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);
diff --git a/compat/mingw.h b/compat/mingw.h
index 69b1dde3c..92e9273dd 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -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