| author | |
| committer | |
| log | a6626802f9ee080616064aff0bc3f0f2709488c3 |
| tree | af9a73aa5d9468be58a204c75376e399bd9c3a3d |
| parent | 9505bb74cd0f087f4672d878bf7174273db8c3ae |
| signature |
* 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 | |||
| 5137 | pub 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); |
| 840 | 840 | ||
| 841 | pub const empty_sigset = [_]u32{0} ** sigset_t.len; | 841 | pub const empty_sigset = [_]u32{0} ** sigset_t.len; |
| 842 | 842 | ||
| 843 | pub 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 | |||
| 843 | pub const in_port_t = u16; | 868 | pub const in_port_t = u16; |
| 844 | pub const sa_family_t = u16; | 869 | pub const sa_family_t = u16; |
| 845 | pub const socklen_t = u32; | 870 | pub 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 |
| 811 | 811 | ||
| 812 | pub fn sigaddset(set: *sigset_t, sig: u6) void { | 812 | pub 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 | } |
| 816 | 819 | ||
| 817 | pub fn sigismember(set: *const sigset_t, sig: u6) bool { | 820 | 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 { | ... | @@ -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 | } |
| 1199 | 1202 | ||
| 1203 | pub 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 | |||
| 1200 | test "" { | 1213 | test "" { |
| 1201 | if (builtin.os.tag == .linux) { | 1214 | if (builtin.os.tag == .linux) { |
| 1202 | _ = @import("linux/test.zig"); | 1215 | _ = @import("linux/test.zig"); |