47 lines
945 B
JavaScript
47 lines
945 B
JavaScript
module.exports = isexe;
|
|
isexe.sync = sync;
|
|
|
|
var fs = require('fs');
|
|
|
|
function isexe(path, options, cb) {
|
|
fs.stat(path, function (er, stat) {
|
|
cb(er, er ? false : checkStat(stat, options));
|
|
});
|
|
}
|
|
|
|
function sync(path, options) {
|
|
return checkStat(fs.statSync(path), options);
|
|
}
|
|
|
|
function checkStat(stat, options) {
|
|
return stat.isFile() && checkMode(stat, options);
|
|
}
|
|
|
|
function checkMode(stat, options) {
|
|
var mod = stat.mode;
|
|
var uid = stat.uid;
|
|
var gid = stat.gid;
|
|
|
|
var myUid =
|
|
options.uid !== undefined ?
|
|
options.uid
|
|
: process.getuid && process.getuid();
|
|
var myGid =
|
|
options.gid !== undefined ?
|
|
options.gid
|
|
: process.getgid && process.getgid();
|
|
|
|
var u = parseInt('100', 8);
|
|
var g = parseInt('010', 8);
|
|
var o = parseInt('001', 8);
|
|
var ug = u | g;
|
|
|
|
var ret =
|
|
mod & o ||
|
|
(mod & g && gid === myGid) ||
|
|
(mod & u && uid === myUid) ||
|
|
(mod & ug && myUid === 0);
|
|
|
|
return ret;
|
|
}
|