summaryrefslogtreecommitdiff
path: root/src/process_wrap.cc
diff options
context:
space:
mode:
authorBert Belder <bertbelder@gmail.com>2012-04-27 22:13:00 +0200
committerBert Belder <bertbelder@gmail.com>2012-04-27 22:13:00 +0200
commit55e4d54927536e6f796de87c0ab266a74b9e1c81 (patch)
treeb37849d9e9c20e7b10bf6f4ec9b9622c28a1a7df /src/process_wrap.cc
parent51e66ec4102c64704553c9b646f11454496593ee (diff)
downloadnode-new-55e4d54927536e6f796de87c0ab266a74b9e1c81.tar.gz
Child process: support the `gid` and `uid` options
Diffstat (limited to 'src/process_wrap.cc')
-rw-r--r--src/process_wrap.cc63
1 files changed, 50 insertions, 13 deletions
diff --git a/src/process_wrap.cc b/src/process_wrap.cc
index 6600a044c8..f9651c4bea 100644
--- a/src/process_wrap.cc
+++ b/src/process_wrap.cc
@@ -53,6 +53,8 @@ using v8::TryCatch;
using v8::Context;
using v8::Arguments;
using v8::Integer;
+using v8::Exception;
+using v8::ThrowException;
class ProcessWrap : public HandleWrap {
@@ -98,7 +100,7 @@ class ProcessWrap : public HandleWrap {
Local<Object> js_options = args[0]->ToObject();
- uv_process_options_t options;
+ uv_process_options2_t options;
memset(&options, 0, sizeof(uv_process_options_t));
options.exit_cb = OnExit;
@@ -106,14 +108,16 @@ class ProcessWrap : public HandleWrap {
// TODO is this possible to do without mallocing ?
// options.file
- Local<Value> file_v = js_options->Get(String::New("file"));
+ Local<Value> file_v = js_options->Get(String::NewSymbol("file"));
if (!file_v.IsEmpty() && file_v->IsString()) {
String::Utf8Value file(file_v->ToString());
options.file = strdup(*file);
+ } else {
+ return ThrowException(Exception::TypeError(String::New("Bad argument")));
}
// options.args
- Local<Value> argv_v = js_options->Get(String::New("args"));
+ Local<Value> argv_v = js_options->Get(String::NewSymbol("args"));
if (!argv_v.IsEmpty() && argv_v->IsArray()) {
Local<Array> js_argv = Local<Array>::Cast(argv_v);
int argc = js_argv->Length();
@@ -127,7 +131,7 @@ class ProcessWrap : public HandleWrap {
}
// options.cwd
- Local<Value> cwd_v = js_options->Get(String::New("cwd"));
+ Local<Value> cwd_v = js_options->Get(String::NewSymbol("cwd"));
if (!cwd_v.IsEmpty() && cwd_v->IsString()) {
String::Utf8Value cwd(cwd_v->ToString());
if (cwd.length() > 0) {
@@ -136,7 +140,7 @@ class ProcessWrap : public HandleWrap {
}
// options.env
- Local<Value> env_v = js_options->Get(String::New("envPairs"));
+ Local<Value> env_v = js_options->Get(String::NewSymbol("envPairs"));
if (!env_v.IsEmpty() && env_v->IsArray()) {
Local<Array> env = Local<Array>::Cast(env_v);
int envc = env->Length();
@@ -149,33 +153,66 @@ class ProcessWrap : public HandleWrap {
}
// options.stdin_stream
- Local<Value> stdin_stream_v = js_options->Get(String::New("stdinStream"));
+ Local<Value> stdin_stream_v = js_options->Get(
+ String::NewSymbol("stdinStream"));
if (!stdin_stream_v.IsEmpty() && stdin_stream_v->IsObject()) {
PipeWrap* stdin_wrap = PipeWrap::Unwrap(stdin_stream_v->ToObject());
options.stdin_stream = stdin_wrap->UVHandle();
}
// options.stdout_stream
- Local<Value> stdout_stream_v = js_options->Get(String::New("stdoutStream"));
+ Local<Value> stdout_stream_v = js_options->Get(
+ String::NewSymbol("stdoutStream"));
if (!stdout_stream_v.IsEmpty() && stdout_stream_v->IsObject()) {
PipeWrap* stdout_wrap = PipeWrap::Unwrap(stdout_stream_v->ToObject());
options.stdout_stream = stdout_wrap->UVHandle();
}
// options.stderr_stream
- Local<Value> stderr_stream_v = js_options->Get(String::New("stderrStream"));
+ Local<Value> stderr_stream_v = js_options->Get(
+ String::NewSymbol("stderrStream"));
if (!stderr_stream_v.IsEmpty() && stderr_stream_v->IsObject()) {
PipeWrap* stderr_wrap = PipeWrap::Unwrap(stderr_stream_v->ToObject());
options.stderr_stream = stderr_wrap->UVHandle();
}
// options.windows_verbatim_arguments
-#if defined(_WIN32)
- options.windows_verbatim_arguments = js_options->
- Get(String::NewSymbol("windowsVerbatimArguments"))->IsTrue();
-#endif
+ if (js_options->Get(String::NewSymbol("windowsVerbatimArguments"))->
+ IsTrue()) {
+ options.flags |= UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS;
+ }
+
+ // options.uid
+ Local<Value> uid_v = js_options->Get(String::NewSymbol("uid"));
+ if (uid_v->IsInt32()) {
+ int32_t uid = uid_v->Int32Value();
+ if (uid & ~((uv_uid_t) ~0)) {
+ return ThrowException(Exception::RangeError(
+ String::New("options.uid is out of range")));
+ }
+ options.flags |= UV_PROCESS_SETUID;
+ options.uid = (uv_uid_t) uid;
+ } else if (!uid_v->IsUndefined() && !uid_v->IsNull()) {
+ return ThrowException(Exception::TypeError(
+ String::New("options.uid should be a number")));
+ }
+
+ // options.gid
+ Local<Value> gid_v = js_options->Get(String::NewSymbol("gid"));
+ if (gid_v->IsInt32()) {
+ int32_t gid = gid_v->Int32Value();
+ if (gid & ~((uv_gid_t) ~0)) {
+ return ThrowException(Exception::RangeError(
+ String::New("options.gid is out of range")));
+ }
+ options.flags |= UV_PROCESS_SETGID;
+ options.gid = (uv_gid_t) gid;
+ } else if (!gid_v->IsUndefined() && !gid_v->IsNull()) {
+ return ThrowException(Exception::TypeError(
+ String::New("options.gid should be a number")));
+ }
- int r = uv_spawn(uv_default_loop(), &wrap->process_, options);
+ int r = uv_spawn2(uv_default_loop(), &wrap->process_, options);
if (r) {
SetErrno(uv_last_error(uv_default_loop()));