diff --git a/doc/api.txt b/doc/api.txt index 4ea7c5a133..23a697a8fd 100644 --- a/doc/api.txt +++ b/doc/api.txt @@ -138,6 +138,9 @@ Returns the current working directory of the process. +process.getuid(), process.setuid(id)+:: Gets/sets the user identity of the process. (See setuid(2).) ++process.getgid(), process.setgid(id)+:: +Gets/sets the group identity of the process. (See setgid(2).) + +process.chdir(directory)+:: Changes the current working directory of the process. diff --git a/src/node.cc b/src/node.cc index 6df0d6e021..ebf679ada8 100644 --- a/src/node.cc +++ b/src/node.cc @@ -488,6 +488,29 @@ static Handle GetUid(const Arguments& args) { return scope.Close(Integer::New(uid)); } +static Handle GetGid(const Arguments& args) { + HandleScope scope; + int gid = getgid(); + return scope.Close(Integer::New(gid)); +} + + +static Handle SetGid(const Arguments& args) { + HandleScope scope; + + if (args.Length() < 1) { + return ThrowException(Exception::Error( + String::New("setgid requires 1 argument"))); + } + + Local given_gid = args[0]->ToInteger(); + int gid = given_gid->Int32Value(); + int result; + if ((result == setgid(gid)) != 0) { + return ThrowException(Exception::Error(String::New(strerror(errno)))); + } + return Undefined(); +} static Handle SetUid(const Arguments& args) { HandleScope scope; @@ -1034,6 +1057,10 @@ static void Load(int argc, char *argv[]) { NODE_SET_METHOD(process, "cwd", Cwd); NODE_SET_METHOD(process, "getuid", GetUid); NODE_SET_METHOD(process, "setuid", SetUid); + + NODE_SET_METHOD(process, "setgid", SetGid); + NODE_SET_METHOD(process, "getgid", GetGid); + NODE_SET_METHOD(process, "umask", Umask); NODE_SET_METHOD(process, "dlopen", DLOpen); NODE_SET_METHOD(process, "kill", Kill);