summaryrefslogtreecommitdiff
path: root/src/selection_pipe.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/selection_pipe.zig')
-rw-r--r--src/selection_pipe.zig8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/selection_pipe.zig b/src/selection_pipe.zig
index e1a42962..44cc1709 100644
--- a/src/selection_pipe.zig
+++ b/src/selection_pipe.zig
@@ -202,6 +202,14 @@ pub fn runOne(
if (std.mem.indexOfScalar(u8, command, 0) != null or
std.mem.indexOfScalar(u8, cwd, 0) != null) return fail.k(.spawn);
+ // std's spawn runs no code in the child: this thread's mask, which the
+ // child inherits, is cleared across the fork (only the tty's SIGWINCH is
+ // ever blocked, and its default is to be ignored). A handler resets at
+ // exec by itself, and nothing here is ignored.
+ const none = std.posix.sigemptyset();
+ var kept: std.posix.sigset_t = undefined;
+ std.posix.sigprocmask(std.posix.SIG.SETMASK, &none, &kept);
+ defer std.posix.sigprocmask(std.posix.SIG.SETMASK, &kept, null);
var child = std.process.spawn(io, .{
.argv = &.{ "/bin/sh", "-c", command },
.cwd = if (cwd.len == 0) .inherit else .{ .path = cwd },