UNPKG

@zenfs/core

Version:

A filesystem, anywhere

64 lines (63 loc) 1.64 kB
// SPDX-License-Identifier: LGPL-3.0-or-later import { withErrno } from 'kerium'; import * as c from '../constants.js'; export const pattern = /[rwasx]{1,2}\+?/; /** * @internal @hidden */ export function parse(flag) { if (typeof flag == 'number') return flag; if (!pattern.test(flag)) { throw withErrno('EINVAL', 'Invalid flag string: ' + flag); } return toNumber(flag); } /** * @internal @hidden */ export function toString(flag) { let string = flag & c.O_RDONLY ? 'r' : flag & c.O_APPEND ? 'a' : flag & c.O_TRUNC ? 'w' : ''; if (flag & c.O_SYNC) string += 's'; if (flag & c.O_EXCL) string += 'x'; if (flag & c.O_RDWR) string += '+'; return string; } /** * @internal @hidden */ export function toNumber(flag) { if (!flag.includes('r') && !flag.includes('w') && !flag.includes('a')) { throw withErrno('EINVAL', 'Invalid flag string: ' + flag); } let n = flag.includes('r') ? c.O_RDONLY : c.O_CREAT; if (flag.includes('w')) n |= c.O_TRUNC; if (flag.includes('a')) n |= c.O_APPEND; if (flag.includes('+')) n |= c.O_RDWR; else if (!flag.includes('r')) n |= c.O_WRONLY; if (flag.includes('s')) n |= c.O_SYNC; if (flag.includes('x')) n |= c.O_EXCL; return n; } /** * Parses a flag as a mode (W_OK, R_OK, and/or X_OK) * @param flag the flag to parse * @internal @hidden */ export function toMode(flag) { let mode = 0; if (!(flag & c.O_WRONLY)) mode |= c.R_OK; if (flag & c.O_WRONLY || flag & c.O_RDWR) mode |= c.W_OK; return mode; }