Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcjihrig <cjihrig@gmail.com>2016-04-07 20:45:40 +0300
committercjihrig <cjihrig@gmail.com>2016-04-13 00:21:29 +0300
commitd6e56fd843895356769774aebe28b0206ea86d35 (patch)
treef39bbec22b661157f70c0a44050ee006e6678385 /src/node_os.cc
parentaba035fb27b14fe561c45540818be6a2bbb9dc9e (diff)
os: add userInfo() method
os.userInfo() calls libuv's uv_os_get_passwd() function. It returns an object containing the current effective user's username, uid, gid, shell, and home directory. On Windows, the uid and gid are -1, and the shell is null. Refs: https://github.com/nodejs/node/issues/5582 PR-URL: https://github.com/nodejs/node/pull/6104 Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src/node_os.cc')
-rw-r--r--src/node_os.cc69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/node_os.cc b/src/node_os.cc
index f432702792f..9a995b3112f 100644
--- a/src/node_os.cc
+++ b/src/node_os.cc
@@ -2,6 +2,7 @@
#include "v8.h"
#include "env.h"
#include "env-inl.h"
+#include "string_bytes.h"
#include <errno.h>
#include <string.h>
@@ -32,6 +33,7 @@ using v8::Context;
using v8::FunctionCallbackInfo;
using v8::Integer;
using v8::Local;
+using v8::Null;
using v8::Number;
using v8::Object;
using v8::String;
@@ -290,6 +292,72 @@ static void GetHomeDirectory(const FunctionCallbackInfo<Value>& args) {
}
+static void GetUserInfo(const FunctionCallbackInfo<Value>& args) {
+ Environment* env = Environment::GetCurrent(args);
+ uv_passwd_t pwd;
+ enum encoding encoding;
+
+ if (args[0]->IsObject()) {
+ Local<Object> options = args[0].As<Object>();
+ Local<Value> encoding_opt = options->Get(env->encoding_string());
+ encoding = ParseEncoding(env->isolate(), encoding_opt, UTF8);
+ } else {
+ encoding = UTF8;
+ }
+
+ const int err = uv_os_get_passwd(&pwd);
+
+ if (err) {
+ return env->ThrowUVException(err, "uv_os_get_passwd");
+ }
+
+ Local<Value> uid = Number::New(env->isolate(), pwd.uid);
+ Local<Value> gid = Number::New(env->isolate(), pwd.gid);
+ Local<Value> username = StringBytes::Encode(env->isolate(),
+ pwd.username,
+ encoding);
+ Local<Value> homedir = StringBytes::Encode(env->isolate(),
+ pwd.homedir,
+ encoding);
+ Local<Value> shell;
+
+ if (pwd.shell == NULL)
+ shell = Null(env->isolate());
+ else
+ shell = StringBytes::Encode(env->isolate(), pwd.shell, encoding);
+
+ uv_os_free_passwd(&pwd);
+
+ if (username.IsEmpty()) {
+ return env->ThrowUVException(UV_EINVAL,
+ "uv_os_get_passwd",
+ "Invalid character encoding for username");
+ }
+
+ if (homedir.IsEmpty()) {
+ return env->ThrowUVException(UV_EINVAL,
+ "uv_os_get_passwd",
+ "Invalid character encoding for homedir");
+ }
+
+ if (shell.IsEmpty()) {
+ return env->ThrowUVException(UV_EINVAL,
+ "uv_os_get_passwd",
+ "Invalid character encoding for shell");
+ }
+
+ Local<Object> entry = Object::New(env->isolate());
+
+ entry->Set(env->uid_string(), uid);
+ entry->Set(env->gid_string(), gid);
+ entry->Set(env->username_string(), username);
+ entry->Set(env->homedir_string(), homedir);
+ entry->Set(env->shell_string(), shell);
+
+ args.GetReturnValue().Set(entry);
+}
+
+
void Initialize(Local<Object> target,
Local<Value> unused,
Local<Context> context) {
@@ -304,6 +372,7 @@ void Initialize(Local<Object> target,
env->SetMethod(target, "getOSRelease", GetOSRelease);
env->SetMethod(target, "getInterfaceAddresses", GetInterfaceAddresses);
env->SetMethod(target, "getHomeDirectory", GetHomeDirectory);
+ env->SetMethod(target, "getUserInfo", GetUserInfo);
target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "isBigEndian"),
Boolean::New(env->isolate(), IsBigEndian()));
}