diff options
| author | luna <git@l4.pm> | 2020-07-22 18:26:27 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-22 17:26:27 -0400 |
| commit | a6626802f9ee080616064aff0bc3f0f2709488c3 (patch) | |
| tree | af9a73aa5d9468be58a204c75376e399bd9c3a3d /lib/std/os | |
| parent | 9505bb74cd0f087f4672d878bf7174273db8c3ae (diff) | |
| download | zig-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')
| -rw-r--r-- | lib/std/os/bits/linux.zig | 25 | ||||
| -rw-r--r-- | lib/std/os/linux.zig | 15 |
2 files changed, 39 insertions, 1 deletions
diff --git a/lib/std/os/bits/linux.zig b/lib/std/os/bits/linux.zig index 64832673f1..41d681554e 100644 --- a/lib/std/os/bits/linux.zig +++ b/lib/std/os/bits/linux.zig @@ -840,6 +840,31 @@ pub const SIG_IGN = @intToPtr(?Sigaction.sigaction_fn, 1); pub const empty_sigset = [_]u32{0} ** sigset_t.len; +pub const signalfd_siginfo = extern struct { + signo: u32, + errno: i32, + code: i32, + pid: u32, + uid: u32, + fd: i32, + tid: u32, + band: u32, + overrun: u32, + trapno: u32, + status: i32, + int: i32, + ptr: u64, + utime: u64, + stime: u64, + addr: u64, + addr_lsb: u16, + __pad2: u16, + syscall: i32, + call_addr: u64, + arch: u32, + __pad: [28]u8, +}; + pub const in_port_t = u16; pub const sa_family_t = u16; pub const socklen_t = u32; 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"); |
