Mercurial > hg > xemacs-beta
diff src/nt.c @ 592:4f6ba8f1fb3d
[xemacs-hg @ 2001-05-31 12:03:37 by adrian]
[PATCH] Fix time preservation in (copy-file ...) on native Windows <1yp8gt63.fsf@rapier.ecf.teradyne.com>
author | adrian |
---|---|
date | Thu, 31 May 2001 12:03:39 +0000 |
parents | 190b164ddcac |
children | 47823c2cf014 |
line wrap: on
line diff
--- a/src/nt.c Thu May 31 02:05:18 2001 +0000 +++ b/src/nt.c Thu May 31 12:03:39 2001 +0000 @@ -29,6 +29,8 @@ #include "lisp.h" #undef getwd +#include "buffer.h" + #include "systime.h" #include "syssignal.h" #include "sysproc.h" @@ -1177,6 +1179,7 @@ #endif /* 0 */ static FILETIME utc_base_ft; +static long double utc_base; static int init = 0; #if 0 @@ -2237,6 +2240,81 @@ close_file_data (&executable); } +static void +convert_from_time_t (time_t time, FILETIME * pft) +{ + long double tmp; + + if (!init) + { + /* Determine the delta between 1-Jan-1601 and 1-Jan-1970. */ + SYSTEMTIME st; + + st.wYear = 1970; + st.wMonth = 1; + st.wDay = 1; + st.wHour = 0; + st.wMinute = 0; + st.wSecond = 0; + st.wMilliseconds = 0; + + SystemTimeToFileTime (&st, &utc_base_ft); + utc_base = (long double) utc_base_ft.dwHighDateTime + * 4096 * 1024 * 1024 + utc_base_ft.dwLowDateTime; + init = 1; + } + + /* time in 100ns units since 1-Jan-1601 */ + tmp = (long double) time * 1e7 + utc_base; + pft->dwHighDateTime = (DWORD) (tmp / (4096.0 * 1024 * 1024)); + pft->dwLowDateTime = (DWORD) (tmp - (4096.0 * 1024 * 1024) * + pft->dwHighDateTime); +} + +int +mswindows_utime (Lisp_Object path, struct utimbuf *times) +{ + struct utimbuf deftime; + HANDLE fh; + static FILETIME mtime; + static FILETIME atime; + Extbyte *filename; + + if (times == NULL) + { + deftime.modtime = deftime.actime = time (NULL); + times = &deftime; + } + + LISP_STRING_TO_EXTERNAL (path, filename, Qmswindows_tstr); + /* APA: SetFileTime fails to set mtime correctly (always 1-Jan-1970) */ +#if 0 + /* Need write access to set times. */ + fh = CreateFile (filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, OPEN_EXISTING, 0, NULL); + if (fh) + { + convert_from_time_t (times->actime, &atime); + convert_from_time_t (times->modtime, &mtime); + if (!SetFileTime (fh, NULL, &atime, &mtime)) + { + CloseHandle (fh); + errno = EACCES; + return -1; + } + CloseHandle (fh); + } + else + { + errno = EINVAL; + return -1; + } + return 0; +#else + return utime (filename, ×); +#endif +} + /* Close the system structures associated with the given file. */ void close_file_data (file_data *p_file)