aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os/linux.zig
diff options
context:
space:
mode:
authorluna <git@l4.pm>2020-07-22 18:26:27 -0300
committerGitHub <noreply@github.com>2020-07-22 17:26:27 -0400
commita6626802f9ee080616064aff0bc3f0f2709488c3 (patch)
treeaf9a73aa5d9468be58a204c75376e399bd9c3a3d /lib/std/os/linux.zig
parent9505bb74cd0f087f4672d878bf7174273db8c3ae (diff)
downloadzig-a6626802f9ee080616064aff0bc3f0f2709488c3.tar.gz
zig-a6626802f9ee080616064aff0bc3f0f2709488c3.zip
Add signalfd support (#5322)
* add signalfd_siginfo to linux bits * Cast sigaddset's shift value to u5 * linux: add signalfd4 * os: add signalfd
Diffstat (limited to 'lib/std/os/linux.zig')
-rw-r--r--lib/std/os/linux.zig15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig
index 3b8df3d173..15d6e53c1e 100644
--- a/lib/std/os/linux.zig
+++ b/lib/std/os/linux.zig
@@ -811,7 +811,10 @@ pub fn sigaction(sig: u6, noalias act: *const Sigaction, noalias oact: ?*Sigacti
pub fn sigaddset(set: *sigset_t, sig: u6) void {
const s = sig - 1;
- (set.*)[@intCast(usize, s) / usize.bit_count] |= @intCast(usize, 1) << (s & (usize.bit_count - 1));
+ // shift in musl: s&8*sizeof *set->__bits-1
+ const shift = @intCast(u5, s & (usize.bit_count - 1));
+ const val = @intCast(u32, 1) << shift;
+ (set.*)[@intCast(usize, s) / usize.bit_count] |= val;
}
pub fn sigismember(set: *const sigset_t, sig: u6) bool {
@@ -1197,6 +1200,16 @@ pub fn ioctl(fd: fd_t, request: u32, arg: usize) usize {
return syscall3(.ioctl, @bitCast(usize, @as(isize, fd)), request, arg);
}
+pub fn signalfd4(fd: fd_t, mask: *const sigset_t, flags: i32) usize {
+ return syscall4(
+ .signalfd4,
+ @bitCast(usize, @as(isize, fd)),
+ @ptrToInt(mask),
+ @bitCast(usize, @as(usize, NSIG / 8)),
+ @intCast(usize, flags),
+ );
+}
+
test "" {
if (builtin.os.tag == .linux) {
_ = @import("linux/test.zig");