authorgravatar for git@l4.pmluna <git@l4.pm> 2020-07-22 18:26:27-03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-07-22 17:26:27-04:00
loga6626802f9ee080616064aff0bc3f0f2709488c3
treeaf9a73aa5d9468be58a204c75376e399bd9c3a3d
parent9505bb74cd0f087f4672d878bf7174273db8c3ae
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Add signalfd support (#5322)

* add signalfd_siginfo to linux bits * Cast sigaddset's shift value to u5 * linux: add signalfd4 * os: add signalfd

3 files changed, 53 insertions(+), 1 deletions(-)

lib/std/os.zig+14
...@@ -5133,3 +5133,17 @@ pub fn ioctl_SIOCGIFINDEX(fd: fd_t, ifr: *ifreq) IoCtl_SIOCGIFINDEX_Error!void {...@@ -5133,3 +5133,17 @@ pub fn ioctl_SIOCGIFINDEX(fd: fd_t, ifr: *ifreq) IoCtl_SIOCGIFINDEX_Error!void {
5133 }5133 }
5134 }5134 }
5135}5135}
5136
5137pub fn signalfd(fd: fd_t, mask: *const sigset_t, flags: i32) !fd_t {
5138 const rc = system.signalfd4(fd, mask, flags);
5139 switch (errno(rc)) {
5140 0 => return @intCast(fd_t, rc),
5141 EBADF, EINVAL => unreachable,
5142 ENFILE => return error.SystemFdQuotaExceeded,
5143 ENOMEM => return error.SystemResources,
5144 EMFILE => return error.ProcessResources,
5145 ENODEV => return error.InodeMountFail,
5146 ENOSYS => return error.SystemOutdated,
5147 else => |err| return std.os.unexpectedErrno(err),
5148 }
5149}
lib/std/os/bits/linux.zig+25
...@@ -840,6 +840,31 @@ pub const SIG_IGN = @intToPtr(?Sigaction.sigaction_fn, 1);...@@ -840,6 +840,31 @@ pub const SIG_IGN = @intToPtr(?Sigaction.sigaction_fn, 1);
840840
841pub const empty_sigset = [_]u32{0} ** sigset_t.len;841pub const empty_sigset = [_]u32{0} ** sigset_t.len;
842842
843pub const signalfd_siginfo = extern struct {
844 signo: u32,
845 errno: i32,
846 code: i32,
847 pid: u32,
848 uid: u32,
849 fd: i32,
850 tid: u32,
851 band: u32,
852 overrun: u32,
853 trapno: u32,
854 status: i32,
855 int: i32,
856 ptr: u64,
857 utime: u64,
858 stime: u64,
859 addr: u64,
860 addr_lsb: u16,
861 __pad2: u16,
862 syscall: i32,
863 call_addr: u64,
864 arch: u32,
865 __pad: [28]u8,
866};
867
843pub const in_port_t = u16;868pub const in_port_t = u16;
844pub const sa_family_t = u16;869pub const sa_family_t = u16;
845pub const socklen_t = u32;870pub const socklen_t = u32;
lib/std/os/linux.zig+14-1
...@@ -811,7 +811,10 @@ pub fn sigaction(sig: u6, noalias act: *const Sigaction, noalias oact: ?*Sigacti...@@ -811,7 +811,10 @@ pub fn sigaction(sig: u6, noalias act: *const Sigaction, noalias oact: ?*Sigacti
811811
812pub fn sigaddset(set: *sigset_t, sig: u6) void {812pub fn sigaddset(set: *sigset_t, sig: u6) void {
813 const s = sig - 1;813 const s = sig - 1;
814 (set.*)[@intCast(usize, s) / usize.bit_count] |= @intCast(usize, 1) << (s & (usize.bit_count - 1));814 // shift in musl: s&8*sizeof *set->__bits-1
815 const shift = @intCast(u5, s & (usize.bit_count - 1));
816 const val = @intCast(u32, 1) << shift;
817 (set.*)[@intCast(usize, s) / usize.bit_count] |= val;
815}818}
816819
817pub fn sigismember(set: *const sigset_t, sig: u6) bool {820pub fn sigismember(set: *const sigset_t, sig: u6) bool {
...@@ -1197,6 +1200,16 @@ pub fn ioctl(fd: fd_t, request: u32, arg: usize) usize {...@@ -1197,6 +1200,16 @@ pub fn ioctl(fd: fd_t, request: u32, arg: usize) usize {
1197 return syscall3(.ioctl, @bitCast(usize, @as(isize, fd)), request, arg);1200 return syscall3(.ioctl, @bitCast(usize, @as(isize, fd)), request, arg);
1198}1201}
11991202
1203pub fn signalfd4(fd: fd_t, mask: *const sigset_t, flags: i32) usize {
1204 return syscall4(
1205 .signalfd4,
1206 @bitCast(usize, @as(isize, fd)),
1207 @ptrToInt(mask),
1208 @bitCast(usize, @as(usize, NSIG / 8)),
1209 @intCast(usize, flags),
1210 );
1211}
1212
1200test "" {1213test "" {
1201 if (builtin.os.tag == .linux) {1214 if (builtin.os.tag == .linux) {
1202 _ = @import("linux/test.zig");1215 _ = @import("linux/test.zig");