diff --git a/doc/api/os.markdown b/doc/api/os.markdown index 9202c74914c374..4a7bf6633ec297 100644 --- a/doc/api/os.markdown +++ b/doc/api/os.markdown @@ -10,6 +10,10 @@ Use `require('os')` to access this module. Returns the operating system's default directory for temporary files. +## os.homedir() + +Returns the home directory of the current user. + ## os.endianness() Returns the endianness of the CPU. Possible values are `'BE'` for big endian diff --git a/lib/os.js b/lib/os.js index 4426612285e299..040c8dac916216 100644 --- a/lib/os.js +++ b/lib/os.js @@ -13,6 +13,8 @@ exports.cpus = binding.getCPUs; exports.type = binding.getOSType; exports.release = binding.getOSRelease; exports.networkInterfaces = binding.getInterfaceAddresses; +exports.homedir = binding.getHomeDirectory; + exports.arch = function() { return process.arch; diff --git a/src/node_os.cc b/src/node_os.cc index e29e22973984e7..3abc7ccec15de7 100644 --- a/src/node_os.cc +++ b/src/node_os.cc @@ -11,6 +11,7 @@ #endif // __MINGW32__ #ifdef __POSIX__ +# include // PATH_MAX on Solaris. # include // MAXHOSTNAMELEN on Solaris. # include // gethostname, sysconf # include // MAXHOSTNAMELEN on Linux and the BSDs. @@ -271,6 +272,25 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo& args) { } +static void GetHomeDirectory(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + char buf[PATH_MAX]; + + size_t len = sizeof(buf); + const int err = uv_os_homedir(buf, &len); + + if (err) { + return env->ThrowUVException(err, "uv_os_homedir"); + } + + Local home = String::NewFromUtf8(env->isolate(), + buf, + String::kNormalString, + len); + args.GetReturnValue().Set(home); +} + + void Initialize(Handle target, Handle unused, Handle context) { @@ -284,6 +304,7 @@ void Initialize(Handle target, env->SetMethod(target, "getOSType", GetOSType); env->SetMethod(target, "getOSRelease", GetOSRelease); env->SetMethod(target, "getInterfaceAddresses", GetInterfaceAddresses); + env->SetMethod(target, "getHomeDirectory", GetHomeDirectory); target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "isBigEndian"), Boolean::New(env->isolate(), IsBigEndian())); } diff --git a/test/common.js b/test/common.js index 94d6f2109576b9..cef17d913eaefa 100644 --- a/test/common.js +++ b/test/common.js @@ -10,6 +10,7 @@ exports.fixturesDir = path.join(exports.testDir, 'fixtures'); exports.libDir = path.join(exports.testDir, '../lib'); exports.tmpDirName = 'tmp'; exports.PORT = +process.env.NODE_COMMON_PORT || 12346; +exports.isWindows = process.platform === 'win32'; if (process.env.TEST_THREAD_ID) { // Distribute ports in parallel tests diff --git a/test/parallel/test-os-homedir-no-envvar.js b/test/parallel/test-os-homedir-no-envvar.js new file mode 100644 index 00000000000000..cb4be4e6efcd4e --- /dev/null +++ b/test/parallel/test-os-homedir-no-envvar.js @@ -0,0 +1,30 @@ +'use strict'; +var common = require('../common'); +var assert = require('assert'); +var cp = require('child_process'); +var os = require('os'); +var path = require('path'); + + +if (process.argv[2] === 'child') { + if (common.isWindows) + assert.equal(process.env.USERPROFILE, undefined); + else + assert.equal(process.env.HOME, undefined); + + var home = os.homedir(); + + assert.ok(typeof home === 'string'); + assert.ok(home.indexOf(path.sep) !== -1); +} else { + if (common.isWindows) + delete process.env.USERPROFILE; + else + delete process.env.HOME; + + var child = cp.spawnSync(process.execPath, [__filename, 'child'], { + env: process.env + }); + + assert.equal(child.status, 0); +} diff --git a/test/parallel/test-os.js b/test/parallel/test-os.js index 31b92f7280c6cd..f7fe4634c40dca 100644 --- a/test/parallel/test-os.js +++ b/test/parallel/test-os.js @@ -2,12 +2,13 @@ var common = require('../common'); var assert = require('assert'); var os = require('os'); +var path = require('path'); process.env.TMPDIR = '/tmpdir'; process.env.TMP = '/tmp'; process.env.TEMP = '/temp'; -if (process.platform === 'win32') { +if (common.isWindows) { assert.equal(os.tmpdir(), '/temp'); process.env.TEMP = ''; assert.equal(os.tmpdir(), '/tmp'); @@ -101,3 +102,22 @@ switch (platform) { var EOL = os.EOL; assert.ok(EOL.length > 0); + + +var home = os.homedir(); + +console.log('homedir = ' + home); +assert.ok(typeof home === 'string'); +assert.ok(home.indexOf(path.sep) !== -1); + +if (common.isWindows && process.env.USERPROFILE) { + assert.equal(home, process.env.USERPROFILE); + delete process.env.USERPROFILE; + assert.ok(os.homedir().indexOf(path.sep) !== -1); + process.env.USERPROFILE = home; +} else if (!common.isWindows && process.env.HOME) { + assert.equal(home, process.env.HOME); + delete process.env.HOME; + assert.ok(os.homedir().indexOf(path.sep) !== -1); + process.env.HOME = home; +}