1
0
mirror of https://github.com/danog/file.git synced 2024-11-26 11:54:54 +01:00

Fix mode to flags parsing

This commit is contained in:
Aaron Piotrowski 2017-05-12 15:38:03 -05:00
parent 1f264d949e
commit b8c3321533

View File

@ -54,21 +54,12 @@ class EioDriver implements Driver {
* {@inheritdoc}
*/
public function open(string $path, string $mode): Promise {
switch ($mode) {
case "r": $flags = \EIO_O_RDONLY; break;
case "r+": $flags = \EIO_O_RDWR; break;
case "w": $flags = \EIO_O_WRONLY | \EIO_O_CREAT; break;
case "w+": $flags = \EIO_O_RDWR | \EIO_O_CREAT; break;
case "a": $flags = \EIO_O_WRONLY | \EIO_O_CREAT | \EIO_O_APPEND; break;
case "a+": $flags = \EIO_O_RDWR | \EIO_O_CREAT | \EIO_O_APPEND; break;
case "x": $flags = \EIO_O_WRONLY | \EIO_O_CREAT | \EIO_O_EXCL; break;
case "x+": $flags = \EIO_O_RDWR | \EIO_O_CREAT | \EIO_O_EXCL; break;
case "c": $flags = \EIO_O_WRONLY | \EIO_O_CREAT; break;
case "c+": $flags = \EIO_O_RDWR | \EIO_O_CREAT; break;
default: return new Failure(new FilesystemException(
"Invalid open mode"
));
try {
$flags = $this->parseMode($mode);
} catch (\Throwable $exception) {
return new Failure($exception);
}
$chmod = ($flags & \EIO_O_CREAT) ? 0644 : 0;
($this->incrementor)(1);
$deferred = new Deferred;
@ -78,6 +69,26 @@ class EioDriver implements Driver {
return $deferred->promise();
}
private function parseMode(string $mode): int {
$mode = \str_replace(['b', 't'], '', $mode);
switch ($mode) {
case 'r': return \EIO_O_RDONLY;
case 'r+': return \EIO_O_RDWR;
case 'w': return \EIO_O_WRONLY | \EIO_O_TRUNC | \EIO_O_CREAT;
case 'w+': return \EIO_O_RDWR | \EIO_O_TRUNC | \EIO_O_CREAT;
case 'a': return \EIO_O_WRONLY | \EIO_O_APPEND | \EIO_O_CREAT;
case 'a+': return \EIO_O_RDWR | \EIO_O_APPEND | \EIO_O_CREAT;
case 'x': return \EIO_O_WRONLY | \EIO_O_CREAT | \EIO_O_EXCL;
case 'x+': return \EIO_O_RDWR | \EIO_O_CREAT | \EIO_O_EXCL;
case 'c': return \EIO_O_WRONLY | \EIO_O_CREAT;
case 'c+': return \EIO_O_RDWR | \EIO_O_CREAT;
default:
throw new FilesystemException('Invalid file mode');
}
}
private function onOpenHandle($openArr, $result, $req) {
list($mode, $path, $deferred) = $openArr;
if ($result === -1) {