diff options
| author | LemonBoy <thatlemon@gmail.com> | 2019-05-29 09:43:39 +0200 |
|---|---|---|
| committer | LemonBoy <thatlemon@gmail.com> | 2019-05-29 22:38:14 +0200 |
| commit | 399e026cc00af430df66d3d4b77a12fd775973cd (patch) | |
| tree | 1d39ac9f12c3b0f752317a936f990eb902555da2 /std/os.zig | |
| parent | bcdbd8d1697725992cb08eb1c3c59bd63fda6dc7 (diff) | |
| download | zig-399e026cc00af430df66d3d4b77a12fd775973cd.tar.gz zig-399e026cc00af430df66d3d4b77a12fd775973cd.zip | |
Add sigaltstack wrapper in os.zig
Diffstat (limited to 'std/os.zig')
| -rw-r--r-- | std/os.zig | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/std/os.zig b/std/os.zig index be2be92f7d..a7067c8908 100644 --- a/std/os.zig +++ b/std/os.zig @@ -2433,6 +2433,29 @@ pub fn unexpectedErrno(err: usize) UnexpectedError { return error.Unexpected; } +pub const SigaltstackError = error{ + /// The supplied stack size was less than MINSIGSTKSZ. + SizeTooSmall, + + /// Attempted to change the signal stack while it was active. + PermissionDenied, + Unexpected, +}; + +pub fn sigaltstack(ss: ?*stack_t, old_ss: ?*stack_t) SigaltstackError!void { + if (windows.is_the_target or uefi.is_the_target or wasi.is_the_target) + @compileError("std.os.sigaltstack not available for this target"); + + switch (errno(system.sigaltstack(ss, old_ss))) { + 0 => return, + EFAULT => unreachable, + EINVAL => unreachable, + ENOMEM => return error.SizeTooSmall, + EPERM => return error.PermissionDenied, + else => |err| return unexpectedErrno(err), + } +} + test "" { _ = @import("os/darwin.zig"); _ = @import("os/freebsd.zig"); |
