#include #include #include #include #include #define nodeparam v8::FunctionCallbackInfo namespace fileNode { void nodeOpen(const nodeparam& args) { v8::Isolate* isolate = args.GetIsolate(); if (args.Length() < 2 || !args[0]->IsString() || !args[1]->IsUint32() || ( args.Length() == 3 && !( args[2]->IsUndefined() || args[2]->IsUint32()))) { isolate->ThrowException(v8::Exception::TypeError( v8::String::NewFromUtf8(isolate, "Argument 1 must be a path, 2 must be a number").ToLocalChecked())); return; } v8::String::Utf8Value str(isolate, args[0]); std::string path(*str); int flags = args[1].As()->Value(); if(args.Length() == 3 && args[2]->IsUndefined()) { mode_t mode = args[2].As()->Value(); args.GetReturnValue().Set(open(path.c_str(), flags, mode)); } else { args.GetReturnValue().Set(open(path.c_str(), flags)); } } void nodeClose(const nodeparam& args) { v8::Isolate* isolate = args.GetIsolate(); if (args.Length() < 1 || !args[0]->IsUint32()) { isolate->ThrowException(v8::Exception::TypeError( v8::String::NewFromUtf8(isolate, "Argument 1 must be a file descriptor (number)").ToLocalChecked())); return; } close(args[1].As()->Value()); } void Initialize(v8::Local exports) { NODE_SET_METHOD(exports, "open", nodeOpen); NODE_SET_METHOD(exports, "close", nodeClose); } NODE_MODULE(file_api, Initialize) }