Cross-platform representation of permissions on a file.
On POSIX systems this corresponds to "mode" and on Windows this corresponds to "attributes".
pub const Permissions = std.Options.FilePermissions orelse if (is_windows) enum(std.os.windows.DWORD)
pub const Permissions = std.Options.FilePermissions orelse if (is_windows) enum(std.os.windows.DWORD) {
default_file = 0,
_,
pub const default_dir: @This() = .default_file;
pub const executable_file: @This() = .default_file;
pub const has_executable_bit = false;
const windows = std.os.windows;
pub fn toAttributes(self: @This()) windows.FILE.ATTRIBUTE {
return @bitCast(@backingInt(self));
}
pub fn readOnly(self: @This()) bool {
const attributes = toAttributes(self);
return attributes & windows.FILE_ATTRIBUTE_READONLY != 0;
}
pub fn setReadOnly(self: @This(), read_only: bool) @This() {
const attributes = toAttributes(self);
return @fromBackingInt(@intCast(if (read_only)
attributes | windows.FILE_ATTRIBUTE_READONLY
else
attributes & ~@as(windows.DWORD, windows.FILE_ATTRIBUTE_READONLY)));
}
} else if (std.posix.mode_t != u0) enum(std.posix.mode_t) {
/// This is the default mode given to POSIX operating systems for creating
/// files. `0o666` is "-rw-rw-rw-" which is counter-intuitive at first,
/// since most people would expect "-rw-r--r--", for example, when using
/// the `touch` command, which would correspond to `0o644`. However, POSIX
/// libc implementations use `0o666` inside `fopen` and then rely on the
/// process-scoped "umask" setting to adjust this number for file creation.
default_file = 0o666,
/// This is the default mode given to POSIX operating systems for creating
/// directories. `0o777` is "-rwxrwxrwx" which is counter-intuitive at first,
/// since most people would expect "-rwxr-xr-x", for example, when using
/// the `touch` command, which would correspond to `0o755`.
default_dir = 0o777,
_,
pub const has_executable_bit = native_os != .wasi;
pub const executable_file: @This() = .default_dir;
pub fn toMode(self: @This()) std.posix.mode_t {
return @backingInt(self);
}
pub fn fromMode(mode: std.posix.mode_t) @This() {
return @fromBackingInt(@intCast(mode));
}
/// Returns `true` if and only if no class has write permissions.
pub fn readOnly(self: @This()) bool {
const mode = toMode(self);
return mode & 0o222 == 0;
}
/// Enables write permission for all classes.
pub fn setReadOnly(self: @This(), read_only: bool) @This() {
const mode = toMode(self);
const o222 = @as(std.posix.mode_t, 0o222);
return @fromBackingInt(@intCast(if (read_only) mode & ~o222 else mode | o222));
}
} else enum(u0) {
default_file = 0,
pub const default_dir: @This() = .default_file;
pub const executable_file: @This() = .default_file;
pub const has_executable_bit = false;
}