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;