summaryrefslogtreecommitdiff
path: root/deps/npm/lib/utils/exec.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/lib/utils/exec.js')
-rw-r--r--deps/npm/lib/utils/exec.js20
1 files changed, 15 insertions, 5 deletions
diff --git a/deps/npm/lib/utils/exec.js b/deps/npm/lib/utils/exec.js
index 0fa0371b2..b9a5b6911 100644
--- a/deps/npm/lib/utils/exec.js
+++ b/deps/npm/lib/utils/exec.js
@@ -1,4 +1,3 @@
-
module.exports = exec
exec.spawn = spawn
exec.pipe = pipe
@@ -11,6 +10,7 @@ var log = require("./log.js")
, myGID = process.getgid ? process.getgid() : null
, isRoot = process.getuid && myUID === 0
, constants = require("constants")
+ , uidNumber = require("uid-number")
function exec (cmd, args, env, takeOver, cwd, uid, gid, cb) {
if (typeof cb !== "function") cb = gid, gid = null
@@ -34,6 +34,15 @@ function exec (cmd, args, env, takeOver, cwd, uid, gid, cb) {
log.verbose(uid, "Setting uid from "+myUID)
log.verbose(new Error().stack, "stack at uid setting")
}
+
+ if (uid && gid && (isNaN(uid) || isNaN(gid))) {
+ // get the numeric values
+ return uidNumber(uid, gid, function (er, uid, gid) {
+ if (er) return cb(er)
+ exec(cmd, args, env, takeOver, cwd, uid, gid, cb)
+ })
+ }
+
log.silly(cmd+" "+args.map(JSON.stringify).join(" "), "exec")
var stdout = ""
, stderr = ""
@@ -77,6 +86,7 @@ function pipe (cp1, cp2, cb) {
cb(errState = new Error(
"Failed "+(cp1.name || "<unknown>")+"\nexited with "+code))
})
+
cp2.on("exit", function (code) {
cp2._exited = true
if (errState) return
@@ -94,10 +104,10 @@ function spawn (c, a, env, takeOver, cwd, uid, gid) {
, env : env || process.env
, cwd : cwd || null }
, cp
- if (uid != null) opts.uid = uid
- if (gid != null) opts.gid = gid
- if (!isNaN(opts.uid)) opts.uid = +opts.uid
- if (!isNaN(opts.gid)) opts.gid = +opts.gid
+
+ if (uid && !isNaN(uid)) opts.uid = +uid
+ if (gid && !isNaN(gid)) opts.gid = +gid
+
var name = c +" "+ a.map(JSON.stringify).join(" ")
log.silly([c, a, opts.cwd], "spawning")
cp = child_process.spawn(c, a, opts)