<?php
function mkperms($perms, $return_as_string = false, $filename = '') {
$perms = explode(',', $perms);
$generated = array('u'=>array(),'g'=>array(),'o'=>array());
if(!empty($filename)) {
$fperms = substr(decoct(fileperms($filename)), 3); // Credits to jchris dot fillionr at kitware dot com
// Fill array $generated
$fperms = str_split($fperms);
$fperms['u'] = $fperms[0]; unset($fperms[0]);
$fperms['g'] = $fperms[1]; unset($fperms[1]);
$fperms['o'] = $fperms[2]; unset($fperms[2]);
foreach($fperms as $key=>$fperm) {
if($fperm >= 4) {
$generated[$key]['r'] = true;
$fperm -= 4;
}
if($fperm >= 2) {
$generated[$key]['w'] = true;
$fperm -= 2;
}
if($fperm >= 1) {
$generated[$key]['x'] = true;
$fperm--;
}
}
}
foreach($perms as $perm) {
if(!preg_match('#^([ugo]*)([\+=-])([rwx]+|[\-])$#i', $perm, $matches)) {
trigger_error('Wrong input format for mkperms'); return 0644;
// Wrong format => generate default
}
$targets = str_split($matches[1]);
$addrem = $matches[2];
$perms_ = str_split($matches[3]);
$fromTheLoop = 0; // To make sure we clear it only once for direct affectation
foreach($targets as $target) {
foreach($perms_ as $perms__) {
if($addrem == '=') {
if(!$fromTheLoop) {
unset($generated[$target]['r']);
unset($generated[$target]['w']);
unset($generated[$target]['x']);
}
$fromTheLoop++;
$addrem = '+';
}
if($perms__ == '-') {
unset($generated[$target]['r']);
unset($generated[$target]['w']);
unset($generated[$target]['x']);
} else {
if($addrem == '+') {
$generated[$target][$perms__] = true;
} elseif($addrem == '-') {
unset($generated[$target][$perms__]);
} elseif($addrem == '=') {
}
}
}
}
}
$generated_chars = array(0, 0, 0);
$corresponding = array('u'=>0, 'g'=>1, 'o'=>2);
$correspondingperms = array('r'=>4, 'w'=>2, 'x'=>1);
foreach($generated as $key=>$generated_) {
foreach($generated_ as $generated__=>$useless) {
$generated_chars[$corresponding[$key]] += $correspondingperms[$generated__];
}
}
if($return_as_string) return implode($generated_chars);
else return base_convert(implode($generated_chars), 8, 10);
}
?>