import { BufferView } from 'utilium/buffer.js'; import { Stats } from '../node/stats.js'; import { type V_Context } from './contexts.js'; /** * Root inode * @hidden */ export declare const rootIno = 0; declare const Attributes_base: import("memium").StructConstructor>; /** * Extended attributes * @category Internals * @internal */ export declare class Attributes extends Attributes_base { accessor size: number; get byteSize(): number; has(name: string): boolean; get(name: string): Uint8Array | undefined; set(name: string, value: Uint8Array): void; remove(name: string): boolean; copyFrom(other: Attributes): void; keys(): Generator; values(): Generator, void, unknown>; entries(): Generator<(string | Uint8Array)[], void, unknown>; } /** * @internal @hidden */ export interface InodeFields { data?: number; flags?: number; version?: number; } /** * @category Internals * @internal */ export interface InodeLike extends InodeFields { /** * Size of the item in bytes. * For directories/symlinks, this is normally the size of the struct that represents the item. */ size: T; /** * Unix-style file mode (e.g. 0o644) that includes the item type */ mode: T; /** * Time of last access, since epoch */ atimeMs: T; /** * Time of last modification, since epoch */ mtimeMs: T; /** * Time of last time file status was changed, since epoch */ ctimeMs: T; /** * Time of file creation, since epoch */ birthtimeMs: T; /** * The id of the user that owns the file */ uid: T; /** * The id of the group that owns the file */ gid: T; /** * Inode number */ ino: T; /** * Number of hard links */ nlink: T; /** * Extended attributes */ attributes?: Attributes; } /** * @internal @hidden */ export declare const _inode_fields: readonly ["ino", "data", "size", "mode", "flags", "nlink", "uid", "gid", "atimeMs", "birthtimeMs", "mtimeMs", "ctimeMs", "version"]; /** * Represents which version of the `Inode` format we are on. * 1. 58 bytes. The first member was called `ino` but used as the ID for data. * 2. 66 bytes. Renamed the first member from `ino` to `data` and added a separate `ino` field * 3. 72 bytes. Changed the ID fields from 64 to 32 bits and added `flags`. * 4. >= 128 bytes. Added extended attributes. * 5. (current) 4 KiB. Changed flags * @internal @hidden */ export declare const _inode_version = 5; /** * Inode flags * @see `S_*` in `include/linux/fs.h` (around L2325) * @experimental */ export declare enum InodeFlags { /** Writes are synced at once */ Sync = 1, /** Do not update access times */ NoAtime = 2, /** Append-only file */ Append = 4, /** Immutable file */ Immutable = 8, /** removed, but still open directory */ Dead = 16, /** Inode is not counted to quota */ NoQuota = 32, /** Directory modifications are synchronous */ Dirsync = 64, /** Do not update file c/mtime */ NoCMtime = 128, /** Do not truncate: swapon got its bmaps */ SwapFile = 256, /** Inode is fs-internal */ Private = 512, /** Inode has an associated IMA struct */ IMA = 1024, /** Automount/referral quasi-directory */ AutoMount = 2048, /** no suid or xattr security attributes */ NoSec = 4096, /** Direct Access, avoiding the page cache */ DAX = 8192, /** Encrypted file (using fs/crypto/) */ Encrypted = 16384, /** Casefolded file */ CaseFold = 32768, /** Verity file (using fs/verity/) */ Verity = 65536, /** File is in use by the kernel (eg. fs/cachefiles) */ KernelFile = 131072 } /** User visible flags */ export declare const userVisibleFlags = 253951; /** User modifiable flags */ export declare const userModifiableFlags = 229631; declare const Inode_base: import("memium").StructConstructor>; /** * Generic inode definition that can easily be serialized. * @category Internals * @internal */ export declare class Inode extends Inode_base implements InodeLike { constructor(...args: ConstructorParameters | [Readonly>]); accessor data: number; /** For future use */ accessor __data_old: number; accessor size: number; accessor mode: number; accessor nlink: number; accessor uid: number; accessor gid: number; accessor atimeMs: number; accessor birthtimeMs: number; accessor mtimeMs: number; /** * The time the inode was changed. * * This is automatically updated whenever changed are made using `update()`. */ accessor ctimeMs: number; accessor ino: number; /** For future use */ accessor __ino_old: number; accessor flags: number; /** For future use */ protected accessor __after_flags: number; /** * The "version" of the inode/data. * Unrelated to the inode format! */ accessor version: number; /** * Padding up to 128 bytes. * This ensures there is enough room for expansion without breaking the ABI. * @internal */ protected accessor __padding: Uint8Array; accessor attributes: Attributes; /** * Since the attribute data uses dynamic arrays, * it is necessary to add this so attributes can be added. * @internal @hidden */ protected accessor __data: Uint8Array; toString(): string; toJSON(): InodeLike; /** * Handy function that converts the Inode to a Node Stats object. * @deprecated Use `new Stats(inode)` instead. */ toStats(): Stats; /** * Updates the Inode using information from the stats object. Used by file * systems at sync time, e.g.: * - Program opens file and gets a File object. * - Program mutates file. File object is responsible for maintaining * metadata changes locally -- typically in a Stats object. * - Program closes file. File object's metadata changes are synced with the * file system. * @returns whether any changes have occurred. */ update(data?: Partial>): boolean; } export declare function isFile(metadata: { mode: number; }): boolean; export declare function isDirectory(metadata: { mode: number; }): boolean; export declare function isSymbolicLink(metadata: { mode: number; }): boolean; export declare function isSocket(metadata: { mode: number; }): boolean; export declare function isBlockDevice(metadata: { mode: number; }): boolean; export declare function isCharacterDevice(metadata: { mode: number; }): boolean; export declare function isFIFO(metadata: { mode: number; }): boolean; /** * Checks if a given user/group has access to this item * @param access The requested access, combination of `W_OK`, `R_OK`, and `X_OK` * @internal */ export declare function hasAccess($: V_Context, inode: Pick, access: number): boolean; /** * @hidden @internal */ export declare function _chown(stats: Partial, uid: number, gid: number): boolean; export {};