feature. See also
. The project being documented here (as the example) is the Zig library itself.
linux.sigaction
pub fn sigaction(sig: SIG, noalias act: ?*const Sigaction, noalias oact: ?*Sigaction) usize
File
Code
pub fn sigaction(sig: SIG, noalias act: ?*const Sigaction, noalias oact: ?*Sigaction) usize {
assert(@backingInt(sig) > 0);
assert(@backingInt(sig) < NSIG);
assert(sig != .KILL);
assert(sig != .STOP);
var ksa: k_sigaction = undefined;
var oldksa: k_sigaction = undefined;
const mask_size = @sizeOf(@TypeOf(ksa.mask));
if (act) |new| {
if (native_arch == .hexagon or is_loongarch or is_mips or native_arch == .or1k or is_riscv) {
ksa = .{
.handler = new.handler.handler,
.flags = new.flags,
.mask = new.mask,
};
} else {
// must copy the Sigaction struct
const restorer_fn = if ((new.flags & SA.SIGINFO) != 0) &restore_rt else &restore;
ksa = .{
.handler = new.handler.handler,
.flags = new.flags | SA.RESTORER,
.mask = new.mask,
.restorer = @ptrCast(restorer_fn),
};
}
}
const ksa_arg = if (act != null) @intFromPtr(&ksa) else 0;
const oldksa_arg = if (oact != null) @intFromPtr(&oldksa) else 0;
const result = switch (native_arch) {
.sparc, .sparc64 => syscall5(.rt_sigaction, @backingInt(sig), ksa_arg, oldksa_arg, @intFromPtr(ksa.restorer), mask_size),
else => syscall4(.rt_sigaction, @backingInt(sig), ksa_arg, oldksa_arg, mask_size),
};
if (errno(result) != .SUCCESS) return result;
if (oact) |old| {
old.handler.handler = oldksa.handler;
old.flags = oldksa.flags;
old.mask = oldksa.mask;
}
return 0;
}