aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os
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
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')
-rw-r--r--lib/std/os/bits/linux.zig25
-rw-r--r--lib/std/os/linux.zig15
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");