os: add homedir()
authorcjihrig <cjihrig@gmail.com>
Mon, 25 May 2015 15:01:42 +0000 (11:01 -0400)
committercjihrig <cjihrig@gmail.com>
Sat, 6 Jun 2015 02:58:14 +0000 (22:58 -0400)
os.homedir() calls libuv's uv_os_homedir() to retrieve the current
user's home directory.

PR-URL: https://github.com/nodejs/io.js/pull/1791
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Rod Vagg <rod@vagg.org>
doc/api/os.markdown
lib/os.js
src/node_os.cc
test/common.js
test/parallel/test-os-homedir-no-envvar.js [new file with mode: 0644]
test/parallel/test-os.js

index 9202c74..4a7bf66 100644 (file)
@@ -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
index 4426612..040c8da 100644 (file)
--- 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;
index e29e229..3abc7cc 100644 (file)
@@ -11,6 +11,7 @@
 #endif  // __MINGW32__
 
 #ifdef __POSIX__
+# include <limits.h>        // PATH_MAX on Solaris.
 # include <netdb.h>         // MAXHOSTNAMELEN on Solaris.
 # include <unistd.h>        // gethostname, sysconf
 # include <sys/param.h>     // MAXHOSTNAMELEN on Linux and the BSDs.
@@ -271,6 +272,25 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo<Value>& args) {
 }
 
 
+static void GetHomeDirectory(const FunctionCallbackInfo<Value>& 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<String> home = String::NewFromUtf8(env->isolate(),
+                                           buf,
+                                           String::kNormalString,
+                                           len);
+  args.GetReturnValue().Set(home);
+}
+
+
 void Initialize(Handle<Object> target,
                 Handle<Value> unused,
                 Handle<Context> context) {
@@ -284,6 +304,7 @@ void Initialize(Handle<Object> 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()));
 }
index 94d6f21..cef17d9 100644 (file)
@@ -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 (file)
index 0000000..cb4be4e
--- /dev/null
@@ -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);
+}
index 31b92f7..f7fe463 100644 (file)
@@ -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;
+}