You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

65 lines
1.7 KiB

var mkdir = require("mkdirp")
, fs = require("graceful-fs")
, log = require("npmlog")
, chownr = require("chownr")
, npm = require("../npm.js")
, inflight = require("inflight")
// to maintain the cache dir's permissions consistently.
var cacheStat = null
module.exports = function getCacheStat (cb) {
if (cacheStat) return cb(null, cacheStat)
cb = inflight("getCacheStat", cb)
if (!cb) return
fs.stat(npm.cache, function (er, st) {
if (er) return makeCacheDir(cb)
if (!st.isDirectory()) {
log.error("getCacheStat", "invalid cache dir %j", npm.cache)
return cb(er)
}
return cb(null, cacheStat = st)
})
}
function makeCacheDir (cb) {
if (!process.getuid) return mkdir(npm.cache, function (er) {
return cb(er, {})
})
var uid = +process.getuid()
, gid = +process.getgid()
if (uid === 0) {
if (process.env.SUDO_UID) uid = +process.env.SUDO_UID
if (process.env.SUDO_GID) gid = +process.env.SUDO_GID
}
if (uid !== 0 || !process.env.HOME) {
cacheStat = {uid: uid, gid: gid}
return mkdir(npm.cache, afterMkdir)
}
fs.stat(process.env.HOME, function (er, st) {
if (er) {
log.error("makeCacheDir", "homeless?")
return cb(er)
}
cacheStat = st
log.silly("makeCacheDir", "cache dir uid, gid", [st.uid, st.gid])
return mkdir(npm.cache, afterMkdir)
})
function afterMkdir (er, made) {
if (er || !cacheStat || isNaN(cacheStat.uid) || isNaN(cacheStat.gid)) {
return cb(er, cacheStat)
}
if (!made) return cb(er, cacheStat)
// ensure that the ownership is correct.
chownr(made, cacheStat.uid, cacheStat.gid, function (er) {
return cb(er, cacheStat)
})
}
}