#include <direct.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <math.h>
#include <errno.h>
#include <ctype.h>
#include <sys/timeb.h>
static int init = 0;
static time_t
-convert_time (FILETIME ft)
+convert_time (FILETIME ft, int *time_nsec)
{
long double ret;
ret = (long double) ft.dwHighDateTime
* 4096.0L * 1024.0L * 1024.0L + ft.dwLowDateTime;
ret -= utc_base;
- return (time_t) (ret * 1e-7L);
+ *time_nsec = (int) fmodl (ret, 1.0e7L) * 100;
+ return (time_t) (ret * 1.0e-7L);
}
static int
buf->st_size += wfd.nFileSizeLow;
/* Convert timestamps to Unix format. */
- buf->st_mtime = convert_time (wfd.ftLastWriteTime);
- buf->st_atime = convert_time (wfd.ftLastAccessTime);
- if (buf->st_atime == 0) buf->st_atime = buf->st_mtime;
- buf->st_ctime = convert_time (wfd.ftCreationTime);
- if (buf->st_ctime == 0) buf->st_ctime = buf->st_mtime;
+ buf->st_mtime = convert_time (wfd.ftLastWriteTime, &buf->st_mtimensec);
+ buf->st_atime = convert_time (wfd.ftLastAccessTime, &buf->st_atimensec);
+ if (buf->st_atime == 0)
+ {
+ buf->st_atime = buf->st_mtime;
+ buf->st_atimensec = buf->st_mtimensec;
+ }
+ buf->st_ctime = convert_time (wfd.ftCreationTime, &buf->st_ctimensec);
+ if (buf->st_ctime == 0)
+ {
+ buf->st_ctime = buf->st_mtime;
+ buf->st_ctimensec = buf->st_mtimensec;
+ }
/* determine rwx permissions */
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
buf->st_size += info.nFileSizeLow;
/* Convert timestamps to Unix format. */
- buf->st_mtime = convert_time (info.ftLastWriteTime);
- buf->st_atime = convert_time (info.ftLastAccessTime);
- if (buf->st_atime == 0) buf->st_atime = buf->st_mtime;
- buf->st_ctime = convert_time (info.ftCreationTime);
- if (buf->st_ctime == 0) buf->st_ctime = buf->st_mtime;
+ buf->st_mtime = convert_time (info.ftLastWriteTime, &buf->st_mtimensec);
+ buf->st_atime = convert_time (info.ftLastAccessTime, &buf->st_atimensec);
+ if (buf->st_atime == 0)
+ {
+ buf->st_atime = buf->st_mtime;
+ buf->st_atimensec = buf->st_mtimensec;
+ }
+ buf->st_ctime = convert_time (info.ftCreationTime, &buf->st_ctimensec);
+ if (buf->st_ctime == 0)
+ {
+ buf->st_ctime = buf->st_mtime;
+ buf->st_ctimensec = buf->st_mtimensec;
+ }
/* determine rwx permissions */
if (info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
}
static time_t
-convert_time (FILETIME ft)
+convert_time (FILETIME ft, int *time_nsec)
{
ULONGLONG tmp;
+ time_t time_sec;
if (!init)
{
return 0;
FILETIME_TO_U64 (tmp, ft);
- return (time_t) ((tmp - utc_base) / 10000000L);
+ tmp -= utc_base;
+ time_sec = (time_t) (tmp / 10000000L);
+ *time_nsec = (tmp - (ULONGLONG) time_sec * 10000000L) * 100L;
+ return time_sec;
}
static void
buf->st_nlink = nlinks;
/* Convert timestamps to Unix format. */
- buf->st_mtime = convert_time (wtime);
- buf->st_atime = convert_time (atime);
- if (buf->st_atime == 0) buf->st_atime = buf->st_mtime;
- buf->st_ctime = convert_time (ctime);
- if (buf->st_ctime == 0) buf->st_ctime = buf->st_mtime;
+ buf->st_mtime = convert_time (wtime, &buf->st_mtimensec);
+ buf->st_atime = convert_time (atime, &buf->st_atimensec);
+ if (buf->st_atime == 0)
+ {
+ buf->st_atime = buf->st_mtime;
+ buf->st_atimensec = buf->st_mtimensec;
+ }
+ buf->st_ctime = convert_time (ctime, &buf->st_ctimensec);
+ if (buf->st_ctime == 0)
+ {
+ buf->st_ctime = buf->st_mtime;
+ buf->st_ctimensec = buf->st_mtimensec;
+ }
/* determine rwx permissions */
if (is_a_symlink && !follow_symlinks)
buf->st_size += info.nFileSizeLow;
/* Convert timestamps to Unix format. */
- buf->st_mtime = convert_time (info.ftLastWriteTime);
- buf->st_atime = convert_time (info.ftLastAccessTime);
- if (buf->st_atime == 0) buf->st_atime = buf->st_mtime;
- buf->st_ctime = convert_time (info.ftCreationTime);
- if (buf->st_ctime == 0) buf->st_ctime = buf->st_mtime;
+ buf->st_mtime = convert_time (info.ftLastWriteTime, &buf->st_mtimensec);
+ buf->st_atime = convert_time (info.ftLastAccessTime, &buf->st_atimensec);
+ if (buf->st_atime == 0)
+ {
+ buf->st_atime = buf->st_mtime;
+ buf->st_atimensec = buf->st_mtimensec;
+ }
+ buf->st_ctime = convert_time (info.ftCreationTime, &buf->st_ctimensec);
+ if (buf->st_ctime == 0)
+ {
+ buf->st_ctime = buf->st_mtime;
+ buf->st_ctimensec = buf->st_mtimensec;
+ }
/* determine rwx permissions */
if (info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)