mirror of https://github.com/lukechilds/node.git
Browse Source
When using require to load a native addon the path must be converted into a long path, otherwise the addon will fail to be loaded on windows if the path is longer than 260 characters. PR-URL: https://github.com/nodejs/node/pull/2965 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Benjamin Gruenbaum <inglor@gmail.com>v4.x
Justin Chase
9 years ago
committed by
James M Snell
4 changed files with 53 additions and 1 deletions
@ -0,0 +1,13 @@ |
|||
#include <node.h> |
|||
#include <v8.h> |
|||
|
|||
void Method(const v8::FunctionCallbackInfo<v8::Value>& args) { |
|||
v8::Isolate* isolate = args.GetIsolate(); |
|||
args.GetReturnValue().Set(v8::String::NewFromUtf8(isolate, "world")); |
|||
} |
|||
|
|||
void init(v8::Local<v8::Object> target) { |
|||
NODE_SET_METHOD(target, "hello", Method); |
|||
} |
|||
|
|||
NODE_MODULE(binding, init); |
@ -0,0 +1,8 @@ |
|||
{ |
|||
'targets': [ |
|||
{ |
|||
'target_name': 'binding', |
|||
'sources': [ 'binding.cc' ] |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,29 @@ |
|||
'use strict'; |
|||
const common = require('../../common'); |
|||
const fs = require('fs'); |
|||
const path = require('path'); |
|||
const assert = require('assert'); |
|||
|
|||
common.refreshTmpDir(); |
|||
|
|||
// make a path that is more than 260 chars long.
|
|||
// Any given folder cannot have a name longer than 260 characters,
|
|||
// so create 10 nested folders each with 30 character long names.
|
|||
var addonDestinationDir = path.resolve(common.tmpDir); |
|||
|
|||
for (var i = 0; i < 10; i++) { |
|||
addonDestinationDir = path.join(addonDestinationDir, 'x'.repeat(30)); |
|||
fs.mkdirSync(addonDestinationDir); |
|||
} |
|||
|
|||
const addonPath = path.join(__dirname, 'build', 'Release', 'binding.node'); |
|||
const addonDestinationPath = path.join(addonDestinationDir, 'binding.node'); |
|||
|
|||
// Copy binary to long path destination
|
|||
var contents = fs.readFileSync(addonPath); |
|||
fs.writeFileSync(addonDestinationPath, contents); |
|||
|
|||
// Attempt to load at long path destination
|
|||
var addon = require(addonDestinationPath); |
|||
assert(addon != null); |
|||
assert(addon.hello() == 'world'); |
Loading…
Reference in new issue