1
0
mirror of https://github.com/fuse-friends/fuse-native synced 2024-10-27 18:34:01 +00:00

fix utimens

This commit is contained in:
Mathias Buus 2015-03-23 17:17:13 +01:00
parent 54448dbb1c
commit 6631b2ad55

View File

@ -685,6 +685,11 @@ static void *bindings_thread (void *data) {
return NULL; return NULL;
} }
NAN_INLINE static Local<Date> bindings_get_date (struct timespec *out) {
int ms = (out->tv_nsec / 1000);
return NanNew<Date>(out->tv_sec * 1000 + ms);
}
NAN_INLINE static void bindings_set_date (struct timespec *out, Local<Date> date) { NAN_INLINE static void bindings_set_date (struct timespec *out, Local<Date> date) {
double ms = date->NumberValue(); double ms = date->NumberValue();
time_t secs = (time_t)(ms / 1000.0); time_t secs = (time_t)(ms / 1000.0);
@ -716,11 +721,6 @@ NAN_INLINE static void bindings_set_stat (struct stat *stat, Local<Object> obj)
#endif #endif
} }
NAN_INLINE static void bindings_set_utimens (struct timespec tv[2], Local<Object> obj) {
if (obj->Has(NanNew<String>("atime"))) bindings_set_date(&tv[0], obj->Get(NanNew("atime")).As<Date>());
if (obj->Has(NanNew<String>("mtime"))) bindings_set_date(&tv[1], obj->Get(NanNew("mtime")).As<Date>());
}
NAN_INLINE static void bindings_set_statfs (struct statvfs *statfs, Local<Object> obj) { // from http://linux.die.net/man/2/stat NAN_INLINE static void bindings_set_statfs (struct statvfs *statfs, Local<Object> obj) { // from http://linux.die.net/man/2/stat
if (obj->Has(NanNew<String>("bsize"))) statfs->f_bsize = obj->Get(NanNew<String>("bsize"))->Uint32Value(); if (obj->Has(NanNew<String>("bsize"))) statfs->f_bsize = obj->Get(NanNew<String>("bsize"))->Uint32Value();
if (obj->Has(NanNew<String>("frsize"))) statfs->f_frsize = obj->Get(NanNew<String>("frsize"))->Uint32Value(); if (obj->Has(NanNew<String>("frsize"))) statfs->f_frsize = obj->Get(NanNew<String>("frsize"))->Uint32Value();
@ -775,11 +775,6 @@ NAN_METHOD(OpCallback) {
} }
break; break;
case OP_UTIMENS: {
if (args.Length() > 2 && args[2]->IsObject()) bindings_set_utimens((struct timespec *) b->data, args[2].As<Object>());
}
break;
case OP_READLINK: { case OP_READLINK: {
if (args.Length() > 2 && args[2]->IsString()) { if (args.Length() > 2 && args[2]->IsString()) {
NanUtf8String path(args[2]); NanUtf8String path(args[2]);
@ -801,6 +796,7 @@ NAN_METHOD(OpCallback) {
case OP_SETXATTR: case OP_SETXATTR:
case OP_GETXATTR: case OP_GETXATTR:
case OP_READ: case OP_READ:
case OP_UTIMENS:
case OP_WRITE: case OP_WRITE:
case OP_RELEASE: case OP_RELEASE:
case OP_RELEASEDIR: case OP_RELEASEDIR:
@ -1028,8 +1024,9 @@ static void bindings_dispatch (uv_async_t* handle, int status) {
return; return;
case OP_UTIMENS: { case OP_UTIMENS: {
Local<Value> tmp[] = {NanNew<String>(b->path), callback}; struct timespec *tv = (struct timespec *) b->data;
bindings_call_op(b, b->ops_utimens, 2, tmp); Local<Value> tmp[] = {NanNew<String>(b->path), bindings_get_date(tv), bindings_get_date(tv + 1), callback};
bindings_call_op(b, b->ops_utimens, 4, tmp);
} }
return; return;