ref: 0f3766f44e554d73c7a3d8bab55cc32dc13f1c26
parent: 333472c8c87c11eefb62cb1d5eab4472e5a8d2a9
	author: cinap_lenrek <cinap_lenrek@felloff.net>
	date: Sat Feb 25 18:03:59 EST 2017
	
implement setting atime and mtime in fswstat for unix and windows
--- a/kern/devfs-posix.c
+++ b/kern/devfs-posix.c
@@ -1,5 +1,6 @@
#include "u.h"
#include <sys/types.h>
+#include <sys/time.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
@@ -406,7 +407,14 @@
uif->mode &= ~0777;
uif->mode |= d.mode&0777;
}
-
+	if(~d.atime != 0 || ~d.mtime != 0){+ struct timeval t[2];
+ t[0].tv_sec = ~d.atime != 0 ? d.atime : stbuf->st_atime;
+ t[0].tv_usec = 0;
+ t[1].tv_sec = ~d.mtime != 0 ? d.mtime : stbuf->st_mtime;
+ t[1].tv_usec = 0;
+ utimes(uif->path, t);
+ }
 	if(d.name[0] && strcmp(d.name, lastelem(uif->path)) != 0) {char *base, *newpath;
--- a/kern/devfs-win32.c
+++ b/kern/devfs-win32.c
@@ -61,6 +61,17 @@
return ((t<0)?(-1 - (-t - 1)) : t)/10000000;
}
+static FILETIME
+filetime(ulong ut)
+{+ FILETIME ft;
+ vlong t = (vlong)ut * 10000000LL;
+ t += 116444736000000000LL;
+ ft.dwLowDateTime = t;
+ ft.dwHighDateTime = t >> 32;
+ return ft;
+}
+
static uvlong
pathhash(wchar_t *p)
 {@@ -578,6 +589,29 @@
uif = c->aux;
if(pathtype(uif->path) != TPATH_FILE)
error(Ebadstat);
+	if(~d.atime != 0 || ~d.mtime != 0){+ FILETIME ta, *pta = NULL;
+ FILETIME tm, *ptm = NULL;
+ HANDLE h;
+		if(~d.atime != 0){+ ta = filetime(d.atime);
+ pta = &ta;
+ }
+		if(~d.mtime != 0){+ tm = filetime(d.mtime);
+ ptm = &tm;
+ }
+ if((h = CreateFile(uif->path,
+ FILE_WRITE_ATTRIBUTES,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+			0)) != INVALID_HANDLE_VALUE){+ SetFileTime(h, NULL, pta, ptm);
+ CloseHandle(h);
+ }
+ }
/* change name */
 	if(d.name[0]){wchar_t *base, *newpath;
--
⑨