From 5dc0ab7acfbb3287b8ddef8527f846b7ce69e401 Mon Sep 17 00:00:00 2001 From: Raymond Hammarling Date: Thu, 6 Aug 2015 23:59:38 +0200 Subject: [PATCH] {a,c,m}time support --- fuse-bindings.cc | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/fuse-bindings.cc b/fuse-bindings.cc index d156f9e..d5fac17 100644 --- a/fuse-bindings.cc +++ b/fuse-bindings.cc @@ -686,6 +686,16 @@ NAN_INLINE static void bindings_set_date (struct timespec *out, Local date out->tv_nsec = ns; } +NAN_INLINE static Local bindings_get_date (time_t *out) { + return NanNew(*out * 1000.0); +} + +NAN_INLINE static void bindings_set_date (time_t *out, Local date) { + double ms = date->NumberValue(); + time_t secs = (time_t)(ms / 1000.0); + *out = secs; +} + NAN_INLINE static void bindings_set_stat (struct stat *stat, Local obj) { if (obj->Has(NanNew("dev"))) stat->st_dev = obj->Get(NanNew("dev"))->NumberValue(); if (obj->Has(NanNew("ino"))) stat->st_ino = obj->Get(NanNew("ino"))->NumberValue(); @@ -696,18 +706,22 @@ NAN_INLINE static void bindings_set_stat (struct stat *stat, Local obj) if (obj->Has(NanNew("rdev"))) stat->st_rdev = obj->Get(NanNew("rdev"))->NumberValue(); if (obj->Has(NanNew("size"))) stat->st_size = obj->Get(NanNew("size"))->NumberValue(); #ifndef _WIN32 - if (obj->Has(NanNew("blksize"))) stat->st_blksize = obj->Get(NanNew("blksize"))->NumberValue(); if (obj->Has(NanNew("blocks"))) stat->st_blocks = obj->Get(NanNew("blocks"))->NumberValue(); + if (obj->Has(NanNew("blksize"))) stat->st_blksize = obj->Get(NanNew("blksize"))->NumberValue(); +#endif #ifdef __APPLE__ if (obj->Has(NanNew("mtime"))) bindings_set_date(&stat->st_mtimespec, obj->Get(NanNew("mtime")).As()); if (obj->Has(NanNew("ctime"))) bindings_set_date(&stat->st_ctimespec, obj->Get(NanNew("ctime")).As()); if (obj->Has(NanNew("atime"))) bindings_set_date(&stat->st_atimespec, obj->Get(NanNew("atime")).As()); +#elif defined(_WIN32) + if (obj->Has(NanNew("mtime"))) bindings_set_date(&stat->st_mtime, obj->Get(NanNew("mtime")).As()); + if (obj->Has(NanNew("ctime"))) bindings_set_date(&stat->st_ctime, obj->Get(NanNew("ctime")).As()); + if (obj->Has(NanNew("atime"))) bindings_set_date(&stat->st_atime, obj->Get(NanNew("atime")).As()); #else if (obj->Has(NanNew("mtime"))) bindings_set_date(&stat->st_mtim, obj->Get(NanNew("mtime")).As()); if (obj->Has(NanNew("ctime"))) bindings_set_date(&stat->st_ctim, obj->Get(NanNew("ctime")).As()); if (obj->Has(NanNew("atime"))) bindings_set_date(&stat->st_atim, obj->Get(NanNew("atime")).As()); #endif -#endif } NAN_INLINE static void bindings_set_statfs (struct statvfs *statfs, Local obj) { // from http://linux.die.net/man/2/stat @@ -1023,7 +1037,11 @@ static void bindings_dispatch (uv_async_t* handle, int status) { return; case OP_UTIMENS: { +#ifdef _WIN32 + time_t *tv = (time_t *) b->data; +#else struct timespec *tv = (struct timespec *) b->data; +#endif Local tmp[] = {NanNew(b->path), bindings_get_date(tv), bindings_get_date(tv + 1), callback}; bindings_call_op(b, b->ops_utimens, 4, tmp); }