X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fnt.c;h=2eac6d0341c6d45633e62e3c5bc174f43b776ffb;hb=02f4d2761a98c5cb9d5b423d2361160a5d8c9ee4;hp=0824e2a2ecdb8e5c5efee322c98a6d3631877944;hpb=40402600969429d5253e62c6314a3eebbb21f027;p=chise%2Fxemacs-chise.git.1 diff --git a/src/nt.c b/src/nt.c index 0824e2a..2eac6d0 100644 --- a/src/nt.c +++ b/src/nt.c @@ -28,6 +28,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #define getwd _getwd #include "lisp.h" #undef getwd +#include "buffer.h" #include "systime.h" #include "syssignal.h" @@ -1177,12 +1178,11 @@ sys_rename (const char * oldname, const char * newname) #endif /* 0 */ static FILETIME utc_base_ft; +static long double utc_base; static int init = 0; #if 0 -static long double utc_base; - time_t convert_time (FILETIME ft) { @@ -1216,11 +1216,6 @@ convert_time (FILETIME ft) } #else -#if defined(MINGW) && CYGWIN_VERSION_DLL_MAJOR <= 21 -#define LowPart u.LowPart -#define HighPart u.HighPart -#endif - static LARGE_INTEGER utc_base_li; time_t @@ -1421,7 +1416,7 @@ mswindows_fstat (int desc, struct stat * buf) } else { - buf->st_nlink = info.nNumberOfLinks; + buf->st_nlink = (short) info.nNumberOfLinks; /* Might as well use file index to fake inode values, but this is not guaranteed to be unique unless we keep a handle open all the time (even then there are situations where it is @@ -1432,9 +1427,9 @@ mswindows_fstat (int desc, struct stat * buf) /* MSVC defines _ino_t to be short; other libc's might not. */ if (sizeof (buf->st_ino) == 2) - buf->st_ino = fake_inode ^ (fake_inode >> 16); + buf->st_ino = (unsigned short) (fake_inode ^ (fake_inode >> 16)); else - buf->st_ino = fake_inode; + buf->st_ino = (unsigned short) fake_inode; /* consider files to belong to current user */ buf->st_uid = 0; @@ -1618,7 +1613,7 @@ mswindows_stat (const char * path, struct stat * buf) buf->st_ino = (unsigned short) (fake_inode ^ (fake_inode >> 16)); /* consider files to belong to current user */ - buf->st_uid = buf->st_gid = nt_fake_unix_uid; + buf->st_uid = buf->st_gid = (short) nt_fake_unix_uid; /* volume_info is set indirectly by map_win32_filename */ buf->st_dev = volume_info.serialnum; @@ -2242,6 +2237,83 @@ mswindows_executable_type (const char * filename, int * is_dos_app, 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; +#if 0 + HANDLE fh; +#endif + 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, times); +#endif +} + /* Close the system structures associated with the given file. */ void close_file_data (file_data *p_file)